智能车制作

标题: 75帧减到60帧,调一个星期了也没能调出来,求指导! [打印本页]

作者: 尕玍紿    时间: 2013-12-22 16:12
标题: 75帧减到60帧,调一个星期了也没能调出来,求指导!
OV7725摄像头,带FIFO,只有VSYNC(场)信号,没有行信号和PCLK。K60采集。
目前:
YUV数据格式,QVGA模式下(320*240)配置成75帧的输出速度,图像算是没问题;如下:
[attach]53737[/attach]
[attach]53736[/attach]
将阈值设为255发现有两条白线,不明是什么原因...
但是这个无所谓啦,影响不大。但是75帧的输出速度太快了,我想减到60帧。

于是配置寄存器,设置为60帧的速度(测了VSYNC的信号,是60帧的速度,即配置是没问题的)

(注,就改了输出速度而已,其他配置都没改)



可是采集回来的图像有问题了。
第一场正常,就是暗了一点,这个应该是曝光时间的原因,75帧的时候也会,无所谓·舍弃第一场就好了,如下:
[attach]53738[/attach]
但是 第一场之后的图像就全乱了,如下:
[attach]53739[/attach]
估计是读写复位时序异常的原因,但是一个星期来就是怎么都调不好,求指导啊!

作者: yangtou880    时间: 2013-12-22 19:52
楼主是怎么在YUV格式下保证采集到的Y值而不是U或者V值的呢
作者: 尕玍紿    时间: 2013-12-23 15:58
yangtou880 发表于 2013-12-22 19:52
楼主是怎么在YUV格式下保证采集到的Y值而不是U或者V值的呢

开始我也不行的,查了好多才搞定的。首先得理解YUV422是什么意思:
开始我自以为是Y用4bit表示,U用2bit表示,V用2bit表示。
后来查了才知道完全不是一回事!
意思是:四个像素里有4个Y、2个U、2个V;而每个Y、U、V都是8bit表示的。
最后还有一点,那就是你摄像头YUV数据的输出顺序了,一般有4种顺序可选:
1. 输出8bit Y 再输出8bit U 然后又输出8bit Y 最后输出8bit V 以此类推按顺序输出;
2. U Y V Y ... U Y V Y 以此类推;
3.忘了
4.忘了
我用的是第二种顺序,即:U Y V Y输出的
知道以上后,采集思路如下:
for(i=0;i<ROW;i++)
{
    for(j=0;j<LINE;j++)
    {
               //1.读取U或V值,这里直接舍弃
               FIFO_RD_L();
               FIFO_RD_H();  
               //2.读取Y值,即灰度值
               FIFO_RD_L();
               Image_Data[j] = GPIO_GET_8bit(PORTD,0);//读取图像数据PORTD0-PORTD7
               FIFO_RD_H();
    }
}


作者: yangtou880    时间: 2013-12-23 20:41
尕玍紿 发表于 2013-12-23 15:58
开始我也不行的,查了好多才搞定的。首先得理解YUV422是什么意思:
开始我自以为是Y用4bit表示,U用2bit ...

看你的代码,意思是程序能直接区分出来是U、V还是Y值?怎么做到的,是U、V值和Y值在数据上有区别吗,还是说你在硬件上将他们区分开了?或者是完全根据时序来判断是U、V还是Y值的?
作者: 尕玍紿    时间: 2013-12-25 19:39
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数据啦!

作者: 尕玍紿    时间: 2013-12-25 19:50
本问题已解决!
自己运气好,导致自己掉坑里了!总觉得既然75行得通就说明读写复位的时序没问题。最后发现问题所在是中断时,自己加的标志位没同步好的原因,导致了读写复位不同步,从而造成图像东一块,西一块...

作者: dongshao_87    时间: 2013-12-25 21:38
新手 学习了 虽然不是看的很多但是努力中 呵呵....
作者: seakid    时间: 2014-6-6 14:00

作者: 天天好心情亲    时间: 2014-10-16 03:28
楼主 可以分享一下全部程序吗? 因为正在学习摄像头 不过现在还不会写程序!!1920367503@qq.com    谢谢啦!!!
作者: longerhaha    时间: 2014-10-25 21:59
感觉楼主好屌,求罩
作者: 命起涟漪    时间: 2014-10-26 23:42
;P;P
作者: 大海奋斗...    时间: 2014-11-4 13:48
新手  谢谢楼主   




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2