2012-08-29 55 views
0

我有一個問題,將從YUV格式的相機捕獲的圖像轉換爲RGB格式。Blackmagic frame:從yuv轉換爲RGB在openCV中使用

這是用來做什麼的功能如下:

int uwidth = 1920; 
int uheight= 1080; 

int i = 0,j = 0, r = 0, g = 0, b = 0; 
typedef unsigned char BYTE; 
IplImage* m_RGB = cvCreateImage(cvSize(uwidth, uheight), IPL_DEPTH_8U, 3); 
unsigned char* pData = (unsigned char *) frameBytes; 

for(i = 0, j=0; i < uwidth * uheight*3 ; i+=6, j+=4) 
{ 
    unsigned char u = pData[j]; 
    unsigned char y = pData[j+1]; 
    unsigned char v = pData[j+2]; 

    b = 1.0*y + 8 + 1.402*(v-128); 
    g = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); 
    r = 1.0*y + 1.772*(u-128); 

    if(r>255) r =255; 
    if(g>255) g =255; 
    if(b>255) b =255; 
    if(r<0) r =0; 
    if(g<0) g =0; 
    if(b<0) b =0; 

    m_RGB->imageData[i] = (BYTE)(r*220/256); 
    m_RGB->imageData[i+1] = (BYTE)(g*220/256); 
    m_RGB->imageData[i+2] =(BYTE)(b*220/256); 

} 

cvNamedWindow("ck", CV_WINDOW_AUTOSIZE); 
cvShowImage("ck", m_RGB); 
cvReleaseImage(&m_RGB); 

的問題是,我們在窗口不是一個而是兩個圖像我的屏幕上,而且我們有很好的顏色,但不好比例。

有沒有人有關於這些問題的想法?

編輯:Image output

+0

http://stackoverflow.com/questions/8042563/correct-yuv422-to-rgb-conversion/8616223#8616223這個想法是,一些YUV格式不同於你所期望的。找到你正在使用的確切的一個,並相應地實現你的算法 – Sam

回答

1

假設imageData被定義爲

BYTE* imageData; 

在這種情況下,該循環道出了很多:

for(i = 0, j=0; i < uwidth * uheight*3 ; i+=6, j+=4)

i+=6每次設定時間是指一個像素,你會跳過下一個像素(或wh在你期望的時候,一次設置2個像素)。

j+=4 
unsigned char u = pData[j]; 
unsigned char y = pData[j+1]; 
unsigned char v = pData[j+2]; 

意味着您的相機的格式是UYVY

  • 它描述兩個連續像素P0和P1
  • 的色度信道是用於P0和P1是相同的。 U = U0 = U1V = V0 = V1
  • lumina渠道是不同的。第一個是P0,第二個是P1。

您需要通過重複設置2個像素:

m_RGB->imageData[i] = r1; 
m_RGB->imageData[i+1] = g1; 
m_RGB->imageData[i+2] =b1; 
m_RGB->imageData[i+3] = r2; 
m_RGB->imageData[i+4] = g2; 
m_RGB->imageData[i+5] =b2; 

r1r2(及其他)之間的區別是,你的轉換公式中使用兩個不同的Y

+0

謝謝你的答案。現在圖像的質量更好,顏色也更好。最後一個問題是,我在窗口上顯示了兩個圖像,顯示的比例不正確。它太緊張了。 –

+0

圖像如何?並排? – UmNyobe

+0

你可以在這裏發佈圖片嗎(更小的尺寸)? – UmNyobe

1

如果您正在爲Mac編程,請查看OSX 10.9甚至10.10中最近添加的vImage轉換庫。那裏的東西真的是令人興奮的。我正在做我自己的24位到32位轉換,並將其磨至約6ms /幀(1920x1080)。通過vImage超過15X迅速將水吹出。