V4L2 API を使用して画像をキャプチャし、その画像を opencv Mat に入れようとしています。問題は、私の Web カメラが YUYV (YUY2) でのみキャプチャすることです。そのため、最初に RGB24 に変換する必要があります。これが私が使用している完全な V4L2コードです。
写真の中のオブジェクトは認識できましたが、すべてピンクとグリーンで、横に引き伸ばされて歪んでいます。多くの異なる変換式を試しましたが、同じ基本的なピンク/グリーンの歪んだ画像が得られました。この図に使用されている式はhttp://paulbourke.net/dataformats/yuv/からのものです。Linux で Shotwell フォト ビューアーを使用して .raw 画像を表示しています。gimpで開くことができませんでした。私は画像形式を保存する方法についてそれほど知識がありませんが、何らかのヘッダーが必要であると想定していますが、Shotwell フォト ビューアーは機能しているようです。これが間違った画像の理由である可能性がありますか?
V4l2 が、p が指す符号付きまたは符号なしのバイト イメージを返すかどうかはわかりません。しかし、これが問題である場合、私の画像は単にオフカラーになるのではないでしょうか? しかし、ジオメトリも歪んでいるようです。浮動小数点へのキャストと浮動小数点からのキャストを適切に処理したと思います。
誰かが私を理解するのを手伝ってくれますか
- *void p 変数に含まれる基になる型を見つける方法
- 使用する型の説明を含む、YUYV から RGB24 に変換するための適切な式
- フォーマット (ヘッダー) なしで画像を保存し、Shotwell で表示することが問題になる可能性はありますか?
- RGB24 画像を適切に保存する簡単な方法はありますか?
- 一般的なデバッグのヒント
ありがとう
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);
}