Halcon模板匹配核心技术解析大全

一, 测量模型查找直线 、圆、矩形等


1,导入检测相关数据和代码

read_image(Image, 'printer_chip/printer_chip_01')

dev_set_draw('margin')

dev_set_line_width(3)

dev_get_window(WindowHandle) //获取窗口句柄

get_image_size(Image, Width, Height) //获取图片尺寸大小

//

//根据ROI绘制感兴趣区域

gen_region_line(RegionLines, 20.4301, 1355.51, 274.731, 1355.51)

2, 创建测量对象

create_metrology_model (MetrologyHandle) //创建测量对象句柄

3,设置测量对象的宽度和高度

set_metrology_model_image_size(MetrologyHandle, Width, Height)

4, 添加测量形状

参数2 测量形状

*Line后跟: 起点和终点坐标
*Circle后跟: 圆心坐标和半径
*参数3 需要根据测量形状设置参数
*参数4 测量长度 卡尺长度
*参数5 测量宽度 卡尺的宽度
*参数6, 平滑程度
*参数7, 测量阈值

*参数8,9 预留参数

*参数10 测量对象的索引值 Index会自动增加

add_metrology_object_param(MetrologyHandle,line,[20.4301, 1355.51, 274.731, 1355.51], 20, 20,1,30,[ ] ,[ ], Index)

5, 设置卡尺的采样数量 num_measures

参数2 , Index 写成all代表所有测量对象

参数3: 测量时,使用多少个采样点

参数4: 采样点

set_metrology_object_param(MetrologyHandle, 'all', 'num_measures', 6)

6, 设置极性

参数3: 边缘过渡类型

参数4: 所有边缘类型(positive,negative)

set_metrology_object_param(MetrologyHandle, 'all', 'measure_transition', 'all')

7,设置最大的实例个数 最大数量 num_instances 设置线的最大个数

参数4: 最多查找 候选边缘个数

set_metrology_object_param (MetrologyHandle, 'all', 'num_instances', 30)

8,使用测量模型

apply_metrology_model(Image, MetrologyHandle)

9,获取测量结果

【1】,获取找到的点

gen_cross_contour_xld(Cross, Row, Column, 6, 0.7853)

【2】,把测量模型里所有测量对象(直线 / 圆 / 矩形)的轮廓 提取出来,存到 Contour

参数4:图像光滑程度

数字越小,轮廓越光滑、点越密

数字越大,轮廓越稀疏

常用:1.0 ~ 2.0

你写 1.5 = 标准光滑轮廓

get_metrology_object_model_contour( Contour, MetrologyHandle, 'all', 1.5 )

【3】,把测量完成后、拟合出来的【最终精准几何轮廓】提取出来! 也就是 实际检测到的直线 / 圆 / 矩形

get_metrology_object_result_contour (Contour1, MetrologyHandle, 'all', 'all', 1.5)


二,模板匹配+模板定位 +测量


1,前期准备

read_image (Image, 'C:/Users/20710/Desktop/Image/dip_switch/dip_switch_01.png')
get_image_size (Image, Width, Height)
dev_get_window (WindowHandle)
dev_set_draw ('margin')
dev_set_color ('green')
dev_display (Image)
stop ()

2,模板匹配

【1】,绘制ROI区域 左边画一条线 并显示

draw_line (WindowHandle, Row1, Column1, Row2, Column2) //左边画一条线
gen_region_line (RegionLines, Row1, Column1, Row2, Column2) //显示画出的左边线
dev_display (RegionLines)

【2】,右边画一条线 并显示

draw_line (WindowHandle, Row11, Column11, Row21, Column21) //右边画一条线
gen_region_line (RegionLines1, Row11, Column11, Row21, Column21)
dev_display (RegionLines1)

【3】,绘制模板匹配区域

draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
reduce_domain (Image, Rectangle, ImageReduced)

【4】,制作模板

create_shape_model (ImageReduced, 'auto', rad(0),rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)

【5】,找模板

ImageReduced, // 在哪张图找

ModelID, // 找哪个模板

rad(0), rad(360), // 旋转范围:

0~360度 0.5, // 最小缩放

1, // 最大缩放

0.5, // 最小分数(相似度)

'least_squares',// 亚像素精度模式

0, // 金字塔层数

0.9, // 贪婪度(速度/精度)

Row3, Column3, // 输出:找到的中心坐标

Angle, // 输出:角度

Score // 输出:匹配分数

find_shape_model (ImageReduced, ModelID, rad(0),rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row3, Column3, Angle, Score)

stop()


3,创建左右找线工具

1,创建测量句柄

create_metrology_model (MetrologyHandle) //测量句柄

2,设置测量图像大小

