2

OpenGL ES 2.0では、フレームバッファを読み取り、RGBAフレームに変換した後。YUVフォーマットに変換したいです。

このテーブルを使ってみました。アルファコンポーネントを無視します。私がそれをして、YUVフレームがその歪んだものを生成したのを見ると。

誰か助けてくれませんか

yuvdata[i * j *1]= (0.257)*memory[i*j*1] + (0.504)*memory[i*j*2]+(0.098)*memory[i*j*3]+16;
yuvdata[i * j *3]= (0.439)*memory[i*j*1] - (0.368)*memory[i*j*2] -(0.071)*memory[i*j*3]+128;
yuvdata[i * j *2]= -(0.148)*memory[i*j*1] - (0.291)*memory[i*j*2] +(0.439)*memory[i*j*3]+128;

`

正規化はメモリストアrgbaを助けませんでした、そして、yuvはyuvを保存するための空きスペースです

私はアルファコンポーネントを無視してrgbからyuvへの変換を使用しました

友達この問題は解決されました。この記事は素晴らしいyuv2rgbです。ViktorLatypovとMārtiņšMožeikoに感謝します

4

2 に答える 2

1

「YUV」は完全なフォーマットではありません。

このウィキペディアの記事から、YUV411、YUV422、YUV420p から YUV444 への変換を取得できます。これらの変換の逆を RGB 変換と組み合わせると、結果が得られます。

あなたが見逃していること: 1 つの RGB トリプルが、この方法で多数の (1 つではなく) YUV コンポーネントを生成する可能性があります。

  1. YUV444 1 ピクセルあたり 3 バイト
  2. YUV422 2 ピクセルあたり 4 バイト
  3. YUV411 4 ピクセルあたり 6 バイト
  4. YUV420p 4 ピクセルあたり 6 バイト、並べ替え

まず、YUV422

Y'UV422からRGB888への変換

入力: Y'UV (u、y1、v、y2) の 4 バイトを読み取ります

出力:RGB(R、G、B、R、G、B)の6バイトを書き込みます

次にYUV4111

Y'UV411からRGB888への変換

入力: Y'UV の 6 バイトを読み取る

出力: RGB の 12 バイトを書き込みます

// Extract YUV components
u  = yuv[0];
y1 = yuv[1];
y2 = yuv[2];
v  = yuv[3];
y3 = yuv[4];
y4 = yuv[5];
rgb1 = Y'UV444toRGB888(y1, u, v);
rgb2 = Y'UV444toRGB888(y2, u, v);
rgb3 = Y'UV444toRGB888(y3, u, v);
rgb4 = Y'UV444toRGB888(y4, u, v);

420p と同様ですが、YUV 値は四角形全体に分散されます。Wikipedia の図と画像を参照してください。

基本的に、4 つの RGB ピクセルをフェッチし、それぞれを YUV に変換し (有効な 444 コンバーターを使用して)、ウィキペディアに示されているトリッキーな方法で YUV[4] 配列を保存する必要があります。

于 2012-06-27T08:26:53.323 に答える
0

メモリ配列に正しくアクセスしていますか? 次のようなものではないでしょうか。

R=memory[(i*width + j)*4+0]
G=memory[(i*width + j)*4+1]
B=memory[(i*width + j)*4+3]

または、BGRA がある場合は、0 を 3 と交換します。

于 2012-06-27T08:05:14.553 に答える