我試圖將帶有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;
}
}
其中RU分配內存m_RGB(QImage的)? – danishansari
我在.h文件中創建一個對象QImage * m_RGB,然後m_RGB = new QImage(width,height,QImage :: Format_RGB888); – Megatron300
如果它是一個指針(m_RGB),你如何通過''.''運算符'm_RGB.bits()[i + 5]'調用bits()以及函數參數中它是不是一個指針。 – danishansari