3

我正在使用 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 中。但实际上我得到了一个大小为 0bite 的 avi 文件。如何解决这个问题?我需要录制网络摄像头视频而不显示。


注意:我是 openCV 的新手,我正在使用 Visual Studio 2010

4

2 回答 2

2

运行应用程序而不显示网络摄像头只需删除

imshow("vid",im);

out.avi大小为 0 因为您在应用程序运行时打开它(当您打开视频流并在其上写入时),要打开您录制的视频,只需关闭应用程序以结束对视频的写入然后打开它 。

于 2013-01-04T20:03:43.440 回答
1

实际上,您的程序中没有逻辑错误。唯一的问题是FOUR_CC您用于编写视频的编解码器。

当我运行你的代码时,我遇到了和你一样的问题。当我将错误检查添加到out.open()函数中时,我发现了问题。

最有可能的是,avi 容器不支持相机的 FOUR_CC 编解码器。

当您使用 Windows 时,一个不错的选择是CV_FOURCC_PROMPTout.open.

这将打开一个弹出列表框,其中包含可用的不同 FOUR_CC 编解码器。如果您不知道该选择哪一个,只需选择Full Frames (Uncompressed)。这是最兼容的选项,但会增加输出视频文件的大小。

最终代码应如下所示:

if(!out.open("out.avi",CV_FOURCC_PROMPT,20,s))
{
    cout<<"Writer Not Opened"<<endl;
    return -1;
}
于 2013-01-05T07:54:07.063 回答