set_metrology_model_image_size (MetrologyHandle, Width, Height) //设置测量图像大小

3,添加测量形状

add_metrology_object_generic (MetrologyHandle, 'line', [[ Row1, Column1, Row2, Column2],[ Row11, Column11, Row21, Column21]], 20, 5, 1, 5, [], [], Index) //添加测量形状

4,使用测量模型

apply_metrology_model (Image, MetrologyHandle) //使用测量模型

5,获取卡尺轮廓

get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row4, Column4)

6,获取一个实际测量的边

get_metrology_object_result_contour (Contour, MetrologyHandle, 'all', 'all', 1.5)

7,绑定坐标系

**reference_system 绑定坐标系

Row3,Column3,0\] 第一张模板匹配的坐标和角度** > **set_metrology_model_param (MetrologyHandle, 'reference_system', \[Row3,Column3,0\])** *** ** * ** *** ### **4,显示** > **dev_display (Image)** > > **\*展示匹配图 最后一个参数,表示只显示轮廓 > dev_display_shape_matching_results (ModelID, 'pink', Row3, Column3, Angle, 1, 1, 0)** > > **\*卡尺轮廓 > dev_display (Contours)** > > **\*实际找到的边 > dev_display (Contour)** *** ** * ** *** ### 5,添加测试图 #### 1,传入文件夹导入图片 并显示 > **for Index1 := 0 to \|Files\|-1 by 1 > read_image (Image1, Files\[Index1\]) > dev_display (Image1)** #### 2,找模板 > **find_scaled_shape_model (Image1, ModelID, rad(0),rad(360), 0.5, 1.1, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row5, Column5, Angle1, Scale, Score1)** > #### 3,对齐模板 相当与 VP的定位功能 > **align_metrology_model(MetrologyHandle, Row5 ,Column5, Angle1)** #### 4, 使用测量模型 > **apply_metrology_model (Image1, MetrologyHandle)** #### 5,测量距离 **【1】,Parameter 第一条线的起始坐标和结束坐标** > **get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', Parameter) > gen_region_line (RegionLines1, Parameter\[0\],Parameter\[1\],Parameter\[2\], Parameter\[3\])** 【2】,**Parameter1 第一条线的起始坐标和结束坐标** > **get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', Parameter) > gen_region_line (RegionLines1, Parameter\[0\],Parameter\[1\],Parameter\[2\], Parameter\[3\])** #### 6,测量两区域之间最小距离 > **distance_rr_min (RegionLines1, RegionLines2, MinDistance, Row12, Column12, Row22, Column22)** > #### 7,画一个水平线 > **gen_region_line (RegionLines3, Parameter\[0\]+20, Parameter\[1\], Parameter1\[0\]+20, Parameter1\[1\])** #### 8,获取循环里面的卡尺轮廓图 实际测量轮廓 > **get_metrology_object_measures (Contours1, MetrologyHandle, 'all', 'all', Row6, Column6)** > > **get_metrology_object_result_contour (Contours1, MetrologyHandle, 'all', 'all', Row6, Column6)** > #### 9, 显示,和这段代码的结尾 > **dev_display (Image1) > dev_display (Contours1) > dev_display (Contour1) > dev_display (RegionLines3) > dev_disp_text ('物体宽度:'+MinDistance, 'image', 100, 100, 'black', \[\], \[\]) > stop () > endfor** ### 结果1: 结果2: ![](https://i-blog.csdnimg.cn/direct/1e26f27e73a240ba887d2df3a52b1fcd.png) ![](https://i-blog.csdnimg.cn/direct/06d46ccdfebf4ec197b9869cf0ee5b2c.png)

相关推荐
萌兰三太子2 小时前
深度解析:如何为你的 AI Agent 打造完整的可观测体系
人工智能
精神小伙就是猛2 小时前
使用go-zero快速搭建一个微服务(一)
开发语言·后端·微服务·golang
Hali_Botebie2 小时前
LoRA: Low-Rank Adaptation of Large Language Models
人工智能·语言模型·自然语言处理
不会聊天真君6472 小时前
基础语法·下(golang笔记第三期)
开发语言·笔记·golang
zh25262 小时前
当 AI Agent 开始"自主思考":Anthropic 一年来研究的启示与实践
人工智能
QC·Rex2 小时前
AI Agent 编排实战:从零构建多智能体协作系统
人工智能·ai agent·任务编排·多智能体系统·claude code·自主代理·llm 应用
客卿1232 小时前
最小生成树(贪心)--构造回文串(字符串 + 回文判断 + 构造)
java·开发语言·算法
Bert.Cai2 小时前
Python input函数作用
开发语言·python
米小虾2 小时前
从对话到行动:AI Agent 架构演进与工程实践指南
人工智能·langchain·agent