海康工业相机SDK基于C#关于IO输入输出的控制

前言

海康工业相机功能模块sdk提供了很多相机的接口,本文主要介绍下相机的io相关的控制。例如在通过io输入触发相机拍照。通过io输出传递拍照成功,或者存图成功的信号等。

IO输入

IO输入的主要作用就是,相机通过IO管脚,收到1个IO信号,来触发相机拍照;

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

    与MVS对应:

IO输出

输出可以输出事件也可以控制光源:

  • strobe输出,配合频闪光源拍摄,IO输出跟随曝光,输出周期与曝光周期同步
  • software输出,用户自定义时刻输出,用户自主控制,必要时刻输出OK或NG信号(事件)

strobe输出配合频闪光源:IO输出与曝光同步

//Strobe输出
nRet = m_MyCamera.MV_CC_SetEnumValue_NET( "LineSelecto_NETr", 1);
//0:Line0 1:Line1 2:Line2 
nRet = m_MyCamera.MV_CC_SetEnumValue_NET("LineMode", 8);//仅LineSelector为line2时需要特意设置,其他输出不需要
                                                 //0:Input 1:Output 8:Strobe 
int DurationValue = 0, DelayValue = 0, PreDelayValue = 0;//us
nRet = m_MyCamera.MV_CC_SetIntValue_NET("StrobeLineDuration", (uint)DurationValue);
//strobe持续时间,设置为0,持续时间就是曝光时间,设置其他值,就是其他值时间
nRet = m_MyCamera.MV_CC_SetIntValue_NET("StrobeLineDelay", (uint)DelayValue);//strobe延时,从曝光开始,延时多久输出
nRet = m_MyCamera.MV_CC_SetIntValue_NET("StrobeLinePreDelay", (uint)PreDelayValue);//strobe提前输出,曝光延后开始
                                                                      //--------------------------------------------------------------------------------------------------
nRet = m_MyCamera.MV_CC_SetBoolValue_NET("StrobeEnable", true);//Strobe输出使能,使能之后,上面配置参数生效,IO输出与曝光同步
//Strobe输出,多用作点亮频闪光源,sensor快门类型为Global相机都支持,rolling需注意相机是否支持

Software输出,IO输出与LineSource同步

//IO输出做NG信号用
//参数初始化
nRet = m_MyCamera.MV_CC_SetEnumValue_NET( "LineSelector", 2);
//0:Line0 1:Line1 2:Line2 
nRet = m_MyCamera.MV_CC_SetEnumValue_NET( "LineMode", 8);//仅line2需要设置
                                                 //0:Input 1:Output 8:Strobe 
nRet = m_MyCamera.MV_CC_SetEnumValue_NET( "LineSource", 5);
//0:ExposureStartActive 5:SoftTriggerActive  6:HardTriggerActive
int DurationValue1 = 1000, DelayValue1 = 0, PreDelayValue1 = 0;//us
nRet = m_MyCamera.MV_CC_SetIntValue_NET("StrobeLineDuration", (uint)DurationValue1);
nRet = m_MyCamera.MV_CC_SetIntValue_NET( "StrobeLineDelay", (uint)DelayValue1);//strobe延时,从曝光开始,延时多久输出
nRet = m_MyCamera.MV_CC_SetIntValue_NET( "StrobeLinePreDelay", (uint)PreDelayValue1);//strobe提前输出,曝光延后开始
nRet = m_MyCamera.MV_CC_SetBoolValue_NET( "StrobeEnable", true);
//Strobe输出使能,使能之后,上面配置参数生效,IO输出与LineSource同步
//-------------------------------------------------------------------------------------
//输出IO信号命令
nRet =m_MyCamera. MV_CC_SetCommandValue_NET("LineTriggerSoftware");

电平反转,通过快速反转电平状态,来模拟一个信号输出
当然这种控制电平变化时间做不到精确控制,只能适用于那种不太严格要求信号质量的场景

