机器视觉行业里面,相机作为最重要的图像传感器,除了主要的拍摄功能外,它也承担了一部分信号控制功能.
一方面能够接受外部的触发信号例如PLC、光电传感器等,进行指定时刻拍照;另外一方面,能够输出IO信号,控制外围机构进行机械运动;
海康标准工业相机,支持1路GPIO输入,1路GPIO输出,一路可配置的IO输出(非光耦),本文主要讲一下如何使用SDK进行IO配置以及注意事项

IO输入的主要作用就是,相机通过IO管脚,收到1个IO信号,相机就立即拍摄一帧图像;
通用的使用方法如下代码依次设置:

  • 触发模式:TriggerMode设置为1,开启触发模式
  • 触发源选择:TriggerSource设置为0,选择line0,也可以选择line2,或者选择anyway;line0、line2取决于硬件电路接线,anyway支持软触发、硬触发同时使用,需要看相机是否支持
  • 沿信号TriggerActivation:默认上升沿触发(可以不设置)
  • 触发缓存TriggerCacheEnable:默认不开启。当相机同时收到两个触发信号时,不开启此功能,相机只会响应1个信号,出一张图;开启后,相机会自动缓存第二个信号,上个信号处理完毕后,立即处理缓存信号
  • 触发延时TriggerDelay:收到信号后,固定延迟一段时间再曝光
  • 滤波设置 LineDebouncerTime:去除信号毛刺抖动,根据实际情况进行调节
//C语言代码段:硬触发模式初始化配置
//参数值,仅针对海康工业相机,其他品牌相机需根据对应节点微调
nRet = MV_CC_SetEnumValue(handle, "AcquisitionMode", 2);
//0:SingleFrame 1:MultiFrame 2:Continuous 
nRet = MV_CC_SetEnumValue(handle, "TriggerMode", 1);//0:off 1:on
nRet = MV_CC_SetEnumValue(handle, "TriggerSource", 0);//line2也可做输入源,非光耦
//0:Line0 1:Line1 2:Line2  7:Software 8:FrequencyConverter 13:anyway
nRet = MV_CC_SetEnumValue(handle, "TriggerActivation", 0);//0:Rising Edge  1:Falling Edge 2:LevelHigh 3:LevelLow
nRet = MV_CC_SetFloatValue(handle,"TriggerDelay",0);//根据实际情况设置,默认0 us
nRet = MV_CC_SetBoolValue(handle,"TriggerCacheEnable",TRUE);//开启后会默认缓存1个信号
//滤波设置
nRet = MV_CC_SetEnumValue(handle, "LineSelector", 0);//0:Line0  2:Line2 
nRet = MV_CC_SetIntValue(handle,"LineDebouncerTime",10);//硬件滤波时间,可加大此参数防抖us

触发配置:
在这里插入图片描述
滤波:
在这里插入图片描述

IO输出,参考用法主要分为两类

  • strobe输出,配合频闪光源拍摄,IO输出跟随曝光,输出周期与曝光周期同步
  • software输出,用户自定义时刻输出,用户自主控制,必要时刻输出OK或NG信号
  1. strobe输出配合频闪光源,IO输出与曝光同步
    这里需要注意StrobeLineDuration、StrobeLineDelay、StrobeLinePreDelay三个参数,用于调节与光源同步;光源的LED从灭到亮有个响应时间,那么我们就需要适当的去调节StrobeLineDelay/StrobeLinePreDelay这两个值去做匹配,StrobeLineDuration是持续时间,可以不配置,也可以根据需要配置
//Strobe输出
nRet = MV_CC_SetEnumValue(handle, "LineSelector", 1);
//0:Line0 1:Line1 2:Line2 
nRet = MV_CC_SetEnumValue(handle, "LineMode", 8);//仅LineSelector为line2时需要特意设置,其他输出不需要
//0:Input 1:Output 8:Strobe 
int DurationValue=0,DelayValue=0,PreDelayValue=0;//us
nRet = MV_CC_SetIntValue(handle, "StrobeLineDuration",DurationValue);
//strobe持续时间,设置为0,持续时间就是曝光时间,设置其他值,就是其他值时间
nRet = MV_CC_SetIntValue(handle, "StrobeLineDelay",DelayValue);//strobe延时,从曝光开始,延时多久输出
nRet = MV_CC_SetIntValue(handle, "StrobeLinePreDelay",PreDelayValue);//strobe提前输出,曝光延后开始
//--------------------------------------------------------------------------------------------------
nRet = MV_CC_SetBoolValue(handle, "StrobeEnable",TRUE);//Strobe输出使能,使能之后,上面配置参数生效,IO输出与曝光同步
//Strobe输出,多用作点亮频闪光源,sensor快门类型为Global相机都支持,rolling需注意相机是否支持
  1. Software输出,IO输出与LineSource同步
