web-dev-qa-db-ja.com

openCV 2.4.3を使用してLogitech C920から30fpsで1080pをキャプチャする

OpenCVでLogitech C920からビデオストリームをキャプチャしようとしています。 Labviewを使用すると、30fps 1080pでMJPGストリームにアクセスできます。 opencvでは、5fpsまたは640x480に制限されています。

カメラの設定に関連するコードは次のとおりです。

this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));

これらはすべて1を返しますが、YUY2ストリームに対応する1080pの5fpsストリームを取得します。
次の行を追加すると:

this->camRef.set(CV_CAP_PROP_FPS, 30);

これは0を返します。640x480で30 fpsのストリームを取得します。私には、MJPG設定が受け入れられないように見えますが、どうすればよいか、それを修正する方法がわかりません。

編集:以下はプログラムをクラッシュさせます。

 this->camRef.read(this->image);
 std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)                            << std::endl;
 std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, config.width)         << std::endl;
 std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, config.height)       << std::endl;
 std::cout<< this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')) << std::endl;
 std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)                            << std::endl;

次に、実行コードに次のようにします。

void camera::run()
{
    while(true)
    {
        if(this->camRef.read(this->image) == 0)
        {
           if(this->capture)
            {
                cv::imwrite(fileName,this->image);
                this->count++;
            }
        }
        msleep(15);
    }
}

EDIT2:解決策は、カメラの高さと幅を設定する前にfourCCコーデックを設定することです。

21
Daniel Moodie

投稿の作成者は既に解決策を見つけましたが、回答として追加しなかったので、ここに解決策を示します。

必要な解像度を設定する前に、コーデックを設定する必要があります。

this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
12
ns130291

logitech c922での作業、必要:

capture.open(CV_CAP_DSHOW);
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
2
Nate B

何かを設定する前に、キャプチャから最初のフレームを取得するようにしてください:

VideoCapture cap(0);
if(!cap.isOpened()) 
return -1;  

Mat frame;
cap >> frame;
double fps;
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080.0);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920.0);
//add the loop here

mJPGを設定しなくても機能するかどうかを確認します。動作する場合は、MJPGで試してください。

私にとって、何かを設定する前に最初のフレームを取得する必要があるのは少し奇妙ですが、それが私のために機能する唯一の方法です(Windows 7 32ビット)。



// edit:
あなたは別のAPIを使用しようとする可能性があります-私の回答の2番目の部分をここで参照してください: https://stackoverflow.com/a/14188280/1598485 OpenCVは最高のAPIを使用しようとしていますデフォルトですが、おそらくあなたの場合、他のいくつかのAPIがよりうまく機能します。

1
cyriel