有无图像没图像
是否黑屏黑屏,白屏,花屏
是否亮灯亮红灯
是否开机不开机
故障设备找不到相机
这里使用三个队列完成采集和处理同步。
dma队列:
当cmos或ccd芯片曝光然后将数据转到相机缓存后,这时候dma会负责将缓存中数据写入到“dma队列”头buffer中。
准备队列:
一旦“dma队列”头buffer被填充完成,会被加到“准备队列”尾后,这时候会发送中断通知用户程序:当前又有一帧数据采集完成,您看着处理吧。
处理队列:
当用户接收到中断会自动跳转到中断函数中,使用getframe拿取“准备队列”头buffer,然后加到当前用户程序“处理队列”尾,用户程序从“处理队列”头拿取buffer处理完成后使用putframe将buffer再添加到原始的“dma队列”尾。
三、 basler pylon工业相机sdk的使用
pylon库有c++ .net等各种封装版本,一般用c++版本,功能全面效率高,但对于不同接口(gige usb3.0 cameralink)的相机必须对应使用不同的类,之间不能通用。
基于genapi通用相机抽象接口使用的是node结构,以字符串形式访问相机参数,可以统一管理不同接口类型的相机。但效率低,使用不方便。
pylon高层用c++封装,形成本地相机对象
如何管理多个相机,靠谱的方法是按相机id标定顺序,需要读一个配置文件,比如xml或json,然而一开始不知道id,需要先列举出来。
3.中断响应操作
当相机一帧采集完成后,自动跳转进入中断回调函数,这里分了两种中断回调函数。
种为简单的取buffer->处理->放回。
第二种结合windows的消息队列,在此处再给一个“处理队列”,给处理一个缓冲时间。
这里的处理包括常见的图像处理、计算和显示及rawdata拼装为图像等用到buffer的地方。
前面也说过,常用的是中断响应处理,除此之外,自己去查询buffer填充状态并作相关同步操作在某些场合也会用到,这个请查询不同相机sdk给出的同步方案。
差不多所有的工业相机sdk都是这样的编程模型和流程,avt 1394相机和basler camera link相机和avt gige相机相关代码在笔者网站可下载,还有之前讲的basler pylon sdk相机编程,他们基本流程都是一样,恕不详述!
二、 工业相机sdk接口使用总结
相机调用 :
我们利用相机采集图像,首先要对相机进行相关参数设置及控制,这需要对相机的sdk包比较了解,一般相机厂家都会提供相机sdk,其中包含用户手册和调用demo,这些都大大降低了调用门槛,提高了二次开发用户的效率。目前用过balser、海康、大华等相机,其实都是一个套路,都是按照下面几个步骤进行的。
1)枚举设备
2)创建句柄
3)打开设备
4)开始抓图
5)获取一帧并保存图像
6)停止抓图
7)关闭设备
8)销毁句柄
相机同步:
若是开发过程中用到双目或者多目的话,则需要外接同步触发器或者外部触发信号,通过相机同步触发线来实现同步问题。以实际应用过的basler aca1300-200uc为例,其相机同步触发线具体类型如下:
1 -—— +12 vdc 红
2 —— i/o input 1 黄
3 —— vcc(加电阻) 蓝
4 —— i/o out 1 绿
6 —— dccam power gnd 黑
0000—— i/o gnd 白
苏州技优电子技术服务有限公司
18112603420
qq: 1971266479