//IO输出做NG信号用
//参数初始化
nRet = MV_CC_SetEnumValue(handle, "LineSelector", 2);
//0:Line0 1:Line1 2:Line2 
nRet = MV_CC_SetEnumValue(handle, "LineMode", 8);//仅line2需要设置
//0:Input 1:Output 8:Strobe 
nRet = MV_CC_SetEnumValue(handle, "LineSource", 5);
//0:ExposureStartActive 5:SoftTriggerActive  6:HardTriggerActive
int DurationValue=1000,DelayValue=0,PreDelayValue=0;//us
nRet = MV_CC_SetIntValue(handle, "StrobeLineDuration",DurationValue);
nRet = MV_CC_SetIntValue(handle, "StrobeLineDelay",DelayValue);//strobe延时,从曝光开始,延时多久输出
nRet = MV_CC_SetIntValue(handle, "StrobeLinePreDelay",PreDelayValue);//strobe提前输出,曝光延后开始
nRet = MV_CC_SetBoolValue(handle, "StrobeEnable",TRUE);
//Strobe输出使能,使能之后,上面配置参数生效,IO输出与LineSource同步
//-------------------------------------------------------------------------------------
//输出IO信号命令
nRet = MV_CC_SetCommandValue(m_handle, "LineTriggerSoftware");

这里会存在一个问题就是,海康部分相机,LineSource没有SoftTriggerActive的参数选项,那么就必须使用另外一种方法实现

  1. 电平反转,通过快速反转电平状态,来模拟一个信号输出
    当然这种控制电平变化时间做不到精确控制,只能适用于那种不太严格要求信号质量的场景
//电平反转
//IO输出做NG信号用
//参数初始化
nRet = MV_CC_SetEnumValue(handle, "LineSelector", 2);
//0:Line0 1:Line1 2:Line2 
nRet = MV_CC_SetEnumValue(handle, "LineMode", 8);//仅line2需要设置
//0:Input 1:Output 8:Strobe 
//信号输出----------------------------------------------------
nRet = MV_CC_SetBoolValue(handle, "LineInverter",TRUE);//电平反转,也可用作IO输出,连续两次翻转可以输出一个IO信号
Sleep(10);//延时就相当于电平持续时间,也可以不设置
nRet = MV_CC_SetBoolValue(handle, "LineInverter",false);
                                    海康工业相机IO触发输出操作说明1.相机I/O管脚接口定义2.相机line0输入接线方法2.1相机line0输入等效电路图2.2相机line0输入接线图2.3相机参数设置3相机line1输出接线方法3.1相机line1输出等效电路图3.2相机line1输出接线图3.3相机参数设置4相机line2可配置输入输出接线方法4.1 line2输入使用4.2 line2输出使用
1.相机I/O管脚接口定义
                                    MV-VB2210-120G视觉控制器的用户手册,MV-VB2210-120G 视觉控制器采用 Intel E3845 处
理器,4GB DDR3L 内存,专为机器视觉工业应用
开发,具有性能稳定、结构紧凑、反应快速等特
点。适用于机器人、数控机床等应用场景。
                                    海康机器人工业相机常用参数功能设置与获取(C语言)前言DeviceControlImageFormatControlAcquisitionControlDigitalIOControlActionControlFileAccessControlEventControlChunkDataControlTransportLayerControlUserSetControl
DeviceControl
ImageFormatControl
AcquisitionControl
DigitalIOContro
                                    由于学校实验室需要用到Basler相机,然而网上Basler相机的说明文档是全英文的,对新手不太友好,而且国内关于Basler的硬件触发代码没有。在研究了Basler相机的SDK之后总结出了触发的驱动,还有照片与OpenCV格式转换的代码,希望可以对你们有帮助。https://www.jianshu.com/p/cee63023b8c7
Ubuntu14.04
	Pylon5.0.5
	OpenCV3.4.14
	相机型号acA1600-60gm/acA2500-14gm
以上就是事件机制的最基本结构,事件从事件生产者流向事件消费者,整个过程传递的是事件这一信息载体。一般用作于某种情况发生时的即时响应。
2、如何理解事件机制
对于工业相机而言,事件机制在很多方面均有体现:图像回调、异常回调、事件回调等等。其中最常见的就是图像回调,当相机发送一张图像到达底层驱动,此时在底层驱动(事件生产者)处发生了“驱动端收到一张图像”这一事件,那么对应的图像回调函数(事件消费者)就