opencv3.0.0 處理視訊
阿新 • • 發佈:2019-01-14
視訊也是由一幀幀圖片組成的,對視訊的處理實質上還是對於圖片的處理,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; //儲存處理後的影象