Blackmagic框架:从yuv转换为RGB以在openCV中使用

时间:2012-08-29 09:39:29

标签: c++ opencv rgb yuv

将从YUV格式的相机拍摄的图像转换为RGB格式时出现问题。

用于执行此操作的功能如下:

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

2 个答案:

答案 0 :(得分:1)

我们假设imageData被定义为

BYTE* imageData;

在这种情况下,这个循环说明了很多:

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

i+=6表示每次设置像素时,您都会跳过下一个像素(或您预期的操作,一次设置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

答案 1 :(得分:1)

如果您正在为Mac编程,请查看OSX 10.9甚至10.10中最近添加的vImage转换库。那里的东西真的令人兴奋。我正在进行自己的24位到32位转换,并将其磨练到大约6ms /帧(1920x1080)。 vImage迅速从水中吹出超过15倍。