YUV420 to RGB color conversion Error

只谈情不闲聊 提交于 2020-01-12 03:53:28

问题


I am converting an image in YUV420 format to RGB image in opencv but im getting an Orange colored image after conversion. I used following code to do that. Is there any problem in my code ??

 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 image,
img1 -> RGB image,

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

Is there any opencv function which can convert a pixel in YUV420 format to corresponding RGB pixel ? (not entire image)


回答1:


I got answer by modifying the formula for calculating R G B values, This code is working fine

 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));
  }
}



回答2:


the 1st problem is using the outdated c-api (it's dead & gone. please use c++ instead).

the 2nd problem is writing your own (slow and error prone) pixel loops

why not use :

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

instead ?



来源:https://stackoverflow.com/questions/22855510/yuv420-to-rgb-color-conversion-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!