金牌会员
- 积分
- 1393
- 威望
- 690
- 贡献
- 439
- 兑换币
- 386
- 注册时间
- 2013-3-6
- 在线时间
- 132 小时
- 毕业学校
- 北京师范大学珠海分校
|
5#
楼主 |
发表于 2013-12-25 19:39:34
|
只看该作者
yangtou880 发表于 2013-12-23 20:41
看你的代码,意思是程序能直接区分出来是U、V还是Y值?怎么做到的,是U、V值和Y值在数据上有区别吗,还是说 ...
1.不是程序能直接区分出来的!不管是什么数据,对程序来说只是1和0,程序怎么可能直接会区分!
2.U、V值和Y值在数据上没有任何的区别,都是0--255之间的一个数值。
3.U、V、Y是按时序输出的!我上次已经说得很清楚啦!有4种时序(或者说顺序),可以根据需要自己配置的。
不清楚你用的是不是跟我的摄像头完全一样的,我已经说明我的是OV7725带FIFO,只有VSYNC场信号,没有行和像素信号。不过就算摄像头不一样YUV422时序的定义都是一样的,只是在操作上殊途同归而已。
我这里针对U Y V Y这种时序再跟你细说多一次吧:
1.OV7725上电后,数据就会以一定的速度和顺序连连不绝的输出,不管你接不接收。(要接收,你就使能FIFO,数据就存进FIFO里了你再读出来就好;不接收就不使能FIFO,数据就直接流失了。)
2.上面说的感觉是废话,应该懂的吧...还是直接说U、Y、V、Y顺序好了。
现在知道了数据会以一定的顺序连连不绝的输出了,那“一定的顺序”是怎么样的呢?这就是我们直接选的了,我选的 是U Y V Y,即:输出一个U数据8bit存在了FIFO的最前面,然后输出一个Y数据8bit存在了FIFO的第二个位置,接着输出一个V数据8bit存在了FIFO的第三个位置,然后又输出一个Y数据8bit存在了FIFO的第四个位置,接着又循环回去输出下一个U数据8bit存在了第五个位置,再又是一个Y数据8bit存在第六个位置,如此如此,这般这般...即U Y V Y U Y V Y ........U Y V Y U Y V Y U Y V Y .....U Y V Y。够详细、废话了吧!
3.好了现在知道数据是以U Y V Y U Y V Y的顺序存在FIFO里了,那现在剩下的事情就是从FIFO中把我们要的Y数据读取出来了!那怎么读呢?很简单,看FIFO数据手册,或直接看别人的读取程序就好了,如下:
for(i=0;i<ROW;i++)
{
for(j=0;j<LINE;j++)
{
//1.读取U或V值,这里直接舍弃
FIFO_RD_L();//FIFO的RD脚给低电平,使得FIFO输出一个数据,由于第奇数次输出的数据是U/V(为什么是U/V数据,第2点时我讲清楚了:U Y V Y),而我们需要的是Y所以就直接舍去,就是不接收,即不写 Image_Data[j] = GPIO_GET_8bit(PORTD,0);这样的从数据引脚读取数据的语句。
FIFO_RD_H(); //FIFO的RD脚给高电平,使得FIFO不能输出数据。(即一低一高一个CLK,FIFO输出一个数据。注:FIFO数据先进先出,输出一个数据地址自加1,不需要我们变地址)
//2.读取Y值,即灰度值
FIFO_RD_L();//同上。由于这里是第偶数次输出数据,即输出的是Y数据,所以有下面的一句读取数据的语句。
Image_Data[j] = GPIO_GET_8bit(PORTD,0);//读取图像数据PORTD0-PORTD7
FIFO_RD_H(); //同上,
}
}
//这样按顺序循环读下来,读到的当然都是我们要的Y数据啦!
|
|