2019-07-20 09:50发布
zhang911 发表于 2016-7-9 10:24 如果是YUV输出,怎么将Y分类转换为RGB,请路过的做过OV2640的前辈们多多指教
zhang911 发表于 2016-7-9 22:42 你好,谢谢你的程序,可以在LCD屏上进行灰度显示。 现在想把LCD->LCD_RAM的16位数据拆分开来8位数据发送 ...
最多设置5个标签!
先得让OV2640输出YUV422格式数据
void OV2640_YUV422_Mode(void);//设置OV2640输出YUV422.(YUYV)格式(16位数据的高字节为亮度值Y)
{
u8 temp;
SCCB_slave_address = 0x60; //设备的地址(0x60用于写/0x61用于读)
write_SCCB(0xff, 0x00); //要设置0xDA寄存器,必须让0xFF=0x00
write_SCCB(0xda, 0x00);//设置OV2640输出YUYV格式
temp = read_SCCB(0xc2); //读寄存器 0xc2 并赋值给temp
temp &= 0xef; //变量temp 位4为0
write_SCCB(0xc2, temp);//寄存器 0xc2 位4为0
}
如格式正确输出,LCD上会出现五颜六 {MOD}的波纹图像,然后你在把Y分量转换为灰度输出到LCD上。
定义个变量:
u16 Gray;//灰度值
Gray =(((yuv422>>(8+3))<<11)|((yuv422>>(8+2))<<5)|((yuv422>>(8+3))<<0));
这是把YUV422格式转换为灰度值以RGB565格式显示在LCD上
yuv422 即:YVYU 格式(16位) ,其中,Y为亮度值(8位)。
奇次输出YV(16位) ,偶次输出YU(16位),按此规律循环输出直至最后数据。就是说YVYU 格式数据每次输出(16位)的数据高字节部分为亮度值 Y 。
RGB565格式为(16位),即R为16位中的高5位,即G为16位中的中6位,即B为16位中的低5位。
因此:
yuv422>>(8+3);//即,只取Y值的高5位(丢弃U或V)
yuv422>>(8+2);//即,只取Y值的高6位(丢弃U或V)
yuv422>>(8+3);//即,只取Y值的高5位(丢弃U或V)
把这三个(高5位、高6位、高5位)Y值位或运算,即可得灰度图像值(RGB565格式)
就是这个:
Gray =(((yuv422>>(8+3))<<11)|((yuv422>>(8+2))<<5)|((yuv422>>(8+3))<<0));
1、我的例子是寄存器版本,你的串口2发送数据是用的库函数,没有报错?
一周热门 更多>