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コーデックを設定することです。
投稿の作成者は既に解決策を見つけましたが、回答として追加しなかったので、ここに解決策を示します。
必要な解像度を設定する前に、コーデックを設定する必要があります。
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);
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);
何かを設定する前に、キャプチャから最初のフレームを取得するようにしてください:
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がよりうまく機能します。