1

openCVを使用してLogitechC300Webカメラから単一フレームを取得したいと思います。以下のコードを使用する場合。画像は保存されますが、約50%の場合、エラーが含まれています(画像を参照)。

私は今何時間も検索していますが、何が原因かわからないため、どのキーワードが検索に役立つかわかりません。私にとっては、カメラがまだフレームを更新している間にWebカメラからの画像が読み取られているように見えます(ただし、これは単なる推測です)。標準オプションで同じ問題(ただし頻度は少ない)を生成するuvccaptureをテストしましたが、-mオプションを使用すると問題なく動作します。マンページによると、「キャプチャモードをYUYVキャプチャに切り替えます」です。

だから私の質問は、openCVでもこのモードを使用する方法はありますか?v4l2を直接使用することは避けたいと思います。

VideoCapture cap(0);
if(!cap.isOpened())
cout << "Opening video device failed" << endl;
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1024);
Mat frame;
for(int i = 0; i<50; i++)

{
    stringstream str;
    str << "/home/ubuntu/image" << i<< ".jpg";
    cap >> frame;
    imwrite(str.str(), frame);
    cout << i << endl;
}

return 0;
4

2 に答える 2

2

フレームの幅と高さを設定せずに試しましたか?

必要に応じて、後で画像を再スケーリングすることもできます。デフォルトでは、VideoCaptureから最大の解像度が得られます。

ええ、また、各フレームの前に待つようにしてください:

cv::waitKey(30); // it waits only for 30ms, that could be your fps on the webcam.

編集:

カールフィリップの答えを見てください。

于 2012-11-19T22:42:32.227 に答える
1

ここで、openCVによってフレームがキャプチャされる方法の実装が原因である可能性があることを示す別のスレッドを見つけました。

OpenCVはvideo-4-linux(v4l2)を呼び出して、カメラにRGBフレームを要求します。私のカメラは、v4l2が非常に遅いソフトウェアデコーダーを使用して解凍していたJPEG圧縮画像を配信していました。

私はBeagleBoardを使用していますが、(便利な)openCV関数を使用すると、前述の問題が発生しました。スレッドにリンクされたプログラムMartinFoxを試してみました。このプログラムは、v4l2を使用してWebカメラからYUVフレームを直接取得します。これで、Webカメラのセンサーの解像度を問題なく最大1280x1024ピクセルの画像を取得できます。

于 2012-11-23T21:43:26.363 に答える