//电平反转
//IO输出做NG信号用
//参数初始化
nRet = m_MyCamera.MV_CC_SetEnumValue_NET( "LineSelector", 2);
//0:Line0 1:Line1 2:Line2 
nRet = m_MyCamera.MV_CC_SetEnumValue_NET("LineMode", 8);//仅line2需要设置
                                                 //0:Input 1:Output 8:Strobe 
                                                 //信号输出----------------------------------------------------
nRet = m_MyCamera.MV_CC_SetBoolValue_NET("LineInverter", true);//电平反转,也可用作IO输出,连续两次翻转可以输出一个IO信号
Thread.Sleep(10);//延时就相当于电平持续时间,也可以不设置
nRet = m_MyCamera.MV_CC_SetBoolValue_NET("LineInverter", false);

本文参考了其他的博主的C语言版本,侵权删https://blog.youkuaiyun.com/qq_23107577/article/details/114106514?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%B5%B7%E5%BA%B7sdk%20io&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-114106514.142^v94^insert_down28v1&spm=1018.2226.3001.4187

### 实现海康威视工业相机IO触发拍照并保存图像 为了实现这一功能,在C#环境中需利用海康威视提供的SDK来设置触发模式为外部硬件触发(即IO触发),并通过回调函数获取拍摄到的数据,最后将其转换成位图格式进行存储[^1]。 #### 配置说明 在开始编码之前,确保已经安装了海康威视官方提供的开发包,并按照文档指导完成了必要的环境搭建工作。对于具体的编程部分,则主要依赖于`MvCamCtrl.NET`命名空间下的类库来进行操作[^3]。 #### 关键代码示例 下面给出一段简化版的关键代码片段用于展示如何完成上述需求: ```csharp using System; using MvCamCtrl.NET; public class CameraController { private IntPtr handle; // 设备句柄 public void Initialize() { // 初始化设备... SetTriggerMode(); } /// <summary> /// 设置触发模式为IO触发 /// </summary> private void SetTriggerMode(){ int nRet = MV_CC_SetEnumValue(handle,"TriggerSelector",0); //选择帧启动作为触发源 if (MV_OK != nRet){ Console.WriteLine("Set TriggerSelector fail!"); return ; } nRet = MV_CC_SetEnumValue(handle,"TriggerSource",2); //设置触发源为线路输入(Line2),具体数值可能因型号而异,请参照API手册确认 if (MV_OK != nRet){ Console.WriteLine("Set TriggerSource fail!"); return ; } nRet = MV_CC_SetEnumValue(handle,"TriggerMode",1); //开启触发模式 if (MV_OK != nRet){ Console.WriteLine("Enable trigger mode fail!"); return ; } } /// <summary> /// 开始采集数据,并注册回调方法处理接收到的信息 /// </summary> public void StartCapture(Action<byte[],int> callback){ // 注册回调事件处理器... RegisterImageCallback(callback); // 启动连续抓拍... MV_CC_StartGrabbing(handle); } /// <summary> /// 停止采集 /// </summary> public void StopCapture(){ MV_CC_StopGrabbing(handle); UnregisterImageCallback(); } /// <summary> /// 处理接收到的一帧图像数据 /// </summary> /// <param name="data">原始字节数组</param> /// <param name="size">图像大小</param> private void HandleFrame(byte[] data,int size){ Bitmap bitmap = ConvertToBitmap(data,size); // 转换成位图对象 SaveToFile(bitmap); // 存储文件至磁盘 } /// <summary> /// 将二进制流转化为位图形式 /// </summary> protected abstract Bitmap ConvertToBitmap(byte[] rawData, int imageSize); /// <summary> /// 把生成好的位图保存下来 /// </summary> protected virtual void SaveToFile(Bitmap image){ string path = $"./images/{Guid.NewGuid().ToString()}.bmp"; image.Save(path,System.Drawing.Imaging.ImageFormat.Bmp); } } ``` 这段程序展示了基本框架的设计思路以及核心逻辑的实现方式。实际应用中还需要考虑更多细节问题,比如错误处理机制、性能优化等方面的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值