C++ 将数据缓冲区(YUV)转换为QImage(RGBA)

C++ 将数据缓冲区(YUV)转换为QImage(RGBA),c++,qt,C++,Qt,我正在尝试将带有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*

我正在尝试将带有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, "%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;
    }


}
void decklinkcapturedegate::convertFrameToOpenCV(void*frameBytes,IplImage*m_RGB){
如果(!m_RGB)m_RGB=cvCreateImage(cvSize(宽度,高度),IPL_深度,3);
无符号字符*pData=(无符号字符*)帧字节;
对于(int i=0,j=0;iimageData[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;
    }


}
void decklinkcapturedegate::convertFrameToOpenCV(void*frameBytes,QImage m_RGB){
//如果(!m_RGB)m_RGB=QImage(宽度、高度、QImage::Format_RGB888);
无符号字符*pData=(无符号字符*)帧字节;
对于(int i=0,j=0;i
创建另一个无符号字符数组(比如pDataRGB),将yuv(pData)转换为rgb(pDataRGB),然后创建类似于-

QImage*m_RGB=新的QImage(pDataRGB,宽度,高度,QImage::Format_RGB888)

如果只想使用Qimage,请按以下方式设置像素数据:-


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

其中RU将内存分配给m_RGB(QImage)?我在.h文件中创建一个对象QImage*m_RGB,然后m_RGB=新的QImage(宽度、高度、QImage::Format_RGB888);如果它是一个指针(m_RGB),您如何通过
”调用bits()。
运算符
m_RGB.bits()[i+5]
以及函数参数中它不是指针。