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

背景

这一片主要是对第三篇继续补充。话说上一篇讲到了两种模式的切换,上一篇还遗留了一个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

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

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

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

相关推荐
工业相机定制与开发5 天前
短波红外相机KGSMT30GI在食品与光伏产业中的应用优势
数码相机
雪人不是菜鸡5 天前
MTF曲线图分析
数码相机
雪人不是菜鸡5 天前
镜头分辨率分析
人工智能·数码相机·计算机视觉
chencao1005 天前
相机十参数标定
数码相机
qq_526099135 天前
图像采集卡:机器视觉系统的“数据中枢”,解锁精准成像新可能
图像处理·数码相机·计算机视觉·自动化
格林威6 天前
Baumer相机金属粉末铺粉均匀性评估:用于增材制造过程监控的 7 个实用技巧,附 OpenCV+Halcon 实战代码!
人工智能·opencv·视觉检测·制造·工业相机·智能相机·堡盟相机
格林威6 天前
Baumer相机镜面反射区域遮蔽重建:恢复缺失纹理的 6 个关键技术,附 OpenCV+Halcon 实战代码!
人工智能·opencv·计算机视觉·视觉检测·工业相机·智能相机·堡盟相机
Hcoco_me8 天前
车载摄像头核心知识点结构化总结
人工智能·深度学习·数码相机·算法·机器学习·自动驾驶
systeminof11 天前
谷歌发布Pixel 10a:升级有限,售价维持499美元
数码相机
LabVIEW开发11 天前
LabVIEW列车轴承声学成像应用
数码相机·labview·labview知识·labview功能·labview程序