11

Logitech C270 (OpenCV 2.4.2/C++) を使用して Ubuntu で単純なカメラ キャプチャを実行すると、次のエラー メッセージが表示されます。

HIGHGUI エラー: V4L/V4L2: VIDIOC_S_CROP

そしてさらに:

破損した JPEG データ: マーカー 0xd1 の前に 2 つの余分なバイト 破損した JPEG データ: マーカー 0xd6 の前に 1 つの余分なバイト 破損した JPEG データ: マーカー 0xd0 の前に 1 つの余分なバイト 破損した JPEG データ: マーカー 0xd0 の前に 1 つの余分なバイト

フレームを取得しますが、Mat オブジェクトへの書き込み時にフレームの幅と高さの値が入れ替わります。以下を参照してください。

Mat frame;
videoCapture = new VideoCapture(camId);
if(!videoCapture->isOpened()) throw Exception();

cout << "Frame width: " << videoCapture->get(CV_CAP_PROP_FRAME_WIDTH) << endl;
cout << "Frame height: " << videoCapture->get(CV_CAP_PROP_FRAME_HEIGHT) << endl;

(*videoCapture) >> frame;

cout << "Mat width: " << frame.rows << endl;
cout << "Mat height: " << frame.cols << endl;

出力:

Frame width: 640
Frame height: 480
Mat width: 480
Mat height: 640
4

5 に答える 5

7

問題をデバッグする気がなく、ウェブカメラからのフレームが問題なく表示されている場合は、メッセンジャーを撃つだけです。以下の手順は、ビルド済みのバイナリをインストールするのではなく、ソースから OpenCV をビルドした場合に機能します。

grep -R "Corrupt JPEG data" ~/src/opencv-2.4.4/必要なものが見つかるまで、最初からウサギの穴に深く入り込みます。私の場合、犯人は次の場所にありopencv-2.4.4/thirdparty/libjpeg/jdmarker.c:908ます。

  if (cinfo->marker->discarded_bytes != 0) {
    WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);
    cinfo->marker->discarded_bytes = 0;
  }

無関係なデータに関するエラー メッセージが出力されるのは、WARNMS2マクロが原因です。それをコメントアウトし、OpenCV をリビルドして、作業を続けてください。私も C270 を持っていて、Ubuntu 12.04 を実行していますが、上記で説明したことを行うまで、同じしつこいエラー メッセージが表示されました。

于 2013-04-06T15:05:45.413 に答える
5

問題について:

破損した JPEG データ: マーカー 0xd1 の前に 2 つの余分なバイト 破損した JPEG データ: マーカー 0xd6 の前に 1 つの余分なバイト 破損した JPEG データ: マーカー 0xd0 の前に 1 つの余分なバイト 破損した JPEG データ: マーカー 0xd0 の前に 1 つの余分なバイト

問題はlibjpegライブラリにあるようです。なんらかの理由で、OpenCV ライブラリの下で正しく動作しません。JPEG をサポートせずにコンパイルしようとしたところ、この問題は解決しました。

cmake -D CMAKE_BUILD_TYPE=リリース -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_SHARED_LIBS=OFF -D BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D WITH_JPEG=OFF -D WITH_IPP=OFF ..

私のブログですべての詳細を見つけることができます:

http://privateblog.by/linux/opencv-i-corrupt-jpeg-data-na-linux/

于 2016-04-10T16:44:32.137 に答える
2

画像の幅は、列数によって決まります。あなたのコードは

cout << "Mat width: " << frame.cols << endl;
cout << "Mat height: " << frame.rows << endl;

したがって、幅と高さの間にスワップはありません。

于 2013-03-21T16:53:19.397 に答える