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

背景

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

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

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

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

相关推荐
大江东去浪淘尽千古风流人物20 小时前
【VGGT】统一3D重建:单网络同时预测相机位姿、深度图、点云与3D轨迹的前馈Transformer架构深度解析
网络·数码相机·3d·transformer·slam·3d重建·cvpr2025
CG_MAGIC20 小时前
摄像机与渲染输出:焦距、景深与Cycles/Eevee渲染设置
数码相机·3d·贴图·效果图·建模教程·渲云渲染
蝈蝈Tjguo1 天前
opencv 与摄影测量 相机坐标系的区别
人工智能·数码相机·opencv
埃科光电3 天前
打通全场景检测痛点UB系列相机赋能多元智造场景
图像处理·数码相机·计算机视觉·制造·相机
LabVIEW开发4 天前
LabVIEW 做双目视觉测距?精度不输激光雷达!
人工智能·数码相机·计算机视觉·labview·labview知识·labview功能·labview程序
qq_526099134 天前
双目立体视觉相机技术原理、性能影响因素与工业应用研究
数码相机
3DVisionary4 天前
高温下钢管如何测应变?数字散斑DIC高温压缩测试方案
数码相机·学习·全场应变测量·实验力学·数字散斑dic·高温材料测试·钢管轴向压缩
ZPC82105 天前
相机内参矩阵逐元素详解
数码相机
gaosushexiangji5 天前
基于低噪声sCMOS相机的PALM超分辨率成像实验
数码相机
Angelina_Jolie5 天前
深度图转换为3D点云
数码相机·计算机视觉·3d