Advertisement

uyvy422到RGB888转换

阅读量:

在嵌入式系统中,摄像头通常会以YUV格式采集图像数据,而Framebuffer设备仅接受RGB格式的信息,因此必须进行YUV至RGB颜色空间的转换

通常涉及对YUV各分量进行线性变换以还原出RGB空间中的色彩信息。例如使用YUV422I格式时各分量通过预设的标准转换矩阵进行计算其中U和V通道的数据排列方式遵循uyvy模式这样的结构安排有助于优化数据存储效率并保持视频信号的质量特性。

复制代码
 //输入YUV422I buffer数据,输出RGB buffer数据;

    
 static int UYVY422ToRGB888(const unsigned char *src_buffer, int w, int h, const unsigned char *des_buffer)
    
 {
    
 	unsigned char *yuv, *rgb;
    
 	unsigned char u, v, y1, y2;
    
  
    
 	yuv = src_buffer;
    
 	rgb = des_buffer;
    
  
    
 	if (yuv == NULL || rgb == NULL)
    
 	{
    
 		printf ("error: input data null!\n");	
    
 		return -1;
    
 	}
    
  
    
 	int size = w * h;
    
  
    
 	for(int i = 0; i < size; i += 2)
    
 	{
    
 		y1 = yuv[2*i + 1];
    
 		y2 = yuv[2*i + 3];
    
 		u = yuv[2*i];
    
 		v = yuv[2*i + 2];
    
  
    
 #if 0
    
 		rgb[3*i]     = (unsigned char)(y1 + 1.402*(u - 128));
    
 		rgb[3*i + 1] = (unsigned char)(y1 - 0.344*(u - 128) - 0.714*(v - 128));
    
 		rgb[3*i + 2] = (unsigned char)(y1 + 1.772*(v - 128));
    
  
    
 		rgb[3*i + 3] = (unsigned char)(y2 + 1.375*(u - 128));
    
 		rgb[3*i + 4] = (unsigned char)(y2 - 0.344*(u - 128) - 0.714*(v - 128));
    
 		rgb[3*i + 5] = (unsigned char)(y2 + 1.772*(v - 128));
    
 #endif 
    
 	
    
 		//为提高性能此处用移位运算;
    
 		rgb[3*i]     = (unsigned char)(y1 + (u - 128) + ((104*(u - 128))>>8));
    
 		rgb[3*i + 1] = (unsigned char)(y1 - (89*(v - 128)>>8) - ((183*(u - 128))>>8));
    
 		rgb[3*i + 2] = (unsigned char)(y1 + (v - 128) + ((199*(v - 128))>>8));
    
  
    
 		rgb[3*i + 3] = (unsigned char)(y2 + (u - 128) + ((104*(u - 128))>>8));
    
 		rgb[3*i + 4] = (unsigned char)(y2 - (89*(v - 128)>>8) - ((183*(u - 128))>>8));
    
 		rgb[3*i + 5] = (unsigned char)(y2 + (v - 128) + ((199*(v - 128))>>8));
    
 	}
    
 	
    
 	return 0;
    
 }
    
    
    
    
    代码解读

参考资料: wiki

全部评论 (0)

还没有任何评论哟~