2011-10-31 866 views
8

我有一個電視採集卡,其饋送作爲YUV格式進入。我已經在這裏看到類似於這個問題的其他帖子,並試圖嘗試所有可能的方法,但他們都沒有提供清晰的圖像。目前最好的結果是OpenCV cvCvtColor(scr, dst, CV_YUV2BGR)函數調用。在OpenCV中將YUV轉換爲BGR或RGB

我目前還沒有意識到YUV格式,說實話讓我有點困惑,因爲它看起來像存儲4個通道,但只有3個?我已經包含了捕捉卡中的圖像,希望有人能夠理解我可以用來填補空白的事情。

YUV to BGR converted image

進料通過的DeckLink強度臨卡進來,並在C++應用程序被訪問中在Windows 7環境中使用的OpenCV。

更新

我已經看過有關此信息的維基百科文章,並試圖用公式我的應用程序。下面是從它接收到的輸出的代碼塊。任何意見是極大的讚賞。

BYTE* pData; 

    videoFrame->GetBytes((void**)&pData); 

    m_nFrames++; 

    printf("Num Frames executed: %d\n", m_nFrames); 

    for(int i = 0; i < 1280 * 720 * 3; i=i+3) 
    { 
     m_RGB->imageData[i] = pData[i] + pData[i+2]*((1 - 0.299)/0.615); 
     m_RGB->imageData[i+1] = pData[i] - pData[i+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[i+2]*((0.299*(1 - 0.299))/(0.615*0.587)); 
     m_RGB->imageData[i+2] = pData[i] + pData[i+1]*((1 - 0.114)/0.436); 
    } 

Attempted RGB conversion

+0

「我目前尚不知情的YUV格式」 - >維基百科。閱讀有關它:http://en.wikipedia.org/wiki/YUV#Conversion_to.2Ffrom_RGB – NickLH

+0

感謝您鏈接該文章,但我認爲我將與ay,u,v和y1一起工作,並且使用這些變量來產生RGB等價物?我也必須創建4個不同的數組來獲取每個單獨的值集合,以將它們合併到一起? – Seb

+0

由於RGB中有3個顏色分量,因此只需要3個陣列。但是,你基本上需要分別計算顏色分量並將其存儲在某個地方。 – NickLH

回答

5

它在我看來像你解碼YUV422流爲YUV444。試試這個修改您所提供的代碼:

for(int i = 0, j=0; i < 1280 * 720 * 3; i+=6, j+=4) 
{ 
    m_RGB->imageData[i] = pData[j] + pData[j+3]*((1 - 0.299)/0.615); 
    m_RGB->imageData[i+1] = pData[j] - pData[j+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[j+3]*((0.299*(1 - 0.299))/(0.615*0.587)); 
    m_RGB->imageData[i+2] = pData[j] + pData[j+1]*((1 - 0.114)/0.436); 
    m_RGB->imageData[i+3] = pData[j+2] + pData[j+3]*((1 - 0.299)/0.615); 
    m_RGB->imageData[i+4] = pData[j+2] - pData[j+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[j+3]*((0.299*(1 - 0.299))/(0.615*0.587)); 
    m_RGB->imageData[i+5] = pData[j+2] + pData[j+1]*((1 - 0.114)/0.436); 
} 

我不知道你有你的常量是正確的,但在最壞的情況你的顏色將被關閉 - 圖像依然清晰可見。

+0

你說的常數不正確。我看到一個很好和清晰的圖像。我只需要研究YUV422常量來糾正問題。感謝您的建議。 – Seb

1

這可能是走錯了路,但很多人(我的意思是,工程師)也有混合的YCbCr YUV。

嘗試

cvCvtColor(src, dsc, CV_YCbCr2RGB) 

或CV_YCrCb2RGB或者一個更特殊的類型。

+0

我的歉意是CV_YCbCr。 OpenCV沒有YUV枚舉器。 – Seb

+2

這隻有在YUV源是SD時才能正常工作。基本的視覺檢查可能看起來很正確,但顏色實際上並不正確。這是因爲用於YUV轉換的最新OpenCV源(2.4.10)僅支持PAL/NTSC/SECAM的601色空間,而不支持HD的709或UHD的2020。 –

+0

Opencv 2.4。*確實有YUV枚舉器,並且沒有CV_YCbCr2RGB。 改爲有CV_YCrCb2RGB。 – Temak

2

BlackMagic Intensity軟件在bmdFormat8BitYUV中返回YUVY格式,所以2個源像素被壓縮成4字節 - 我不認爲openCV的cvtColor可以處理這個問題。

你可以自己做,或者只是調用Intensity軟件ConvertFrame()函數

編輯:YUV通常被存儲爲
enter image description here

有針對每個像素的Y(亮度),但對於行中的每個替代像素只有U和V(顏色)。

所以如果數據是一個無符號字符指向上面顯示的內存的開始。像素1,Y =數據[0] U =數據[+1] V =數據[+3]
像素2,Y =數據[+2] U =數據[+1] V =數據[ +3]

然後使用您在示例代碼中使用的YUV-> RGB係數。

+0

我看了一下這個函數,但它不適用於IDeckLinkInputFrame類。最好的方法似乎自己做到這一點。謝謝你提到YUVY是什麼,但是你會碰巧知道基於你偶然發現的轉換公式嗎?如果你不知道,請不要竭盡全力幫助我。謝謝 – Seb

+0

ps可能會以錯誤的方式獲得U/V Cr/Cb - 但它應該是顯而易見的! –

6

OPENCV新版本有一個內置的功能,可以用來做YUVRGB轉換

cvtColor(src,dst,CV_YUV2BGR_YUY2);

指定YUV格式下劃線後,像這樣CV_YUYV2BGR_xxxx

+0

我使用的是opencv 2.4。5 – kyencn

+0

這隻有在YUV信號源爲SD時才能正常工作。基本的視覺檢查可能看起來很正確,但顏色實際上並不正確。這是因爲用於YUV轉換的最新OpenCV源(2.4.10)僅支持PAL/NTSC/SECAM的601色空間,而不支持HD的709或UHD的2020。 –

1

也許有人被顏色模型YCbCr和YUV所困惑。 Opencv不處理YCbCr。相反,它有YCrCb,而它的在opencv中的實現方式與YUV相同。

從OpenCV的來源https://github.com/Itseez/opencv/blob/2.4/modules/imgproc/src/color.cpp#L3830

case CV_BGR2YCrCb: case CV_RGB2YCrCb: 
case CV_BGR2YUV: case CV_RGB2YUV: 
    // ... 
    // 1 if it is BGR, 0 if it is RGB 
    bidx = code == CV_BGR2YCrCb || code == CV_BGR2YUV ? 0 : 2; 
    //... converting to YUV with the only difference that brings 
    // order of Blue and Red channels (variable bidx) 

但有一兩件事要說。
目前在一個轉換bugCV_BGR2YUVCV_RGB2YUV在OpenCV的分支2.4。*。

目前,這個公式在實現中使用:

Y = 0.299B + 0.587G + 0.114R 
U = 0.492(R-Y) 
V = 0.877(B-Y) 

它應該是(根據wikipedia)什麼:

Y = 0.299R + 0.587G + 0.114B 
U = 0.492(B-Y) 
V = 0.877(R-Y) 

通道紅色和藍色的實施式中放錯地方。

可能的解決方法轉換BGR-> YUV,而錯誤是不固定的:

cv::Mat source = cv::imread(filename, CV_LOAD_IMAGE_COLOR); 
    cv::Mat yuvSource;  
    cvtColor(source, yuvSource, cv::COLOR_BGR2RGB); // rearranges B and R in the appropriate order 
    cvtColor(yuvSource, yuvSource, cv::COLOR_BGR2YUV); 
    // yuvSource will contain here correct image in YUV color space