質問

私は困を表示する原YUVファイルではNV12形式です。

で表示選択したフレームしているが、まだまだ主に白黒一色合いのピンクやグリーン。

ここではどのように私の出力のように見え alt text

なっこちらかプログラムです。(これはcocoa/objective-cが使いたいと思いましたの専門家によるアドバイスをプログラムのアルゴリズムではなく、構文です。)

前にプログラムの実行のYUVファイルに格納されたバイナリという名前のファイル"test.yuv".ファイルはNV12形式と意味のプランを保存してから、紫外線のプランはインタレース.私のファイルを抽出して問題なしでしたので、だいじょうぶかと思い検査します。

中を開始し、私が作成したルックアップテーブルに変換してくれるバイナリ/8噛/byte/charへの尊敬されるY,U,Vのfloat値

のY平面これが私のコード

-(void)createLookupTableY //creates a lookup table for converting a single byte into a float between 0 and 1
{
    NSLog(@"YUVFrame: createLookupTableY");
    lookupTableY = new float [256];

    for (int i = 0; i < 256; i++)
    {
        lookupTableY[i] = (float) i /255;
        //NSLog(@"lookupTableY[%d]: %f",i,lookupTableY[i]);//prints out the value of each float
    }
}

U面のルックアップテーブル

-(void)createLookupTableU //creates a lookup table for converting a single byte into a float between 0 and 1
{
    NSLog(@"YUVFrame: createLookupTableU");
    lookupTableU = new float [256];

    for (int i = 0; i < 256; i++)
    {
        lookupTableU[i] =  -0.436 + (float) i / 255* (0.436*2);
        NSLog(@"lookupTableU[%d]: %f",i,lookupTableU[i]);//prints out the value of each float
    }
}

のVテーブル

-(void)createLookupTableV //creates a lookup table for converting a single byte into a float between 0 and 1
{
    NSLog(@"YUVFrame: createLookupTableV");
    lookupTableV = new float [256];

    for (int i = 0; i < 256; i++)
    {
        lookupTableV[i] =  -0.615 + (float) i /255 * (0.615*2);
        NSLog(@"lookupTableV[%d]: %f",i,lookupTableV[i]);//prints out the value of each float
    }
}

このイベントを、エキスのY&紫外プランとして格納していますが,その二つのバッファ、yBuffer&uvBuffer

ここでいう転換のYUVデータを保存でRGBバッファ配列というframeImage"

-(void)sortAndConvert//sort the extracted frame data into an array of float
{
    NSLog(@"YUVFrame: sortAndConvert");
    int frameImageCounter = 0;
    int pixelCounter = 0;
    for (int y = 0; y < YUV_HEIGHT; y++)//traverse through the frame's height
    {
        for ( int x = 0; x < YUV_WIDTH; x++)//traverse through the frame's width
        {

            float Y = lookupTableY [yBuffer [y*YUV_WIDTH + x] ];
            float U = lookupTableU [uvBuffer [ ((y / 2) * (YUV_WIDTH / 2) + (x/2)) * 2  ] ]; 
            float V = lookupTableV [uvBuffer [  ((y / 2) * (YUV_WIDTH / 2) + (x/2)) * 2 + 1] ];

            float RFormula = Y + 1.13983f * V;
            float GFormula = Y - 0.39465f * U - 0.58060f * V;
            float BFormula = Y + 2.03211f * U;

             frameImage [frameImageCounter++] = [self clampValue:RFormula];
             frameImage [frameImageCounter++] = [self clampValue:GFormula];
             frameImage [frameImageCounter++] = [self clampValue:BFormula];

        }
    }

}

その後を描いてみました画像にはOpenGl

-(void)drawFrame:(int )x
{

    GLuint texture;

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, YUV_WIDTH, YUV_HEIGHT, 0, GL_RGB, GL_FLOAT, frameImage);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);
    glRotatef( 180.0f, 1.0f, 0.0f, 0.0f );

    glBegin( GL_QUADS );
    glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
    glTexCoord2d(1.0,0.0); glVertex2d(+1.0,-1.0);
    glTexCoord2d(1.0,1.0); glVertex2d(+1.0,+1.0);
    glTexCoord2d(0.0,1.0); glVertex2d(-1.0,+1.0);
    glEnd();

    glFlush();
}

なので基本的にはこの私のプログラムをナットしています。基本的にはしていなかったのバイナリのYUVファイル、店舗のすべてのデータは、char配列をバッファです。そしてこれらの価値観を尊重しYUV float値です。

ここはと思い、エラーが発生する場合がある:のルックアップテーブルIの標準化のY平面に[0,1]のU平面Iの標準の値[-0.435,0.436]、Vの平面Iの標準化でmof[-0.615,0.615].かったのですが、YUV値範囲にわかりやすい。

のYUV RGB式の式からわかりやすい。私も試してみましたその他の関数は、この式の荒い展望にフレーム。誰もがベンチャー推なぜか私のプログラムは正しく表示するのYUVフレームデータです。いという私の標準化技術うですが、大丈夫でした。

そして、多くの検査で、私は100%の誤差に起因により見上げます。とは思わない私の設定関数は正しい。

注意を持って扱われる必要があり、誰が読む ます。長時間、フレーム たは正しく表示されないから できなかったエキスのフレームデータ ます。

初めて始めたのとかけ離れたものになってしまう の印象で、クリップの 言30フレーム、30Y平面データ 最初に書かれたデータファイル 次いでその紫外線による平面データ.

