将数据缓冲器(YUV)转换为QImage(RGBA)



我正在尝试将带有YUV数据的图像缓冲区转换为QImage(RGBA8888格式)。

以下是从缓冲区到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, "%dn", 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, "%dn", 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;
    }

}

创建另一个无符号char数组(比如pDataRGB),将yuv(pData)转换为rgb(pDataRGB

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

如果你想只使用Qimage,那么设置像素数据如下:-

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

最新更新