2016-08-08 5 views
1

EDIT:質問は不明ですが、私は詳細を更新して追加しました。YUVからRGBへの変換中に垂直にバッファを反転するには

私はRGB形式に変換する画像データ(YUV形式)のバッファを持っています。問題は、画像を垂直方向に反転させることです(Y位置を反転する)。

私が今できることは、YUVデータをバッファ内のRGBデータに変換してから、このバッファを垂直に反転させることです。私はパフォーマンスを得るためにしたいと思っ何

unsigned char* DeckLinkCaptureDelegate::convertYUVtoRGB(void* frameBytes) 
{ 
    unsigned char *mycopy = new unsigned char[height*width*3]; 
    unsigned char *flippedCopy = new unsigned char[height*width*3]; 
    unsigned char* pData = (unsigned char *) frameBytes; 


    //Conversion from YUV to RGB 

    for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4) 
    { 
     unsigned char v = pData[j]; 
     unsigned char y = pData[j+1]; 
     unsigned char u = pData[j+2]; 

     mycopy[i+2] = 1.0*y + 8 + 1.402*(v-128);    // r 
     mycopy[i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
     mycopy[i] = 1.0*y + 1.772*(u-128) + 0;       // b 

     y = pData[j+3]; 
     mycopy[i+5] = 1.0*y + 8 + 1.402*(v-128);    // r 
     mycopy[i+4] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
     mycopy[i+3] = 1.0*y + 1.772*(u-128) + 0; 
    } 

    //Vertical flip 

    for (int i = 0; i < width; ++i) { 
     for (int j = 0; j < height; ++j) { 
      for (int k = 0; k < 3; ++k) { 
       flippedCopy[(i + j * width) * 3 + k] = mycopy[(i + (height - 1 - j) * width) * 3 + k]; 
      } 
     } 
    } 

    return flippedCopy; 
} 

が YUVからRGBへの変換時にバッファを反転である:ここでは

は、このために動作するコードです。私はそれを行う方法を知りませんでしたし、ユスフの答えは私を助けたので、ここで私は一瞬のために持っているものです。

unsigned char* DeckLinkCaptureDelegate::convertYUVtoRGB(void* frameBytes) 
{ 
    unsigned char *mycopy = new unsigned char[height*width*3]; 
    unsigned char* pData = (unsigned char *) frameBytes; 
    int k = height - 1; 

    for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4) 
    { 
      unsigned char v = pData[j]; 
      unsigned char y = pData[j+1]; 
      unsigned char u = pData[j+2]; 

      mycopy[(width*k*3) + i+2] = 1.0*y + 8 + 1.402*(v-128);    // r 
      mycopy[(width*k*3) + i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
      mycopy[(width*k*3) + i] = 1.0*y + 1.772*(u-128) + 0;       // b 

      y = pData[j+3]; 
      mycopy[(width*k*3) + i+5] = 1.0*y + 8 + 1.402*(v-128);    // r 
      mycopy[(width*k*3) + i+4] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
      mycopy[(width*k*3) + i+3] = 1.0*y + 1.772*(u-128) + 0; 

      if (<i multiple of (width*3)-1>){ 
       k = k - 2; 
      } 

    } 

    return mycopy; 
} 

私が正しいんだ場合は、これはif条件が正しいと仮定すると、動作するはずです。しかし、私はiが6ずつインクリメントされているので、このif状態を表現する方法がわからないので、私は、私は十分に明確だ願っていk

をデクリメントする権利瞬間を「スキップ」かもしれません。ありがとう

+5

cと画像処理などだけでなく、としてあなたの質問にタグを付けます。 –

+0

あなたは2つのループを使用し、逆の方法で他の配列に保存することができます...高さのような - 私か何か – retinotop

+1

"ここにコードです" OK。そして?それは動作しますか?それは何をするためのものか?それについてあなたの質問は何ですか? –

答えて

1

私は幅が偶数であると仮定します。そうでなければ "新しい行で減らす" - 複雑になると、2つのループを使用する必要があります。私はテストしませんでしたが、このように見えるはずです。

unsigned char* DeckLinkCaptureDelegate::convertYUVtoRGB(void* frameBytes) 
{ 
    unsigned char *mycopy = new unsigned char[height*width*3]; 
    unsigned char* pData = (unsigned char *) frameBytes; 
    unsigned int k = height - 1; 

    for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4) 
    { 
     unsigned char v = pData[j]; 
     unsigned char y = pData[j+1]; 
     unsigned char u = pData[j+2]; 

     mycopy[(width*k*3) + i+2] = 1.0*y + 8 + 1.402*(v-128);    // r 
     mycopy[(width*k*3) + i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
     mycopy[(width*k*3) + i] = 1.0*y + 1.772*(u-128) + 0;       // b 

     y = pData[j+3]; 
     mycopy[(width*k*3) + i+5] = 1.0*y + 8 + 1.402*(v-128);    // r 
     mycopy[(width*k*3) + i+4] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
     mycopy[(width*k*3) + i+3] = 1.0*y + 1.772*(u-128) + 0; 

     if (mod(i, width*3) == 0) //reduce in new line (i am not sure how to reduce it, you should think about here) 
      k = k - 2; 
    } 

    return mycopy; 
} 

、あなたが質問をするのを忘れているように見える++

関連する問題