2016-08-02 152 views
-1

YUVデータの画像バッファをQImage(RGBA8888フォーマット)に変換しようとしています。ここでデータバッファ(YUV)をQImage(RGBA)に変換する

はIplImageへのバッファからの変換です:

void DeckLinkCaptureDelegate::convertFrameToOpenCV(void* frameBytes, IplImage * m_RGB){ 
    if(!m_RGB) m_RGB = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); 


    unsigned char* pData = (unsigned char *) frameBytes; 

    for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4) 
    { 

     unsigned char u = pData[j]; 
     unsigned char y = pData[j+1]; 
     unsigned char v = pData[j+2]; 

     //fprintf(stderr, "%d\n", v); 
     m_RGB->imageData[i+2] = 1.0*y + 8 + 1.402*(v-128);    // r 
     m_RGB->imageData[i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g 
     m_RGB->imageData[i] = 1.0*y + 1.772*(u-128) + 0;       // b 

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


} 

目標はQImageのオブジェクトにIplImageへ* m_RGBを置き換えることであろう。 QImageのフォーマットは、後でQImageフォーマットを変換するQt関数で変更することができます。私はIplImageからQImageを取得することができましたが、IplImageのステップを完全に削除するために、この手順を省略しようとしています。

の問題は、私は私がQImageのためにそれを行うことができるか分からないので、上記のコードを理解するのに苦労を抱えている、です。

私はそれをやってもらえますか、少なくとも上記のコードを理解することはできますか?

ありがとうございました。

編集:これは私が今のところ持っているものですが、機能しません。

void DeckLinkCaptureDelegate::convertFrameToOpenCV(void* frameBytes, QImage m_RGB){ 
    //if(!m_RGB) m_RGB = QImage(width, height, QImage::Format_RGB888); 


    unsigned char* pData = (unsigned char *) frameBytes; 


    for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4) 
    { 

     unsigned char u = pData[j]; 
     unsigned char y = pData[j+1]; 
     unsigned char v = pData[j+2]; 

     //fprintf(stderr, "%d\n", v); 


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

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


} 
+0

場合RU割り当てメモリm_RGB(QImageの)か? – danishansari

+0

.hファイルにオブジェクトQImage * m_RGBを作成し、次にm_RGB =新しいQImage(幅、高さ、QImage :: Format_RGB888)を作成します。 – Megatron300

+0

ポインタ(m_RGB)の場合、 ''。 ''演算子 'm_RGB.bits()[i + 5]'と関数引数ではポインタではなく、どのようにbits()を呼び出していますか? – danishansari

答えて

0

別のunsigned char型の配列(pDataRGBを言う)、変換RGB(pDataRGB)にYUV(pDataを)を作成し、あなただけのQImageのを使用したい場合は、

QImage *m_RGB = new QImage(pDataRGB, width, height, QImage::Format_RGB888);

like- QImageのを作成次のようなデータをとsetPixel: -

m_RGB->setPixel(i, j, qRgb(r, g, b));

関連する問題