1. 程式人生 > >opencv3.0.0 處理視訊

opencv3.0.0 處理視訊

視訊也是由一幀幀圖片組成的,對視訊的處理實質上還是對於圖片的處理,opencv中可以很容易從視訊中獲得一幀影象,從而經過處理,達到處理整個視訊的效果。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;


int main() 
{

  cv::VideoCapture cap;

  cap.open(string("testvideo.mp4"));
  double fps = cap.get(CV_CAP_PROP_FPS);
  cv::Size size(
	  (int)cap.get(CV_CAP_PROP_FRAME_WIDTH),
	  (int)cap.get(CV_CAP_PROP_FRAME_HEIGHT)
	  );


  cv::Mat frame;
  cv::Mat out;

  cv::VideoWriter writer;
  writer.open("F:\\ebook\\opencv\\LearningOpenCV3\\test\\test\\result.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, size);

  for(;;) {

    cap >> frame;

    if( frame.empty() ) break; // Ran out of film

	cv::Mat frame_gray;
	
	cv::cvtColor(frame, frame_gray, cv::COLOR_BGR2GRAY);
	cv::Canny(frame_gray, out, 10, 150, 3, true);
    cv::imshow( "process", out );

	writer << out;    //儲存處理後的影象

    if( (char)cv::waitKey(30) >= 0 ) break;

  }

  cap.release();
  writer.release();

  return 0;

}

程式執行中出現了一個問題,出現異常中斷,但是確認程式碼無誤,提示資訊如下:

Unhandled exception at 0x76EFC54F in test.exe: Microsoft C++ exception: cv::Exception at memory location 0x003DF954.

多上述程式多了一些修改,程式如下:

#include <opencv.hpp>
#include <iostream>

using namespace std;


int main()
{

	cv::VideoCapture cap;

	cap.open(string("testvideo.mp4"));
	if (!cap.isOpened())
	{
		cout<<("視訊打開出錯!")<<endl;
		return -1;
	}

	double fps = cap.get(CV_CAP_PROP_FPS);
	cv::Size size(
		(int)cap.get(CV_CAP_PROP_FRAME_WIDTH),
		(int)cap.get(CV_CAP_PROP_FRAME_HEIGHT)
		);


	cv::Mat frame;
	cv::Mat out;

	cv::VideoWriter writer;
	writer.open("F:\\ebook\\opencv\\LearningOpenCV3\\test\\test\\result.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, size);
	if (!writer.isOpened())
	{
		cout << ("建立視訊出錯!") << endl;
		return -2;
	}
	
	for (;;) {

		cap >> frame;

		if (frame.empty()) break; // Ran out of film

		cv::Mat frame_gray;

		cv::cvtColor(frame, frame_gray, cv::COLOR_BGR2GRAY);
		cv::Canny(frame_gray, out, 10, 150, 3, true);
		cv::imshow("process", out);

		

    writer << out;    //儲存處理後的影象

		if ((char)cv::waitKey(30) >= 0) break;

	}

	cap.release();
	writer.release();

	return 0;

}

異常還是存在,提示資訊如下:

Unhandled exception at 0x76A6C54F in test.exe: Microsoft C++ exception: cv::Exception at memory location 0x0045F9E8.

單步執行,出錯程式碼為:

writer << out;    //儲存處理後的影象