2016-08-02 1432 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; 
    } 


} 

的目標將是取代的IplImage * m_RGB到QImage的對象。 QImage的格式可以稍後用Qt函數轉換成QImage格式。我設法從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 = new QImage(width,height,QImage :: Format_RGB888); – Megatron300

+0

如果它是一個指針(m_RGB),你如何通過''.''運算符'm_RGB.bits()[i + 5]'調用bits()以及函數參數中它是不是一個指針。 – danishansari

回答

0

再創建一個無符號的字符數組(說pDataRGB),轉換YUV(pData所)爲RGB(pDataRGB),然後喜歡 -

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

創建的QImage如果你只想使用的QImage然後setPixel數據如下: -

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

相關問題