【VM服务管家】VM4.x算子SDK开发_3.3 模块工具类

本文档详细介绍了VM4.x算子SDK在图像处理中的应用,包括位置修正、模板保存与匹配、图像相减、模板训练、Blob工具、点点测量、亮度测量等方法的使用,提供了详细的代码示例和问题解答。

3.3.1 位置修正:位置修正算子工具的使用方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:位置修正工具使用方法
解答
示例代码如下:

1.	C# 
2.	 
3.	bool re = true;
4.	//位置修正基准参数
5.	 CPositionFixTool PosFixToolObj = new CPositionFixTool();
6.	 CPositionFixBasicParam BasicParam = PosFixToolObj.BasicParam;
7.	 VisionDesigner.PositionFix.MVD_FIDUCIAL_POINT_F stBasinInit = new VisionDesigner.PositionFix.MVD_FIDUCIAL_POINT_F();
8.	 stBasinInit.stPosition.fX = MatchPoint.X;
9.	 stBasinInit.stPosition.fY = MatchPoint.Y;
10.	 stBasinInit.fAngle = Angle;
11.	 BasicParam.BasePoint = stBasinInit;//设置基准点
12.	//位置修正运行参数
13.	 VisionDesigner.PositionFix.MVD_FIDUCIAL_POINT_F stBasicRun = new VisionDesigner.PositionFix.MVD_FIDUCIAL_POINT_F();
14.	 stBasicRun.stPosition.fX = stPositionfX;
15.	 stBasicRun.stPosition.fY = stPositionfY;
16.	 stBasicRun.fAngle = stPositionAngle;
17.	 BasicParam.RunningPoint = stBasicRun;//设置运行点
18.	 //获取工具位置修正后Roi
19.	 MVD_SIZE_I stImageSize = new MVD_SIZE_I();
20.	 stImageSize.nWidth = ImageWidth;
21.	 stImageSize.nHeight = ImageHeight;
22.	 BasicParam.RunImageSize = stImageSize;
23.	 BasicParam.FixMode = MVD_POSFIX_MODE.MVD_POSFIX_MODE_HVA;
24.	 PosFixToolObj.BasicParam.InitialShape = SrcRegionROI;
25.	 PosFixToolObj.Run();
26.	 DesRegionROI = PosFixToolObj.Result.CorrectedShape;

问题根因
不熟悉位置修正算子工具使用方法

3.3.2 模板保存:实现模板自动加载的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
问题:用户在使用算子SDK开发的模板匹配功能时,希望能在程序运行时可以自动加载之前训练过的模板。
解答
可以使用模板的导入导出方法,步骤如下:
第一步:程序初始化时导入模板

1.	C# 
2.	 
3.	public FrmMain()
4.	{
5.	    InitializeComponent();
6.	    if (File.Exists(savePatternPath))//判断文件是否存在
7.	    {
8.	        pattern.ImportPattern(savePatternPath);
9.	    }
10.	}

第二步:加载模板训练窗口时进行赋值

11.	C# 
12.	 
13.	private void FrmTempleteMatch_Load(object sender, EventArgs e)
14.	{
15.	    mvdAlmightyPatternEdit1.SetSubject(savePattern);
16.	}

第三步:在关闭训练窗口时导出模板:

17.	C# 
18.	 
19.	private void FrmTempleteMatch_FormClosing(object sender, FormClosingEventArgs e)
20.	{
21.	    savePattern.ExportPattern(savePatternPath);
22.	}

问题根因
不熟悉SDK算子的相关方法。

3.3.3 模板匹配: 获取模板匹配框和轮廓点的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:如何获取模板匹配轮廓点?
解答
依次实例化模板匹配工具、设置输入图像、设置ROI、运行、获取匹配点、轮廓点,示例代码如下:

