3

私はopencvを使用して、Webカメラから直接ビデオをキャプチャし、それを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を初めて使用し、VisualStudio2010を使用しています。

4

2 に答える 2

2

ウェブカメラを表示せずにアプリケーションを実行するには、削除するだけです

imshow("vid",im);

そして、out.aviのサイズは0です。これは、アプリケーションの実行中に開くため(ビデオストリームを開いて書き込むとき)、録画したビデオを開くには、アプリケーションを閉じてビデオへの書き込みを終了してから、それを開く 。

于 2013-01-04T20:03:43.440 に答える
1

実際には、プログラムに論理的なエラーはありません。唯一の問題はFOUR_CC、ビデオの作成に使用しているコーデックです。

私があなたのコードを実行したとき、私はあなたとまったく同じ問題に直面しました。out.open()関数にエラーチェックを追加したところ、問題が見つかりました。

ほとんどの場合、カメラのFOUR_CCコーデックはaviコンテナでサポートされていません。

Windowsを使用CV_FOURCC_PROMPTしているので、の2番目の引数で使用することをお勧めしますout.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 に答える