VisionMaster SDK C# 控制台应用 二次开发 代码示例
前言本文重要是个人开发经验,实用为主。可能有不严谨之处,欢迎指正
开发环境预备
对于控制台应用,其实只要从 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即可
重要参考资料
[*]软件里的帮助文档 https://img2024.cnblogs.com/blog/2079516/202501/2079516-20250114082427505-55895355.png
[*]更重要的是在路径 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否则后面的模块可能会出错
[*]byte数组输入
// 打开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;
// 将像素数据复制到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\";设置文件名,得通过全局变量间接处理。
https://img2024.cnblogs.com/blog/2079516/202501/2079516-20250114093603354-174105882.png
执行一次
process.Run();获取辨认模块的结果
重要是要参考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企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]