版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/love_image_xie/article/details/87286928
主要使用VideoCapture类读视频,VideoWriter类写视频,这两个类在highgui头文件中。
读视频有两种方法。
//方法一
VideoCapture capture;
// 读取视频文件
capture.open("..\\images\\car.avi");
// 判断视频流读取是否正确
if(!capture.isOpened())
{
std::cout << "fail to open video!" << std::endl;
return -1;
}
//方法二
string inputPath = "..\\images\\car.avi";
//视频读入
VideoCapture capture(inputPath);
具体使用如下:
int main()
{
string inputPath = "E:\\研究生\\学习材料\\学习书籍\\OpenCV图像处理编程实例-源码-20160801\\《OpenCV图像处理编程实例-源码-20160801\\images\\car.avi";
string outPath = "E:\\研究生\\学习材料\\学习书籍\\OpenCV图像处理编程实例-源码-20160801\\《OpenCV图像处理编程实例-源码-20160801\\images\\carTest.avi";
//视频读入
VideoCapture input(inputPath);
// 判断视频流读取是否正确
if (!input.isOpened())
return -1;
VideoWriter output;
//获取视频分辨率
Size videoResolution = Size((int)input.get(CV_CAP_PROP_FRAME_WIDTH),(int)input.get(CV_CAP_PROP_FRAME_HEIGHT));
//获取帧率
double fps = input.get(CV_CAP_PROP_FPS);
cout << "fps: " << fps << endl;
//获取总帧数
cout << "total Frame: " << input.get(CV_CAP_PROP_FRAME_COUNT)<<endl;
//获取宽高
cout << "Resolution: " << videoResolution.width << videoResolution.height << endl;
output.open(outPath, -1, 25, videoResolution, true);
if (!output.isOpened())
return -1;
Mat frameImg;
int count=0;
vector<Mat> rgb;
Mat result;
for (int i = 0; i < 300; i++)
{
input >> frameImg;
//视频帧结束判断
if (!frameImg.empty())
{
count++;
imshow("frameImg", frameImg);
split(frameImg, rgb);
for (int j = 0; j < 3; j++)
{
if (j != 1)
rgb[j] = Mat::zeros(videoResolution, rgb[1].type());
}
merge(rgb, result);
imshow("result", result);
output << result;
}
else
break;
if (char(waitKey(1)) == 'q')
{
input.release();
output.release();
break;
}
}
cout << "count: " << count << endl;
input.release();
output.release();
return 0;
}