0

我在将相机捕获的 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);

问题是我的屏幕上的窗口中没有一张而是两张图像,而且我们有很好的颜色但不是很好的比例。

有人知道这些问题吗?

编辑: 图像输出

4

2 回答 2

1

如果您正在为 Mac 编程,请查看最近在 OSX 10.9 甚至 10.10 中添加的 vImage 转换库。里面的东西真的很震撼。我正在自己进行 24 位到 32 位的转换,并将其磨练到大约 6 毫秒/帧 (1920x1080)。被 vImage 超过 15X 及时吹出水面。

于 2014-08-01T05:24:56.547 回答
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
  • 发光通道不同。第一个用于 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;

r1和(和其他)之间的区别在于您在转换公式中r2使用了两个不同的。Y

于 2012-08-29T10:13:32.220 回答