VisionMaster SDK C# 控制台应用 二次开发 代码示例

打印 上一主题 下一主题

主题 904|帖子 904|积分 2712

前言

本文重要是个人开发经验,实用为主。可能有不严谨之处,欢迎指正
开发环境预备

对于控制台应用,其实只要从 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)。该文档可以一览各种工具类的属性和函数
打开项目
  1. // 打开项目
  2. VmSolution.Load("xxx.sol");
  3. Console.WriteLine(VmSolution.Instance.GetSolutionVersion("xxx.sol", "")); // 获取方案版本号
复制代码
设置全局变量
  1. // 设置全局变量
  2. GlobalVariableModuleTool globalVar = (GlobalVariableModuleTool)VmSolution.Instance["全局变量1"]; // 获取全局变量对象
  3. globalVar.SetGlobalVar("失败图片文件名", "失败_" + DateTime.Now.ToString("yyyyMMddHHmmss"));
  4. globalVar.SetGlobalVar("成功图片文件名", "成功_" + DateTime.Now.ToString("yyyyMMddHHmmss"));
复制代码
得到各组件的引用

留意这里的xxTool直接用是没有的,需要从 VisionMaster4.x.x\Development\V4.x\ComControls\Assembly 中引入。
例如:从 ImageSourceModuleCs.dll 中引入 ImageSourceModuleTool
从 IMVSBlobFindModu.dll 中引入 IMVSBlobFindModuTool
从 SaveImageCs.dll 中引入 SaveImageTool
  1. // 获得相关工具,以备设置
  2. VmProcedure process = (VmProcedure)VmSolution.Instance["流程1"];
  3. ImageSourceModuleTool input1 = (ImageSourceModuleTool)VmSolution.Instance["流程1.输入1"];
  4. IMVSBlobFindModuTool blob分析 = (IMVSBlobFindModuTool)VmSolution.Instance["流程1.blob分析"];
  5. SaveImageTool output1 = (SaveImageTool)VmSolution.Instance["流程1.blob输出1"];
  6. SaveImageTool output2 = (SaveImageTool)VmSolution.Instance["流程1.blob输出2"];
复制代码
输入要点

这里踩了很多坑,首先有两种方式,一种是指定路径读图,另一种是从内存中通过byte数组给图
此外,给出通用模块参数设置,防止一些意外
  1. // ImageSourceModuleTool tool
  2. tool.ResetParam();
  3. // 设置SDK取图方式
  4. tool.ModuParams.ImageSourceType = ImageSourceParam.ImageSourceTypeEnum.SDK;
  5. // 输出Mono8格式,后面的模块要用
  6. tool.ModuParams.OutMono8 = true;    // 要开启输出Mono8否则后面的模块可能会出错
复制代码

  • byte数组输入
  1. // 打开bmp图片
  2. var bmp = new Bitmap(Pictest2);
  3. var bmpBytes = bmpToBytes(bmp); // 这里只是举个例子,具体byte[]怎么来的请各显神通
  4. VmProcedure process = (VmProcedure)VmSolution.Instance["流程1"];
  5. ImageSourceModuleTool input1 = (ImageSourceModuleTool)VmSolution.Instance["流程1.状态1输入"];
  6. // 设置输入1
  7. input1.ModuParams.ImageSourceType = ImageSourceParam.ImageSourceTypeEnum.SDK;
  8. input1.ModuParams.OutMono8 = true;
  9. input1.ModuParams.PixelFormat = ImageSourceParam.PixelFormatEnum.MONO8;
  10. input1.SetImageData(new ImageBaseData(bmpBytes, (uint)bmpBytes.Length, bmp.Width, bmp.Height, (int)PixelFormatF.MONO8));
复制代码
bmpToBytes函数参考(代码来自于网络)
  1. private static byte[] bmpToBytes(Bitmap bmp)
  2.     {
  3.         // 获取图像的像素数据
  4.         BitmapData bitmapData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
  5.             ImageLockMode.ReadOnly, bmp.PixelFormat);
  6.         // 计算Byte[]数组的大小
  7.         int bytesCount = bitmapData.Stride * bitmapData.Height;
  8.         byte[] bytes = new byte[bytesCount];
  9.         // 将像素数据复制到Byte[]数组
  10.         Marshal.Copy(bitmapData.Scan0, bytes, 0, bytesCount);
  11.         // 释放资源
  12.         bmp.UnlockBits(bitmapData);
  13.         // 输出Byte[]数组
  14.         return bytes;
  15.     }
