有无图像没图像
是否黑屏黑屏,白屏,花屏
是否亮灯亮红灯
是否开机不开机
故障设备找不到相机
Basler Pylon工业相机SDK的使用
Pylon库有C++ .Net等各种封装版本,一般用C++版本,功能全面效率高,但对于不同接口(GigE USB3.0 CameraLink)的相机必须对应使用不同的类,之间不能通用。
基于GenAPI通用相机抽象接口使用的是Node结构,以字符串形式访问相机参数,可以统一管理不同接口类型的相机。但效率低,使用不方便。
Pylon高层用C++封装,形成本地相机对象
如何管理多个相机,靠谱的方法是按相机ID标定顺序,需要读一个配置文件,比如XML或JSON,然而一开始不知道ID,需要先列举出来。
下面是其中对于不同的工作要求,加载相机对象和卸载相机对象是通用的。而要使用其他模块,如事件对象时,相应的改为加载事件对象和卸载事件对象,以及使用事件对象完成相关任务即可。编程时一定要对整个流程做好规划,特别是硬件编程时一定留意内存泄露,前面分配的资源一定要在后面释放。
下面是五个大流程的详细解析,需要的地方已经加以说明,并注解了需要用到的函数
加载相机对象:
卸载相机对象:
加载数据流抓取对象:
卸载数据流抓取对象:
单帧或连续抓图过程:
按照以上介绍的流程即可实现实时图像采集:
很多人问我要源代码,翻了以前的程序文件夹找到了这个程序,演示了利用Pylon SDK进行相机采集的过程,使用MIL完成界面显示,采集部分封装成了类,可以直接重用。测试相机为Basler相机。注意Pylon仅完成Raw Data的采集,使用MIL的MbufPut完成图像数据的重组,然后MIL自动显示。
工作流程:
当相机工作时,就是连续的采集-处理-采集-处理...的过程,但是这就存在一个问题,如果采集的速度比处理速度快,处理不过来,怎么办?在实际中,我们使用队列来解决这个问题,当前帧没有处理完,下一帧到来时直接放入队列等待当前处理完成后再处理它。
需要说明如下几点:
1.这里的初始队列为1-10,都是初始分配为DMA队列的,这个内存分配和释放过程有的SDK是自己负责的,有的则需要用户自己分配和释放,SDK只负责托管使用。
2.一般开始注册一个中断处理函数,当“准备队列”填充完成会自动跳转到中断函数中,借此完成同步操作。也可以是用户自己维护同步结构体,使用查询和等待的方式判断“准备队列”头是否填充完成,是否该用户程序获取数据和处理了。
3.如果用户处理任务非常简单,可以去掉“处理队列”,每次直接GetFrame->处理->PutFrame。如果用户处理任务比较复杂而不希望出现丢帧的现象,则需要用户使用“处理队列”来保存所有可用的Buffer。
4.这里队列也只是能够解决处理速度比采集速度慢少许的情况,主要是对不同处理速度做平均来保证采集和处理同步。如果每一帧的处理时间太长,这时候“DMA队列” Buffer全部转移到“处理队列” Buffer,就会出现异常情况,这时不同的相机会有不同的处理方法。
http://www.dianlubanweixiu.cn