私たよ エラーがYUVデータファイル 具体的にはNV12、データファイル 格納され、以下のファッション

Y(1)紫外(1)(2)紫外(2)......

@nschmidt

私は、コードから

float U = lookupTableU [uvBuffer [ (y * (YUV_WIDTH / 4) + (x/4)) * 2 ] ]
float V = lookupTableU [uvBuffer [ (y * (YUV_WIDTH / 4) + (x/4)) * 2 + 1] ]

この結果を取得します alt text

ここでは印刷からです。私は印刷の値Y、U、V、 RGB値にとっても、それに対する蓄積され、frameImage配列

YUV:[0.658824,-0.022227,-0.045824]RGBFinal:[0.606593,0.694201,0.613655]

YUV:[0.643137,-0.022227,-0.045824]RGBFinal:[0.590906,0.678514,0.597969]

YUV:[0.607843,-0.022227,-0.045824]RGBFinal:[0.555612,0.643220,0.562675]

YUV:[0.592157,-0.022227,-0.045824]RGBFinal:[0.539926,0.627534,0.546988]

YUV:[0.643137,0.025647,0.151941]RGBFinal:[0.816324,0.544799,0.695255]

YUV:[0.662745,0.025647,0.151941]RGBFinal:[0.835932,0.564406,0.714863]

YUV:[0.690196,0.025647,0.151941]RGBFinal:[0.863383,0.591857,0.742314]

更新月13 2009年

問題はその解決への推薦 nschmidt .ここでは私のYUVファイルのようにYUV4:1:1の形式です。"私はもともとなければならないとも言われていたのYUV NV12形式です。良いシェア私の結果です。

こちらは出力

alt text

私のコードをデコードし

        float Y = (float) yBuffer [y*YUV_WIDTH + x] ;
        float U = (float) uvBuffer [ ((y / 2) * (YUV_WIDTH  / 2) + (x/2))   ] ; 
        float V = (float) uvBuffer [  ((y / 2) * (YUV_WIDTH  / 2) + (x/2))  + UOffset] ;

        float RFormula = (1.164*(Y-16) + (1.596* (V - 128) ));
        float GFormula = ((1.164 * (Y - 16)) - (0.813 * ((V) - 128)) - (0.391 * ((U) - 128)));
        float BFormula = ((1.164 * (Y - 16)) + (2.018 * ((U) - 128)));


        frameImage [frameImageCounter] = (unsigned char)( (int)[self clampValue:RFormula]);
        frameImageCounter ++;
        frameImage [frameImageCounter] =  (unsigned char)((int)[self clampValue:GFormula]);
        frameImageCounter++;
        frameImage [frameImageCounter] = (unsigned char)((int) [self clampValue:BFormula]);
        frameImageCounter++;



GLuint texture;

glGenTextures(1, &texture);
glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, YUV_WIDTH, YUV_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, frameImage);

//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE_SGIS);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE_SGIS);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);

glRotatef( 180.0f, 1.0f, 0.0f, 0.0f );

glBegin( GL_QUADS );
glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
glTexCoord2d(1.0,0.0); glVertex2d(+1.0,-1.0);
glTexCoord2d(1.0,1.0); glVertex2d(+1.0,+1.0);
glTexCoord2d(0.0,1.0); glVertex2d(-1.0,+1.0);
glEnd();

NSLog(@"YUVFrameView: drawRect complete");
glFlush();

基本的に使用したNSDataのrawファイルに引き出します。char配列に格納されるバッファです。のためのYUV RGB変換を使って式を処分する場合は、次の算式に、その後、固定値を"0:255].それを使って2DTextureにOpenGLのために表示されます。

この変換YUV RGBは、利用目の式からです。している場合は、利用のYUV RGB変換式の前後に、それに必要なものを表示し質感GL_FloatからのRGB値は固定したときの0:1]

役に立ちましたか?

解決

次の試み:) と思いまuvバッファーがインターリーブ.のようになるUの価値観をしてから、配列の値です。変更を行

unsigned int voffset = YUV_HEIGHT * YUV_WIDTH / 2;
float U = lookupTableU [uvBuffer [ y * (YUV_WIDTH / 2) + x/2] ]; 
float V = lookupTableV [uvBuffer [ voffset + y * (YUV_WIDTH / 2) + x/2] ];

かを示す場合があります。

他のヒント

んに対U,Vの値が間違っています。より:

float U = lookupTableU [uvBuffer [ ((y / 2) * (x / 2) + (x/2)) * 2  ] ]; 
float V = lookupTableV [uvBuffer [  ((y / 2) * (x / 2) + (x/2)) * 2 + 1] ];

なう、

float U = lookupTableU [uvBuffer [ ((y / 2) * (YUV_WIDTH / 2) + (x/2)) * 2  ] ]; 
float V = lookupTableV [uvBuffer [  ((y / 2) * (YUV_WIDTH / 2) + (x/2)) * 2 + 1] ];

写真のように見えい4:1:1の形式です。ま行

float U = lookupTableU [uvBuffer [ (y * (YUV_WIDTH / 4) + (x/4)) * 2 ] ]
float V = lookupTableU [uvBuffer [ (y * (YUV_WIDTH / 4) + (x/4)) * 2 + 1] ]

ものを投稿することができ、その結果、何かが間違っている。を見たいので常に難しかしよく考えてください。でも容易になるアプローチこの繰り返.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top