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

背景

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

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

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

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

相关推荐
于海风微醺3 天前
工业相机选型
数码相机·相机
QYR_115 天前
年复合增长率11.4%!机器人指端视触觉传感器加速迈向规模化应用
人工智能·数码相机
大熊背5 天前
LV值计算的注意事项
数码相机·apex·自动曝光·lv
敢敢のwings6 天前
SimpleMemVLA 深度解读:把原生视频上下文变成机器人的记忆
数码相机·机器人·音视频
敢敢のwings6 天前
Super Odometry 2.0:相机与激光雷达退化后,机器人如何继续估计运动
人工智能·数码相机·机器人
高升说7 天前
手眼方案怎么选:眼在手上与眼在手外的工程对比
人工智能·数码相机
come112347 天前
手机与相机拍照入门
数码相机·智能手机
鹿野素材屋7 天前
U3D切换场景时候变黑怎么处理
数码相机·3d
GlobalInfo7 天前
2026年全球机器人用超平执行器市场研究报告:市场规模达7.51亿美元,人形机器人商业化与轻量化运动控制需求推动行业增长
大数据·人工智能·数码相机·microsoft·机器人
LaughingZhu8 天前
Product Hunt 热榜 2026-11-02:Screen Studio 4.0、ClawsGO Science、Riverside Agents
人工智能·深度学习·神经网络·数码相机·搜索引擎·百度