【工控】线扫相机小结 第四篇

背景

这一片主要是对第三篇继续补充。话说上一篇讲到了两种模式的切换,上一篇还遗留了一个Bug,在这一篇里进行订正!

代码回顾

csharp 复制代码
/// <summary>
 /// 其实就是打开触发
 /// </summary>

 void SetLineSacanWorkMode()
 {
 	-----首先设置为帧触发
 	int result = device.Parameters.SetEnumValueByString("ScanMode", "FrameScar");
	if (result != MvError.MV_OK)
	{
    	ShowErrorMsg("Set ScanMode Fail!", result);
	}
     //----------------打开帧触发
     result = device.Parameters.SetBoolValue("FrameTriggerMode", true);
     if (result != MvError.MV_OK)
     {
         ShowErrorMsg("Set FrameTriggerMode Fail!", result);
     }


     //帧触发:触发源
     result = device.Parameters.SetEnumValueByString("FrameTriggerSource", "Software");
     if (result != MvError.MV_OK)
     {
         ShowErrorMsg("Set FrameTriggerSource Fail!", result);
     }


      result = MvError.MV_OK;
     //----------------打开行触发
     result = device.Parameters.SetBoolValue("LineTriggerMode", true);
     if (result != MvError.MV_OK)
     {
         ShowErrorMsg("Set LineTriggerMode Fail!", result);
     }

     //行触发:触发源
     result = device.Parameters.SetEnumValueByString("LineTriggerSource", "FrequencyConverter");
     if (result != MvError.MV_OK)
     {
         ShowErrorMsg("Set LineTriggerSource Fail!", result);
     }     
 }

-------------------------------------------------------------------------------------------------------------------------
 void SetLineSacanDebugMode()
 {
     //-----首先设置为帧触发
 	int result = device.Parameters.SetEnumValueByString("ScanMode", "FrameScar");
	if (result != MvError.MV_OK)
	{
    	ShowErrorMsg("Set ScanMode Fail!", result);
	}
     result = MvError.MV_OK;
     //----------------关闭帧触发
     //result = device.Parameters.SetEnumValueByString("TriggerSelector", "FrameBurstStart");
     result = device.Parameters.SetBoolValue("FrameTriggerMode", false);
     if (result != MvError.MV_OK)
     {
         ShowErrorMsg("Set FrameTriggerMode Fail!", result);
     }


     //----------------关闭行触发
     result = device.Parameters.SetBoolValue("LineTriggerMode", false);
     if (result != MvError.MV_OK)
     {
         ShowErrorMsg("Set LineTriggerMode Fail!", result);
     }

 }

踩坑1

这样会带来一个bug,第二次设置 ScanMode 的时候会报错!

csharp 复制代码
int result = device.Parameters.SetEnumValueByString("ScanMode", "FrameScar");

这是因为,有的参数,在相机已经开始采集的情况下,是无法设置成功的。比如这个 ScanMode

所以,切换设置的时候,先停止采集,然后再开始采集!

csharp 复制代码
 void LineSacanDebugSet(bool onoff)
 {
     if (onoff == true)
     {

         //先停止采集
         StopGrab();
         SetLineSacanDebugMode();
         //开始采集
         StartGrab();
     }
     else
     {
         //先停止采集
         StopGrab();
         SetLineSacanWorkMode();
         //开始采集
         StartGrab();
     }
     LineSacanDebugFlag = onoff;
 }

于是我再函数的外面增加了停止采集和开始采集。

这样改动之后,其实还解决了一个bug!

比如我现在是调试模式,此时帧触发和行触发都关闭了,相机处于图像不停发生送的状态 (详情参见《线扫相机小结 第二篇》)

此时如果直接切到工作模式,由于图像接收线程一直被触发,非常快,而SetLineSacanWorkMode()这个函数的调用时需要时间的。

所以会出现一些冲突:

比如,我此时 LineSacanDebugFlag 由true切换为false(调试模式切换为工作模式)但是循环还是处于调试模式的循环中。

这样就进入了不该进入的分支,应为此时其实还没进行帧促发。

所以先停止采集才是最优解!

踩坑2

编码器促发是可以设置方向的,正方向和反方向,已经任意方向。

你的运动扫描方向,要和这个编码器方向设置一致,不然会以为你的触发出问题了。

我就是因为方向设置反了,还以为第一次软触发失效了。

相关推荐
甄天13 小时前
VisionPro工业相机 硬触发操作前以及Vs实现
数码相机
房开民13 小时前
记录相机触发相关
数码相机
百度森森1 天前
【nuscenes数据集有关】
c++·数码相机·学习·ubuntu
非自律懒癌患者1 天前
图像正向扭曲反向扭曲
数码相机·计算机视觉
我想_iwant2 天前
unity中的交互控制脚本
数码相机·unity·交互
尤齐2 天前
相机在两个机械臂上安装方式比较
深度学习·数码相机·机器人
列兵阿甘2 天前
知微传感Dkam系列3D相机SDK例程篇:CSharp连接相机及保存数据
数码相机·3d
云卓SKYDROID2 天前
无人机传感器技术要点与难点解析
人工智能·数码相机·无人机·高科技·云卓科技·固件升级
双翌视觉2 天前
机器视觉中为什么优先选择黑白相机?
人工智能·数码相机·计算机视觉
格林威3 天前
面阵 vs 线阵相机:怎么选不踩坑?选型公式直接套用
人工智能·深度学习·数码相机·yolo·计算机视觉·视觉检测·相机