目录
- 2.2.1 流程操作:通过流程或Group设置输入输出图像的方法
- 2.2.2 模块操作:设置输入图像、参数和ROI
- 2.2.3 N点标定:清空标定点、生成标定文件
- 2.2.4 分支字符:控制调试模式开关的方法
- 2.2.5 条件检测:条件检测模块设置范围的方法
- 2.2.6 图像源:图像源模块输入图像的方法
- 2.2.7 所有流程:获取所有流程对象的方法
- 2.2.8 几何创建:绘制形状的方法
- 2.2.9 模板匹配:模板匹配模块导入算子模型文件的方法
- 2.2.10 图像源:通过SDK传入图像数据的方法
- 2.2.11 流程触发:在相机回调函数里短时间多次触发同一流程报错的解决方法
- 2.2.12 检测加密狗:检测加密狗有无的方法
2.2.1 流程操作:通过流程或Group设置输入输出图像的方法
描述
环境:VM4.2 + VS2013及以上
现象:如何在二次开发中设置流程输入输出图像
解答
打开流程的配置窗口,获取流程1的输出图像,将其设置为流程2的输入图像,虽然在VM中可以通过连线的方式实现,但也可以通过代码的方式实现,C#代码如下 。另外,通过Group设置输入输出图像也是调用同样的接口函数SetInputImage_V2()和GetOutputImageV2(),其中要注意的是,当用代码给流程输入图像时,流程中的其它模块的图像输入源需要订阅流程的图像参数。注意:Mat和Bitmap彩色图转流程输入时,Mat和Bitmap是BGR,流程输入图像是RGB,通道需要交换
C#
VmProcedure process = (VmProcedure)VmSolution.Instance["流程1"];
InputImageData vmImageData = new InputImageData();
//获取流程1输出图像
ImageBaseData_V2 image =process.ModuResult.GetOutputImageV2("out2");
//设置流程2输入图像
VmProcedure vmProcedure = VmSolution.Instance["流程2"] asVmProcedure;
vmProcedure.ModuParams.SetInputImage_V2("ImageData", image);
问题根因
不熟悉二次开发设置流程输入图像的方法。
2.2.2 模块操作:设置输入图像、参数和ROI
描述
环境:VM4.2+ VS2013及以上
现象:在VM SDK二次开发中,如何设置指定模块的输入图像、模块参数及ROI区域?
解答
首先,我们需要知道,一个VM模块的输入包含几个部分:基本参数(图像输入、ROI区域)、运行参数,以圆查找为例,如下图所示:
通过VM SDK二次开发,我们可以通过代码去修改指定模块的输入参数。注意:设置输入参数(基本参数),参数配置窗口界面不会显示所设置的参数,此时模块运行,参数永久有效,流程运行,参数一次有效;设置运行参数,参数配置窗口界面会显示所设置的参数,此时模块和流程运行,参数都永久有效
1、设置模块输入图像,以“圆查找模块”为例,首先,添加相应的命名空间IMVSCircleFindModuCs,实现代码如下:
C#
Mat mat = Cv2.ImRead(path, ImreadModes.Grayscale); //调用OpenCv方法读取图像数据,这里的path为图片路径
InputImageData inputImageData = new InputImageData();//实例化一个输入图像对象
inputImageData.Names.DataName = "InImage";//只能使用默认名称InImage
inputImageData.Names.HeightName = "InImageHeight";//默认InImageHeight
inputImageData.Names.WidthName = "InImageWidth";//默认InImageWidth
inputImageData.Names.PixelFormatName = "InImagePixelFormat";//默认InImagePixelFormat
inputImageData.Data = mat.Data;
inputImageData.DataLen = (uint)(mat.Width * mat.Height);
inputImageData.Height = mat.Height;
inputImageData.Width = mat.Width;
inputImageData.Pixelformat = ImagePixelFormat.IMAGE_PIXEL_FORMAT
_MONO8;
IMVSCircleFindModuTool circleFindModuTool = VmSolution.Instance["流程1.圆查找1"] as IMVSCircleFindModuTool;//实例化指定的模块工具
circleFindModuTool.ModuParams.SetInputImage(inputImageData);//设置输入图像
2、设置指定模块运行参数,以“圆查找模块”为例,设置对象中ModuParams的属性,代码如下:
C#
IMVSCircleFindModuTool circleFindModuTool = VmSolution.Instance["流程1.圆查找1"] as IMVSCircleFindModuTool;//实例化指定的模块工具
circleFindModuTool.ModuParams.EdgeThresh = 30;//设置边缘阈值为30
3、设置指定模块的ROI区域,代码如下。
C#
IMVSCircleFindModuTool tool = (IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];
RectBox rectBox = new RectBox(new VM.PlatformSDKCS.PointF(1000, 1000), 500, 500, 0);
tool.ModuParams.ModuRoiManager.RoiRectangle = rectBox;//代码设置ROI
问题根因
不了解VM SDK二次开发中模块结构,以及如何对其参数进行相应的修改。
2.2.3 N点标定:清空标定点、生成标定文件
描述
环境:VM4.2 + VS2013及以上
现象:VM二次开发如何设置对应的N点标定模块的清空标定点与生成标定文件的功能
解答
C#
//获取对应的模块实例
IMVSNPointCalibModuTool tool=(IMVSNPointCalibModuTool)VmSolution.Instance["流程1.N点标定1"];
tool.ModuParams.DoClearPoint();//清空标定点
tool.ModuParams.DoSaveFile(path);//根据路径保存标定文件
int i = tool.ModuResult.ModuStatus;//获取标定状态,1为成功,0为失败
问题根因
不熟悉模块的函数
2.2.4 分支字符:控制调试模式开关的方法
描述
环境:VM4.2 + VS2013及以上
现象:VM二次开发如何设置分支字符模块的调试模式
解答
C#
//获取对应的模块实例
BranchStringCpmLTool tool = (BranchStringCpmLTool)VmSolution.Instance["流程1.分支字符1"];
List<BranchStringItemParam> itemList = tool.ModuParams.GetBranchStrItemParamList();//获取所有分支
foreach( var item in itemList)
{
item.IsDebugMode = false; //可根据需求将某一个分支关闭调试模式
}
问题根因
不熟悉分支字符工具及其接口。
2.2.5 条件检测:条件检测模块设置范围的方法
描述
环境:VM4.2 + VS2013及以上
现象:VM二次开发如何设置条件检测模块的范围值
解答
修改前:
执行代码:
//C#
//获取对应的模块实例
IfModuleTool tool = (IfModuleTool)VmSolution.Instance["流程1.条件检测1"];
//获取对应的检测项名称
IfItemParam item1 = tool.ModuParams.GetIfItemParam("int0");
IfItemParam item2 = tool.ModuParams.GetIfItemParam("float0");
//对检测范围进行修改
item1.MinValue = 0;
item1.MaxValue = 888;
item2.MinValue = 0;
item2.MaxValue = 999;
修改后:
问题根因
不熟悉条件检测工具及其接口。
2.2.6 图像源:图像源模块输入图像的方法
描述
环境:VM4.2 + VS2013及以上
现象:如何通过代码给图像源模块输入图像?
解答
图像源模块输入图像,除了在界面上操作来添加图像或图像文件夹,还可以通过代码的方式使得图像源模块可以通过本地输入图像,也可以通过SDK输入图像。
C#
ImageSourceModuleTool imageSourcTool = (ImageSourceModuleTool)VmSolution.Instance["流程1.图像源1"];
//通过本地输入图像,图像源类型为本地
imageSourcTool.ModuParams.ImageSourceType = ImageSourceParam.ImageSourceTypeEnum.LocalImage;
imageSourcTool.AddInputImageByPath("D:\\3.ProjectCode\\VM4.2\\VMTestB\\1.bmp");//添加图片
imageSourcTool.DeleteInputImageByPath("D:\\1.bmp");//删除图片
imageSourcTool.ClearAllInputImage();//清空图片
//通过SDK输入图像,图像源类型为SDK,通过SetImagePath接口或者SetImageData接口
imageSourcTool.ModuParams.ImageSourceType = ImageSourceParam.ImageSourceTypeEnum.SDK;
imageSourcTool.SetImagePath("D:\\3.ProjectCode\\VM4.2\\VMTestB3-2\\1.bmp");
imageSourcTool.SetImageData(imageBaseData);//参数类型为ImageBaseData
问题根因
不熟悉图像源模块输入图像
2.2.7 所有流程:获取所有流程对象的方法
描述
环境:VM4.2 + VS2013及以上
现象:如何获取一个方案中的所有流程对象,进而可以直接运行所获取的流程,或者获取流程名、流程ID等等。
解答
在VM4.0通过VmSolution.Instance.GetAllProcedureList()仅仅能或流程列表,下面是获取流程对象的接口:
c#
List<VmProcedure> procedures = new List<VmProcedure>();
VmSolution.Instance.GetAllProcedureObjects(ref procedures);
string name = procedures[0].FullName;
string id = procedures[0].ID;
procedures[0].Run();
问题根因
不熟悉如何获取流程对象
2.2.8 几何创建:绘制形状的方法
描述
环境:VM4.2 + VS2013及以上
现象:在几何创建模块中,VM二次开发如何通过代码绘制形状?
解答
VM4.2中几何创建通过代码的方式可以输入图像、点、直线、圆、矩形,注意仅当次执行有效。下面示例代码绘制直线。
C#
GeometryCreateCs.GeometryCreateTool geoTool = (GeometryCreateCs.GeometryCreateTool)VmSolution.Instance["流程1.几何创建1"];
Line line1 = new Line(new VM.PlatformSDKCS.PointF(500, 500), new VM.PlatformSDKCS.PointF(3000, 3000), 0);
List<Line> line = new List<Line>();
line.Add(line1);
geoTool.ModuParams.InputLine = line;
问题根因
不熟悉几何创建模块的接口。
2.2.9 模板匹配:模板匹配模块导入算子模型文件的方法
描述
环境:VM4.2.0 + VS2013及以上
现象:VM二次开发,高精度模板匹配模块如何导入算子导出的模型?
解答
安装20220902及后续补丁包,注册GAC后,在二次开发软件中可调用模板匹配模块的ImportSDKModelData(string[] strPaths)接口导入模型文件。示例代码如下:
C#
using IMVSHPFeatureMatchModuCs;
using VisionDesigner;
using VisionDesigner.HPFeaturePatMatch;
private string modelExportPathDefault = "HPPattern.hpmxml"; // 模型导出默认路径
private string[] modelExportPathList = new string[1]; // 本示例只有一个模型文件,所以数组长度设为1
// 高精度匹配算子建模,导出模型
CHPFeaturePattern cHPFeaturePatternObj = new CHPFeaturePattern();
cHPFeaturePatternObj.InputImage = cInputImg;
CMvdRectangleF cMvdRectangleF = new CMvdRectangleF((float)rect.CenterPoint.X, (float)rect.CenterPoint.Y, (float)rect.Width, (float)rect.Height);
var region = new CPatMatchRegion(cMvdRectangleF, true); //true表示为ROI,false表示屏蔽区 region.Shape = cShapeObj as CMvdRectangleF;
cHPFeaturePatternObj.RegionList.Add(region);
cHPFeaturePatternObj.Train();
cHPFeaturePatternObj.ExportPattern(modelExportPathDefault);
modelExportPathList[0] = modelExportPathDefault;
// 模板匹配导入算子导出的模型
IMVSHPFeatureMatchModuTool iMVSHPFeatureMatchModuTool = (IMVSHPFeatureMatchModuTool)VmSolution.Instance[FeatureModuleName];
iMVSHPFeatureMatchModuTool.ClearModelData(); // 导入模型前,清空已有模型
iMVSHPFeatureMatchModuTool.ImportSDKModelData(modelExportPathList); // 模板匹配模块导入算子导出的模型(定制接口,0902加入基线)
目前只有高精度模板匹配支持导入算子导出的模型,快速模板匹配、灰度模板匹配等模块暂不支持导入算子导出的模型文件。
问题根因
不熟悉模板匹配的相关接口。
2.2.10 图像源:通过SDK传入图像数据的方法
描述
环境:VM4.2 + VS2013及以上
现象:当图像源类型为SDK时, 可以使用SetImagePath接口或者SetImageData接口给图像源模块输入图像,那么如何使用SetImageData传入相机图像呢?
解答
1.确保图像源类型为SDK
2.使用SetImageData的参数类型可以为ImageBaseData,其中图像格式使用VMPixelFormat或ImvsSdkDefine的枚举(灰度图是17301505,彩色图是35127316),在VM4.0中使用的是ImagePixelFormat类型的枚举(灰度图是1,彩色图是2)。
C#
ImageBaseData imageBaseData = new ImageBaseData(imagedata, StImg.DataLen, StImg.Width, StImg.Height, VMPixelFormat.VM_PIXEL_MONO_08)
ImageSourceModuleTool imageSourcTool = (ImageSourceModuleTool)VmSolution.Instance["流程1.图像源1"];
imageSourcTool.SetImageData(imageBaseData);
3.当图像数据为彩色图像时,开启图像源模的输出MONO8使能,其他模块的图像输入则是图像源.灰度数据。
问题根因
不熟悉图像源通过SDK传图
2.2.11 流程触发:在相机回调函数里短时间多次触发同一流程报错的解决方法
描述
环境:VM4.0及以上+ VS2013及以上
现象:在二次开发中,如果在流程未执行完之前再次触发该流程会导致程序报错,该如何解决这一问题?
解答
由于在VM中同一流程的运行是同步的,因此当某一流程未执行完毕时再次执行该流程会出现报错现象,可以使用标志位在流程运行完成之后,再去调用下一次流程的运行。
如在相机回调函数中调用流程的Run接口,如果相机每两次回调间隔过短就会导致调用Run接口报错。回调中在调用流程执行接口之前使用标志位,使单个流程执行完之后,才触发流程的下一次执行。
C#
bool flag=true;
//回调或者其他会导致流程未执行再次触发的函数
{
if (flag)
{
flag = false;
VmProcess1.Run();
flag = true;
}
}
问题根因
不熟悉流程自身同步运行的机制。
2.2.12 检测加密狗:检测加密狗有无的方法
描述
环境:VM4.2 + VS2013及以上
现象:如何在VM二次开发程序启动时,检测加密狗的有无?
解答
程序启动时,在Program.cs的Main()函数中通过捕获异常码来检测加密狗的有无。
C#
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
catch (Exception ex)
{
VM.PlatformSDKCS.VmException vmEx = VM.Core.VmSolution.GetVmException(ex);
if (null != vmEx)
{
string strMsg = "InitControl failed. Error Code: " + Convert.ToString(vmEx.errorCode, 16);
MessageBox.Show(strMsg);
}
else
{
return;
}
}
问题根因
不熟悉如何检测加密狗的有无