关于相机采集的同步与异步的问题经常被问到,这里写写我个人的一些理解。
背景知识
先说说相机采集过程中的常见几个词语,做做辨析。在各类文档中常见的关于采集的词有Capture, Acquisition, Grab,Digitize等这些词似乎都与采集相关。但这几个词又有稍有区别:
- Capture:表示光线经过镜头在传感器芯片(CMOS,CCD)上成像。
- Acquisition:表示由相机的控制器间隔一段时间就将芯片上的数据传输到相机buffer中。
- Grab:从相机的缓存Buffer中把数据取出来传到板卡。
- Digitize:把从相机buffer中拿到的模拟信号转化为相信量化的数字信号。
我们说的采集一般是指这四个过程的总称。
同步采集
简单的说,同步采集的过程中,图像的抓取(grab)和图像的处理(process)是顺序进行的,当抓取完成后,就开始生成HImage和接下来的图像处理,然后在处理结束后,继续等待下一个采集信号的到来,开始下一帧的抓取,顺序见下图:
上图中,采集信号是按相机设定的帧率的频率发送。同步采集可能会导致的问题是,如果图像处理结束后,错过了下一帧的信号,那就只好等待再下一帧的信号来了继续采集。从图中这种情况看,中间一帧的图像会“丢失”,这样的话实际的帧率可能就达不到相机设定的理论的帧率了。
异步采集
而异步操作中,抓取与处理两个步骤是可以分离的,并可以异步运行,即可以在抓取下一帧图像的同时对图像进行处理,流程见图2。异步采集的第一步调用与同步采集类似,差别在接收到图像之后,采集句柄去采集下一帧图像,而处理算子在处理好前一帧图像后继续处理下一帧。处理完成后,再调用异步采集,直到完成图像采集为止,这样就可以达到全帧的速率。
使用异步采集的时候,存储抓取图像与处理图像的应该是两块不同的存储区域,因此需要使用双缓存策略。
二者比较
- 同步采集:采集完后,处理图像,然后继续采集。采集的实际帧率受处理速度的影响。
- 异步采集:采集完后,立刻采集下一帧图像,同时进行当前帧的图像处理。实际帧率不受处理速度影响。
使用同步采集的时候,抓取的都是当前的图像,而异步采集的时候,读到的图可能是已经当前时间的前几帧图像。如果是拍摄运动物体,可能发生物体已经移动了,图像却还是移动之前的情况。为了避免这个问题可以考虑同步,或者也可以考虑采用多线程机制保证采集和处理的同步。