我正在使用opencv直接从网络摄像头捕获视频并将其保存到avi文件。我使用了以下代码:
#include "StdAfx.h"
using namespace std;
using namespace cv;
int _tmain()
{
VideoCapture src;
src.open(1);
if(!src.isOpened())
{
cout<<"could not open camera\n";
return -1;
}
else
{
cout<<"camera opened\n";
}
int ex=static_cast<int>(src.get(CV_CAP_PROP_FOURCC));
Size s(Size((int)src.get(CV_CAP_PROP_FRAME_WIDTH),(int)src.get((CV_CAP_PROP_FRAME_HEIGHT))));
VideoWriter out;
out.open("out.avi",ex,20,s);
while(1)
{
Mat im;
src>>im;
imshow("vid",im);
out<<im;
char c;
c=cvWaitKey(50);
if(c==27)
break;
}
system("pause");
}
所有标头都包含在stdafx.h中。 但实际上我得到一个大小为0b的avi文件。怎么解决这个问题?我需要录制网络摄像头视频而不显示。
注意:我是openCV的新手,我使用的是Visual Studio 2010
答案 0 :(得分:2)
运行应用程序而不显示网络摄像头只是删除
imshow("vid",im);
和 out.avi 大小为0,因为您在应用程序运行时打开它(当您打开视频流并在其上书写时),打开您录制的视频,只需关闭应用程序结束对视频的写入然后打开它。
答案 1 :(得分:1)
实际上你的程序中没有逻辑错误。唯一的问题是您用来编写视频的FOUR_CC
编解码器。
当我运行您的代码时,我遇到了与您相同的问题。当我将错误检查添加到out.open()
函数时,我发现了问题。
最有可能的是,avi容器不支持相机的FOUR_CC编解码器。
在使用Windows时,一个不错的选择是在CV_FOURCC_PROMPT
的第二个参数中使用out.open
。
这将打开一个弹出列表框,其中包含可用的不同FOUR_CC编解码器。如果您不知道选择哪一个,请选择Full Frames (Uncompressed)
。它是最兼容的选项,但会增加输出视频文件的大小。
最终代码应如下所示:
if(!out.open("out.avi",CV_FOURCC_PROMPT,20,s))
{
cout<<"Writer Not Opened"<<endl;
return -1;
}