2014-04-04 117 views
3

convertingYUV420格式RGB圖像0​​但即時得到的Orange彩色圖像conversion.後,我用下面的代碼的圖像來做到這一點。我的代碼中是否有任何問題?YUV420到RGB色彩轉換錯誤

int step = origImage->widthStep; 
uchar *data = (uchar *)origImage->imageData; 
int size = origImage->width * origImage->height; 
IplImage* img1 = cvCreateImage(cvGetSize(origImage), IPL_DEPTH_8U, 3); 

for (int i = 0; i<origImage->height; i++) 
{ 
    for (int j=0; j<origImage->width; j++) 
    { 
    float Y = data[i*step + j]; 
    float U = data[ (int)(size + (i/2)*(step/2) + j/2) ]; 
    float V = data[ (int)(size*1.25 + (i/2)*(step/2) + j/2)]; 

    float R = Y + (int)(1.772f*V); 
    float G = Y - (int)(0.344f*V + 0.714f*U); 
    float B = Y + (int)(1.402f*U); 

    if (R < 0){ R = 0; } if (G < 0){ G = 0; } if (B < 0){ B = 0; } 
    if (R > 255){ R = 255; } if (G > 255) { G = 255; } if (B > 255) { B = 255; } 

    cvSet2D(img1, i, j,cvScalar(B,G,R)); 
    } 
} 

origImage - > YUV圖像,
IMG1 - > RGB圖像,

http://upload.wikimedia.org/wikipedia/en/0/0d/Yuv420.svg

是否有可在YUV420格式轉換爲pixel到相應的RGB像素的OpenCV任何功能? (不是整個圖像)

回答

7

我通過修改用於計算R G B值的公式得到的答案, 此代碼工作正常

int step = origImage->widthStep; 
uchar *data = (uchar *)origImage->imageData; 
int size = origImage->width * origImage->height; 
IplImage* img1 = cvCreateImage(cvGetSize(origImage), IPL_DEPTH_8U, 3); 

for (int i = 0; i<origImage->height; i++) 
{ 
    for (int j=0; j<origImage->width; j++) 
    { 
    float Y = data[i*step + j]; 
    float U = data[ (int)(size + (i/2)*(step/2) + j/2) ]; 
    float V = data[ (int)(size*1.25 + (i/2)*(step/2) + j/2)]; 

    float R = Y + 1.402 * (V - 128); 
    float G = Y - 0.344 * (U - 128) - 0.714 * (V - 128); 
    float B = Y + 1.772 * (U - 128); 


    if (R < 0){ R = 0; } if (G < 0){ G = 0; } if (B < 0){ B = 0; } 
    if (R > 255){ R = 255; } if (G > 255) { G = 255; } if (B > 255) { B = 255; } 

    cvSet2D(img1, i, j,cvScalar(B,G,R)); 
    } 
} 
3

第一個問題是使用過時的c-api(它已經不存在了,請使用C++代替)。

第二個問題是寫自己(慢且容易出錯)像素循環

爲什麼不使用:

cvtColor(crs,dst, CV_YUV2BGR); // or CV_YUV2BGR_I420 

呢?