您的位置:首页 > 运维架构

OpenCV 调用摄像头录制指定分辨率视频----(解决保存的视频仅有6Kb的问题)

2018-01-10 15:58 651 查看

1.环境信息

win10 系统,VS2012,openCV 2.4.9,支持UVC协议的免驱动720p摄像头

2.问题描述

摄像头最大支持1280x960分辨率,但OpenCV调用的时候默认的分辨率是640x480。

需要调用摄像头录制1280x720的视频。没有报错信息,却发现生成的视频始终只有6Kb,无法播放。

程序如下

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace std;
using namespace cv;
void main()
{
VideoCapture capture(0);

int framecount=0;
int dWidth=1280;
int dHeight=720;
Size frameSize(static_cast<int>(dWidth),static_cast<int>(dHeight));
VideoWriter writer("VideoTest.avi",CV_FOURCC('P','I','M','1'),20,frameSize,true);      //CV_FOURCC('I','Y','U','V')
if (!capture.isOpened())
std::cout<< "Video open failed" << endl;
Mat frame;
while(framecount<=50)
{
capture.read(frame);
writer << frame;
waitKey(30);
framecount=framecount+1;
cout<<"成功写入视频中,当前已写入帧数为: "<<framecount<<endl;

}
capture.release();
writer.release();
return ;
}


3.问题分析

视频只有6KB,是因为只生成了avi文件的头文件,没有真正地写入图像信息。

自然的怀疑是Videowriter()中设置的编码FOURCC的问题

修改不同的编码格式,始终只有6KB。

经过仔细分析,发现问题在于视频尺寸上。

Videowriter的尺寸设置为了1280*720,而capture读取的图像尺寸仍然是默认尺寸,没有修改,所以视频不能正常保存

添加两句修改capture尺寸的即可。

capture.set(CV_CAP_PROP_FRAME_WIDTH,1280);
capture.set(CV_CAP_PROP_FRAME_HEIGHT,720);


修改后部分如下

Mat frame;
capture.set(CV_CAP_PROP_FRAME_WIDTH,1280); capture.set(CV_CAP_PROP_FRAME_HEIGHT,720);
while(framecount<=50)
{
capture.read(frame);
writer << frame;
waitKey(30);
framecount=framecount+1;
cout<<"成功写入视频中,当前已写入帧数为: "<<framecount<<endl;

}
capture.release();
writer.release();
cvDestroyAllWindows();
return ;
}


4.问题总结

openCV 调用摄像头录制视频很简单,但是生成视频只有6Kb这种失误情况,网上讲的不是很多。

所以刚开始以为问题出在视频解码上,花了一些无用功。

虽然是小问题,但记录一下,希望遇到同样情况的朋友可以参考一下,少花些功夫。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OpenCV VS2012 生成视频