前言
本文重要是个人开发经验,实用为主。可能有不严谨之处,欢迎指正
开发环境预备
对于控制台应用,其实只要从 VisionMaster4.x.x\Development\V4.x\ComControls\Assembly 中引入相关包即可,不用像别的教程里拷贝各种wpf winform组件
唯一要留意的是在 VisionMaster4.x.x\Development\V4.x\ComControls\Assembly\3rdLib\Log4Net中,有一个log4Net.config
需要和终极程序在一起,并且相对路径保持同等(3rdLib\Log4Net)。否则控制台会有警告(但其实也无所谓)
只能说海康做的有点差,把Log4net绑定的太死
此外一样平常来说,引入VM.Core和VM.PlatformSDKCS即可
重要参考资料
- 软件里的帮助文档
- 更重要的是在路径 VisionMaster4.x.x\Development\V4.x\Documentations 中 VisionMaster算法平台SDK开发指南V4.x.x(.NET)。该文档可以一览各种工具类的属性和函数
打开项目
- // 打开项目
- VmSolution.Load("xxx.sol");
- Console.WriteLine(VmSolution.Instance.GetSolutionVersion("xxx.sol", "")); // 获取方案版本号
复制代码 设置全局变量
- // 设置全局变量
- GlobalVariableModuleTool globalVar = (GlobalVariableModuleTool)VmSolution.Instance["全局变量1"]; // 获取全局变量对象
- globalVar.SetGlobalVar("失败图片文件名", "失败_" + DateTime.Now.ToString("yyyyMMddHHmmss"));
- globalVar.SetGlobalVar("成功图片文件名", "成功_" + DateTime.Now.ToString("yyyyMMddHHmmss"));
复制代码 得到各组件的引用
留意这里的xxTool直接用是没有的,需要从 VisionMaster4.x.x\Development\V4.x\ComControls\Assembly 中引入。
例如:从 ImageSourceModuleCs.dll 中引入 ImageSourceModuleTool
从 IMVSBlobFindModu.dll 中引入 IMVSBlobFindModuTool
从 SaveImageCs.dll 中引入 SaveImageTool- // 获得相关工具,以备设置
- VmProcedure process = (VmProcedure)VmSolution.Instance["流程1"];
- ImageSourceModuleTool input1 = (ImageSourceModuleTool)VmSolution.Instance["流程1.输入1"];
- IMVSBlobFindModuTool blob分析 = (IMVSBlobFindModuTool)VmSolution.Instance["流程1.blob分析"];
- SaveImageTool output1 = (SaveImageTool)VmSolution.Instance["流程1.blob输出1"];
- SaveImageTool output2 = (SaveImageTool)VmSolution.Instance["流程1.blob输出2"];
复制代码 输入要点
这里踩了很多坑,首先有两种方式,一种是指定路径读图,另一种是从内存中通过byte数组给图
此外,给出通用模块参数设置,防止一些意外- // ImageSourceModuleTool tool
- tool.ResetParam();
- // 设置SDK取图方式
- tool.ModuParams.ImageSourceType = ImageSourceParam.ImageSourceTypeEnum.SDK;
- // 输出Mono8格式,后面的模块要用
- tool.ModuParams.OutMono8 = true; // 要开启输出Mono8否则后面的模块可能会出错
复制代码- // 打开bmp图片
- var bmp = new Bitmap(Pictest2);
- var bmpBytes = bmpToBytes(bmp); // 这里只是举个例子,具体byte[]怎么来的请各显神通
- VmProcedure process = (VmProcedure)VmSolution.Instance["流程1"];
- ImageSourceModuleTool input1 = (ImageSourceModuleTool)VmSolution.Instance["流程1.状态1输入"];
- // 设置输入1
- input1.ModuParams.ImageSourceType = ImageSourceParam.ImageSourceTypeEnum.SDK;
- input1.ModuParams.OutMono8 = true;
- input1.ModuParams.PixelFormat = ImageSourceParam.PixelFormatEnum.MONO8;
- input1.SetImageData(new ImageBaseData(bmpBytes, (uint)bmpBytes.Length, bmp.Width, bmp.Height, (int)PixelFormatF.MONO8));
复制代码 bmpToBytes函数参考(代码来自于网络)- private static byte[] bmpToBytes(Bitmap bmp)
- {
- // 获取图像的像素数据
- BitmapData bitmapData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
- ImageLockMode.ReadOnly, bmp.PixelFormat);
- // 计算Byte[]数组的大小
- int bytesCount = bitmapData.Stride * bitmapData.Height;
- byte[] bytes = new byte[bytesCount];
- // 将像素数据复制到Byte[]数组
- Marshal.Copy(bitmapData.Scan0, bytes, 0, bytesCount);
- // 释放资源
- bmp.UnlockBits(bitmapData);
- // 输出Byte[]数组
- return bytes;
- }
复制代码
- 指定图像路径输入
就是最后一句改为用SetImagePath函数
- VmProcedure process = (VmProcedure)VmSolution.Instance["流程1"];
- ImageSourceModuleTool input1 = (ImageSourceModuleTool)VmSolution.Instance["流程1.状态1输入"];
- // 设置输入1
- input1.ModuParams.ImageSourceType = ImageSourceParam.ImageSourceTypeEnum.SDK;
- input1.ModuParams.OutMono8 = true;
- input1.ModuParams.PixelFormat = ImageSourceParam.PixelFormatEnum.MONO8;
- input1.SetImagePath(Pictest2);
复制代码 输出要点
踩了很多坑,发起参考如下代码- // SaveImageTool tool
- tool.ResetParam();
- // 存图使能,必须开
- tool.ModuParams.SaveImageEnable = true;
- // 不创建目录,否则会出现日期格式的多级目录
- tool.ModuParams.GenerateDir = false;
- // 渲染图缓存数量1,即立刻保存(应该是这个意思吧,没试过
- tool.ModuParams.RenderImgCache = 1;
- // 保存间隔为1,即每一张都保存(应该是这个意思吧,没试过
- tool.ModuParams.StorageInterval = 1;
- // 渲染图输出
- tool.ModuParams.RenderImgEnable = true;
- // 保存格式 SaveImageParam.PixelFormatEnum format
- tool.ModuParams.PixelFormat = format;
- // 渲染图输出路径
- tool.ModuParams.RenderImgPath = @"xxx\xxx";
复制代码 设置文件名,得通过全局变量间接处理。
执行一次
获取辨认模块的结果
重要是要参考SDK开发手册,从ModuResult中读取- blob分析1.ModuResult.BlobNum
复制代码 不完整的整体代码
- // 打开项目
- VmSolution.Load(sol项目);
- Console.WriteLine(VmSolution.Instance.GetSolutionVersion(sol项目, "")); // 获取方案版本号
- // 打开bmp图片(模拟SDK取图)
- // 略不重要
- // 设置全局变量
- GlobalVariableModuleTool globalVar = (GlobalVariableModuleTool)VmSolution.Instance["全局变量1"]; // 获取全局变量对象
- globalVar.SetGlobalVar("状态正_失败图片文件名", "状态正失败" + DateTime.Now.ToString("yyyyMMddHHmmss"));
- globalVar.SetGlobalVar("状态倒_失败图片文件名", "状态倒失败" + DateTime.Now.ToString("yyyyMMddHHmmss"));
- // 获得相关工具,以备设置
- VmProcedure process = (VmProcedure)VmSolution.Instance["流程1"];
- ImageSourceModuleTool 全亮input = (ImageSourceModuleTool)VmSolution.Instance["流程1.输入_全亮"];
- ImageSourceModuleTool 输入类型1 = (ImageSourceModuleTool)VmSolution.Instance["流程1.输入1"];
- ImageSourceModuleTool 输入类型2 = (ImageSourceModuleTool)VmSolution.Instance["流程1.输入2"];
- IMVSBlobFindModuTool blob分析1 = (IMVSBlobFindModuTool)VmSolution.Instance["流程1.blob分析1"];
- IMVSBlobFindModuTool blob分析2 = (IMVSBlobFindModuTool)VmSolution.Instance["流程1.blob分析2"];
- SaveImageTool output1 = (SaveImageTool)VmSolution.Instance["流程1.blob输出1"];
- SaveImageTool output2 = (SaveImageTool)VmSolution.Instance["流程1.blob输出2"];
- // 设置输入
- // 请参考上面的输入要点
- // 设置输出
- // 请参考上面的输出要点
- // 运行
- process.Run();
- // 打印结果
- Console.WriteLine("状态1" + blob分析1.ModuResult.BlobNum);
- Console.WriteLine("状态2" + blob分析2.ModuResult.BlobNum);
- Console.WriteLine(process.Name + "success");
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |