将从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
答案 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:
U = U0 = U1
和V = V0 = V1
您需要通过迭代设置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
。
答案 1 :(得分:1)
如果您正在为Mac编程,请查看OSX 10.9甚至10.10中最近添加的vImage转换库。那里的东西真的令人兴奋。我正在进行自己的24位到32位转换,并将其磨练到大约6ms /帧(1920x1080)。 vImage迅速从水中吹出超过15倍。