福州大学第19届206智能车队摄像头培训 三、帧率和快门时间
原文于2023.10.25发布于本人CSDN主页,现同步至cnblogs
1.摄像头帧率
某天看了学弟学妹们练习PID编写的程序,为了降低串口通信的频率在int main() while(1)内用了delay函数。实际上在未来实际应用中是不可取的。
在平时的单片机工程中,delay函数只会暂停主函数中的程序,不会影响定时器。需要循环执行的任务只需丢进设定好周期的定时器中断即可。
但在逐飞的开源库中,CPU0主循环中是这么个东西:
if(mt9v03x_finish_flag)
{
//循环执行的代码
mt9v03x_finish_flag = 0;
}
显然,需要等待每次CPU0主循环结束后,摄像头才会采集下一帧图像。这样的合理性在于:图像处理运算时间长、同时也是智能车控制的核心内容,只要将图像处理的内容写在CPU0主循环中,即可实现一帧图像只识别一次,且一次识别中不会采集下一帧图像(图像数组变动)。这样就最大限度提高了摄像头的工作效率。
不建议使用较长时间delay的原因也在于此:在delay的时间内,定时器中断服务中的电机还在使能,主函数中的摄像头采集与处理却呆住了,车就容易跑飞。
由上所述,此时图像处理的帧率就取决于硬件上限、配置参数上限,以及CPU0主循环中程序消耗的时间(忽略CPU0的中断服务耗时)。
现在需要测量帧率,有这么几种办法:
(1)逐飞库函数
void system_start (void)
uint32 system_getval (void)
(2)CPU0主循环每进行一次,翻转一路io,将该路io接上示波器,即可测出帧率。
(3)没有条件使用示波器或者硬件设计没有引出多余io的时候,CPU0主循环每进行几次,翻转一次最小系统板载LED灯的io。通过LED灯闪动的频率,就可以计算出摄像头的帧率。
2.电子快门与信号
MT9V03X作为智能车竞赛使用的主流摄像头CMOS(逐飞科技总钻风、龙邱科技神眼、呆萌侠电子虎眼),优势在于其全局快门( Global Shutter)功能。对比传统卷帘快门(如OpenMV中常见的OV7725)的逐行曝光模式,全局快门可以避免智能车在高速移动下图像产生的果冻效应。
全局快门原理示意图
卷帘快门原理示意图
果冻效应示意图
全局快门的缺点在于,在同为CMOS电路前提下,其帧率上限低于卷帘快门(卷帘快门逐行读取而不是等待整幅图像曝光完成后读出,每行读出之间的时间延迟很小,每个单独行能够在完成前一帧的读出后开始下一帧的曝光,所以最大化帧速率)。同时,额外的采样保持单元引入了新的噪音源;负责将光学模拟信号转换为数字信号的A/D转换器需要同时处理更多的像素;同时曝光的相邻行像素点干扰增多,上述这些缺陷造成了噪点增多,信号易失真的问题。
在没有条件改变摄像头电路与快门方式的情况下,应该避免使用冗长的连接排线,摄像头转接板针脚保持洁净无腐蚀,PCB设计应考虑信号抗干扰、且尽量避免与其他模块共Vcc。
顺带一提,19届智能汽车摄像头组中鼓励使用线性CCD,因为CCD型感光元件相比CMOS型通常均为全局快门,CCD的最终帧速率受到单个像素数字化传输的速率的限制,传感器中传输的像素越多,相机的总帧速率就越慢。而线性CCD只有一行像素,可以实现极高的帧率。