3

V4L2 API を使用して画像をキャプチャし、その画像を opencv Mat に入れようとしています。問題は、私の Web カメラが YUYV (YUY2) でのみキャプチャすることです。そのため、最初に RGB24 に変換する必要があります。これが私が使用している完全な V4L2コードです。

写真の中のオブジェクトは認識できましたが、すべてピンクとグリーンで、横に引き伸ばされて歪んでいます。多くの異なる変換式を試しましたが、同じ基本的なピンク/グリーンの歪んだ画像が得られました。この図に使用されている式はhttp://paulbourke.net/dataformats/yuv/からのものです。Linux で Shotwell フォト ビューアーを使用して .raw 画像を表示しています。gimpで開くことができませんでした。私は画像形式を保存する方法についてそれほど知識がありませんが、何らかのヘッダーが必要であると想定していますが、Shotwell フォト ビューアーは機能しているようです。これが間違った画像の理由である可能性がありますか?

V4l2 が、p が指す符号付きまたは符号なしのバイト イメージを返すかどうかはわかりません。しかし、これが問題である場合、私の画像は単にオフカラーになるのではないでしょうか? しかし、ジオメトリも歪んでいるようです。浮動小数点へのキャストと浮動小数点からのキャストを適切に処理したと思います。

誰かが私を理解するのを手伝ってくれますか

  1. *void p 変数に含まれる基になる型を見つける方法
  2. 使用する型の説明を含む、YUYV から RGB24 に変換するための適切な式
  3. フォーマット (ヘッダー) なしで画像を保存し、Shotwell で表示することが問題になる可能性はありますか?
  4. RGB24 画像を適切に保存する簡単な方法はありますか?
  5. 一般的なデバッグのヒント

ありがとう

static unsigned char   *bgr_image;

static void process_image(void *p, int size)
{
    frame_number++;
    char filename[15];
    sprintf(filename, "frame-%d.raw", frame_number);
    FILE *fp=fopen(filename,"wb");

    int i;
    float y1, y2, u, v;
    char * bgr_p = bgr_image;
    unsigned char * p_tmp = (unsigned char *) p;

    for (i=0; i < size; i+=4) {

      y1 = p_tmp[i];
      u = p_tmp[i+1];
      y2 = p_tmp[i+2];
      v = p_tmp[i+3];

      bgr_p[0] = (y1 + 1.371*(u - 128.0));
      bgr_p[1] = (y1 - 0.698*(u - 128.0) - 0.336*(v - 128.0));
      bgr_p[2] = (y1 + 1.732*(v - 128.0));
      bgr_p[3] = (y2 + 1.371*(v - 128.0));
      bgr_p[4] = (y2 - 0.698*(v - 128.0) - 0.336*(u - 128.0));
      bgr_p[5] = (y2 + 1.732*(u - 128.0));

      bgr_p+=6;
    }

    fwrite(bgr_image, size, 1, fp);                                       
    fflush(fp);
    fclose(fp);
}
4

2 に答える 2

2

まず、作業している YUV422 のタイプを理解する必要があります。

PIX_FMT_YUYV422,   ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
PIX_FMT_UYVY422,   ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1

それに応じて y1、u、y2、および v を置き換えてみてください。ただし、YUV422 をまったく扱っていない可能性があります。画像は、期待するパック形式ではなく、平面である可能性があります。

生の yuv ファイルを開く機能を備えた IrfanViewer をダウンロードし、正しい値を選択して正しくデコードされた画像を取得し、使用しているデータの種類を見つけることをお勧めします。

于 2013-06-11T05:41:59.450 に答える