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

背景

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

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

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

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

相关推荐
博图光电33 分钟前
Libra 27105相关技术参数
人工智能·数码相机
数智工坊7 小时前
视觉SLAM第5讲|相机成像模型:针孔投影、畸变修正与深度感知全拆解
人工智能·深度学习·数码相机·机器人
高升说10 小时前
多路相机带宽与存储怎么算?从单路码率到盘位规划的完整链路
人工智能·数码相机
数字融合20 小时前
透明化视频三维矿山井下照明重建技术
人工智能·python·数码相机
咯哦哦哦哦1 天前
opencv复现 Halcon 双相机拼接
人工智能·数码相机·opencv
FLJwu1 天前
运动相机按键与连接器硬件选型实战02:USB‑C接口选型|防水失效、虚接断连、腐蚀烧口量产大坑
c语言·开发语言·经验分享·数码相机·相机·运动相机·oem 量产
CV工程师丁Sir1 天前
ArkWeb 手记 08|H5 权限弹窗:相机、定位授权接管
数码相机·华为·harmonyos
机建狂魔2 天前
徕卡一瞬小米相机预设包导入教程:全机型通用指南
数码相机
墨天梦2 天前
B13_通知图片相机与影音
android·数码相机·kotlin
m0_738185822 天前
Flutter 鸿蒙化实战:qrcode_flutter 适配 OpenHarmony,二维码生成与识别
数码相机·flutter·华为·harmonyos·鸿蒙