视频也是由一帧帧图片组成的,对视频的处理实质上还是对于图片的处理,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; //保存处理后的图像