C#
cHPFeaturePattern = new CHPFeaturePattern();
cHPFeaturePatMatchTool.InputImage = cMvdImage;
cHPFeaturePatMatchTool.Pattern = cHPFeaturePattern;
cHPFeaturePatMatchTool.ROI = cROI;
cHPFeaturePatMatchTool.BasicParam.ShowOutlineStatus = true; // 显示轮廓
cHPFeaturePatMatchTool.Run();
CHPFeaturePatMatchResult cHPFeaturePatMatchResult = cHPFeaturePatMatchTool.Result;
var OutlineList = cHPFeaturePatMatchResult.OutlineList;
foreach (var item in cHPFeaturePatMatchResult.MatchInfoList)
{
    var matchBox = new CMvdRectangleF(item.MatchBox.CenterX, item.MatchBox.CenterY, item.MatchBox.Width, item.MatchBox.Height);
    matchBox.Angle = item.MatchBox.Angle;
    matchBox.BorderColor = new MVD_COLOR(255, 0, 0, 255);
    mvdRenderActivex1.AddShape(matchBox);
}
if (cHPFeaturePatMatchTool.BasicParam.ShowOutlineStatus)
{
    foreach (var item in cHPFeaturePatMatchResult.OutlineList)
    {
        CMvdPointSetF pointSetG = new CMvdPointSetF();
        CMvdPointSetF pointSetY = new CMvdPointSetF();
        CMvdPointSetF pointSetR = new CMvdPointSetF();
        foreach (var point in item.EdgePointList)
        {
            if (0 == point.Score)
            {
                pointSetG.AddPoint(point.Position.fX, point.Position.fY);
            }
            else if (1 == point.Score)
            {
                pointSetY.AddPoint(point.Position.fX, point.Position.fY);
            }
            else if (2 == point.Score)
            {
                pointSetR.AddPoint(point.Position.fX, point.Position.fY);
            }
        }
        pointSetG.BorderColor = new MVD_COLOR(0, 255, 0, 255);//绿色得分高的点
        pointSetY.BorderColor = new MVD_COLOR(255, 255, 0, 255);//黄色得分低的点
        pointSetR.BorderColor = new MVD_COLOR(255, 0, 0, 255);//红色丢弃的点

        
VM4.2平台SDK 6.3中,控件嵌入类的使用主要涉及将VisionMaster应用程序或其部分功能嵌入到用户自定义的软件界面中,通常通过调用Windows API函数如`SetParent`和`MoveWindow`来实现。以下是一个典型的应用场景与实现方式: ### 控件嵌入的基本流程 1. **启动VisionMaster进程** 首先需要通过代码启动VisionMaster应用程序,确保其主窗口句柄可以被获取。可以使用`Process.Start`方法启动程序,并通过`WaitForInputIdle()`方法等待其初始化完成。 2. **获取主窗口句柄** 在VisionMaster启动后,通过`MainWindowHandle`属性获取其主窗口的句柄(`IntPtr`类型),这是后续操作的基础。 3. **设置父窗口** 使用`SetParent`函数将VisionMaster的主窗口设置为用户界面中某个Panel控件的子窗口。这样可以将整个VisionMaster界面嵌入到Panel中。 4. **调整窗口大小和位置** 通过`MoveWindow`函数将VisionMaster的主窗口调整至Panel控件的尺寸和位置,确保其在用户界面中正确显示。 ### 示例代码(C#) ```csharp [DllImport("user32.dll", EntryPoint = "SetParent")] public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint); // 启动VisionMaster进程 Process p = Process.Start(@"D:\VisionMaster4.2.0\Applications\VisionMaster.exe"); // 等待VisionMaster完成初始化 p.WaitForInputIdle(); // 获取主窗口句柄 IntPtr appWin = p.MainWindowHandle; // 将VisionMaster窗口设置为Panel控件的子窗口 SetParent(appWin, panel1.Handle); // 调整VisionMaster窗口大小以适应Panel控件 MoveWindow(appWin, 0, 0, panel1.Width, panel1.Height, true); ``` ### 注意事项 - 在调用`SetParent`之前,确保VisionMaster已经启动并完成初始化,否则可能导致句柄获取失败。 - `MoveWindow`调用后,可能需要根据实际界面布局调整参数,以保证嵌入的窗口显示正确。 - 如果需要在多个Panel中切换显示不同的VisionMaster实例,应确保每个实例的句柄管理清晰,避免冲突。 ### 开发环境要求 - SDK版本:VM4.2平台SDK 6.3 - 开发工具:Visual Studio 2015及以上 - 编程语言:C# 上述实现方式基于SDK提供的功能和Windows API的调用机制,适用于需要将VisionMaster界面深度集成到客户软件中的场景[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值