复制代码

  • 指定图像路径输入
    就是最后一句改为用SetImagePath函数
  1. VmProcedure process = (VmProcedure)VmSolution.Instance["流程1"];
  2. ImageSourceModuleTool input1 = (ImageSourceModuleTool)VmSolution.Instance["流程1.状态1输入"];
  3. // 设置输入1
  4. input1.ModuParams.ImageSourceType = ImageSourceParam.ImageSourceTypeEnum.SDK;
  5. input1.ModuParams.OutMono8 = true;
  6. input1.ModuParams.PixelFormat = ImageSourceParam.PixelFormatEnum.MONO8;
  7. input1.SetImagePath(Pictest2);
复制代码
输出要点

踩了很多坑,发起参考如下代码
  1. // SaveImageTool tool
  2. tool.ResetParam();
  3. // 存图使能,必须开
  4. tool.ModuParams.SaveImageEnable = true;
  5. // 不创建目录,否则会出现日期格式的多级目录
  6. tool.ModuParams.GenerateDir = false;
  7. // 渲染图缓存数量1,即立刻保存(应该是这个意思吧,没试过
  8. tool.ModuParams.RenderImgCache = 1;
  9. // 保存间隔为1,即每一张都保存(应该是这个意思吧,没试过
  10. tool.ModuParams.StorageInterval = 1;
  11. // 渲染图输出
  12. tool.ModuParams.RenderImgEnable = true;
  13. // 保存格式 SaveImageParam.PixelFormatEnum format
  14. tool.ModuParams.PixelFormat = format;
  15. // 渲染图输出路径
  16. tool.ModuParams.RenderImgPath = @"xxx\xxx";
复制代码
设置文件名,得通过全局变量间接处理。

执行一次
  1. process.Run();
复制代码
获取辨认模块的结果

重要是要参考SDK开发手册,从ModuResult中读取
  1. blob分析1.ModuResult.BlobNum
复制代码
不完整的整体代码
  1. // 打开项目
  2. VmSolution.Load(sol项目);
  3. Console.WriteLine(VmSolution.Instance.GetSolutionVersion(sol项目, "")); // 获取方案版本号
  4. // 打开bmp图片(模拟SDK取图)
  5. // 略不重要
  6. // 设置全局变量
  7. GlobalVariableModuleTool globalVar = (GlobalVariableModuleTool)VmSolution.Instance["全局变量1"]; // 获取全局变量对象
  8. globalVar.SetGlobalVar("状态正_失败图片文件名", "状态正失败" + DateTime.Now.ToString("yyyyMMddHHmmss"));
  9. globalVar.SetGlobalVar("状态倒_失败图片文件名", "状态倒失败" + DateTime.Now.ToString("yyyyMMddHHmmss"));
  10. // 获得相关工具,以备设置
  11. VmProcedure process = (VmProcedure)VmSolution.Instance["流程1"];
  12. ImageSourceModuleTool 全亮input = (ImageSourceModuleTool)VmSolution.Instance["流程1.输入_全亮"];
  13. ImageSourceModuleTool 输入类型1 = (ImageSourceModuleTool)VmSolution.Instance["流程1.输入1"];
  14. ImageSourceModuleTool 输入类型2 = (ImageSourceModuleTool)VmSolution.Instance["流程1.输入2"];
  15. IMVSBlobFindModuTool blob分析1 = (IMVSBlobFindModuTool)VmSolution.Instance["流程1.blob分析1"];
  16. IMVSBlobFindModuTool blob分析2 = (IMVSBlobFindModuTool)VmSolution.Instance["流程1.blob分析2"];
  17. SaveImageTool output1 = (SaveImageTool)VmSolution.Instance["流程1.blob输出1"];
  18. SaveImageTool output2 = (SaveImageTool)VmSolution.Instance["流程1.blob输出2"];
  19. // 设置输入
  20. // 请参考上面的输入要点
  21. // 设置输出
  22. // 请参考上面的输出要点
  23. // 运行
  24. process.Run();
  25. // 打印结果
  26. Console.WriteLine("状态1" + blob分析1.ModuResult.BlobNum);
  27. Console.WriteLine("状态2" + blob分析2.ModuResult.BlobNum);
  28. Console.WriteLine(process.Name + "success");
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表