OV2640转灰度图像

2019-07-20 09:50发布

最近在做OV2640输出灰度图像,一直没有搞出来,不确定是YUV422格式转灰度,还是RGB565转灰度,原子哥在论坛回复的两次还不同,如图


还有怎么设置YUV422输出,根据探索者给的例程,是不是可以直接在OV2640_JPEG_Mode()函数里,调用YUV422输出就可以了?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
phoenix
1楼-- · 2019-07-20 13:20
 精彩回答 2  元偷偷看……
zhang911
2楼-- · 2019-07-20 14:35
如果是YUV输出,怎么将Y分类转换为RGB,请路过的做过OV2640的前辈们多多指教
phoenix
3楼-- · 2019-07-20 15:16
本帖最后由 phoenix 于 2016-7-16 17:17 编辑
zhang911 发表于 2016-7-9 10:24
如果是YUV输出,怎么将Y分类转换为RGB,请路过的做过OV2640的前辈们多多指教

先得让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));



zhang911
4楼-- · 2019-07-20 19:07
 精彩回答 2  元偷偷看……
zhang911
5楼-- · 2019-07-20 23:07
 精彩回答 2  元偷偷看……
phoenix
6楼-- · 2019-07-21 02:53
zhang911 发表于 2016-7-9 22:42
你好,谢谢你的程序,可以在LCD屏上进行灰度显示。
现在想把LCD->LCD_RAM的16位数据拆分开来8位数据发送 ...

1、我的例子是寄存器版本,你的串口2发送数据是用的库函数,没有报错?

一周热门 更多>