天天看点

Lab 相关---四相机同步拍摄说明1. 前言2. 处理流程

1. 前言

这部分是我们所做的实验室图像采集系统中的一个功能模块。 我们的相机采集系统本来是可以直接进行采图存图操作的, 但是并不保证同步, 或者说他们之间的同步性能并不高。 由于, 老板要求实现精确的同步采图功能, 所以这个模块需要我们进行修改。

2. 处理流程

2.1 查阅资料

因为这是一个新的项目需求, 我们就想从相机的角度出发, 看看相机自身有没有给我们提供了这个一个相关的处理方法, 如果有的话, 那么问题就好办了。通过查阅相机的文档说明, 我们发现我们使用的这个相机 有两种工作模式:

  1. freerun 自由工作模式
  2. SyncIn1 (硬件控制)触发工作模式
    Lab 相关---四相机同步拍摄说明1. 前言2. 处理流程
    从这个图中, 我们可以看到我们可以设置相机的SyncIn1 模式下的触发事件, 当他为上升沿触发的时候, 就进行采图。

ie, 我们之前一直使用的工作模式是 freerun 工作模式, 在这个模式下面可以实现相机的采图存图功能, 但是同步性能不佳。

这个SyncIn1 工作模式给我们提供了一个思路, 可以通过硬件来解决这个同步触发的问题。

2.2 触发器使用

很显然的, 我们需要一个可以发射脉冲的工具, 在这里就是我们所用到的触发器了。当然这里还涉及到触发器的控制, 这个其实就是串口通信部分的内容了。常用的串口通信的解决方案有这么两种:

  1. 直接利用 ms 的mscomm 控件来实现, 不过这个控件在 vs2013 中并不是自带的,需要额外注册, 配置
  2. 使用网上的开源工具类 CSerialPort, 这个工具类提供了串口通信的基本功能, 我们看了下里面最核心的函数其实还是 createFileEx

2.3 剩余的问题

到这里, 同步拍摄的原理已经缕清楚了, 实现起来也相对比较容易。不过当我们使用相机来拍摄一个计时中的秒表的时候

Lab 相关---四相机同步拍摄说明1. 前言2. 处理流程

最后两位信息有时候还是不同步。ie, 存在100ms左右的时间差。

但是这是为什么呢? 原理上使用触发器进行触发, 所有相机收到的都是同一个触发脉冲, 所有相机都是统一型号, 理论上不该有这么大的时间差。

后来经过调试发现, 问题出在相机的帧缓存中。

由于我们的相机底层是通过维护一个 5 帧大小的帧队列来负责图像的正常更新显示的, 当我们抓取图片的时候, 我们可能是抓取到了这个队列中的任意一个, 由此导致出现时间差。

在明白了这点之后, 我们只需要在抓取图片之前清空掉栈的缓存, 这样就可以保证抓取到的图片就是我们的触发脉冲发射过来的这个时间点上所抓取到的图片了。

继续阅读