YUV422_to_RGB24 转换算法
最近做摄像头的测试,读取出来的数据为 YUV422(YUYV)格式,若要在 LCD 上面显示,需要先做格
式转换,但在网上搜了一遍,只有 YUV420 转 RGB 的算法,无奈自己做了一个函数,实现到 RGB24 的格式
转换,转成 RGB24(即 RGB888)之后,就可以根据自己的 LCD 格式再做其他转换,例如我的 LCD 显示格式为
RGB565,可以再做一个 RGB24 到 RGB565 的转换即可,类似转换比较简单,相关例程网上也比较多,就不
多做描述了,下面给出 YUV422 到 RGB24 的转换函数:
typedef unsigned char uint8_t;
static void yuv422_to_rgb24(unsigned char *yuv422,unsigned char *rgb24, int
width, int height)
{
int x,y;
uint8_t *yuv444;
yuv444 = (uint8_t *) malloc(sizeof(uint8_t) * WIDTH * HEIGHT * 3);
for(x = 0,y = 0;x < width*height*2,y < width*height*3;x+=4,y+=6)
{
yuv444[y] = yuv422[x];
yuv444[y+1] = yuv422[x+1];
yuv444[y+2] = yuv422[x+3];
yuv444[y+3] = yuv422[x+2];
yuv444[y+4] = yuv422[x+1];
yuv444[y+5] = yuv422[x+3];
}
for(x = 0;x < width*height*3;x+=3)
{
rgb24[x+2] = yuv444[x] + 1.402*(yuv444[x+2] - 128);
rgb24[x+1] = yuv444[x]-0.34414*(yuv444[x+1]-128)-0.71414*(yuv444[x+2]-
128);
rgb24[x] = yuv444[x] + 1.772*(yuv444[x+1] - 128);
if (rgb24[x]>255)rgb24[x]=255;
if (rgb24[x]<0)rgb24[x]=0;
if (rgb24[x+1]>255)rgb24[x+1]=255;
if (rgb24[x+1]<0)rgb24[x+1]=0;
if (rgb24[x+2]>255)rgb24[x+2]=255;
if (rgb24[x+2]<0)rgb24[x+2]=0;
}
free(yuv444);
}
该函数的转换思想是先进行 YUV422 到 YUV444 的转化,再进行 YUV444 到 RGB24 的转化,利用一个
YUV422 像 素点得到两 个 YUV444 像 素点 , 其中 YUV444[0] 由 Y[0] 、 U[0] 、 V[0] 得 到, YUV444[1] 由 Y[1]
、U[0]、V[0]得到,可见 UV 分量被重复利用。
得到 YUV444 分量之后再利用公式: