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, FilesIndex1)
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, Parameter0,Parameter1,Parameter2, Parameter3)

【2】,Parameter1 第一条线的起始坐标和结束坐标

get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', Parameter)
gen_region_line (RegionLines1, Parameter0,Parameter1,Parameter2, Parameter3)

6,测量两区域之间最小距离

distance_rr_min (RegionLines1, RegionLines2, MinDistance, Row12, Column12, Row22, Column22)

7,画一个水平线

gen_region_line (RegionLines3, Parameter0+20, Parameter1, Parameter10+20, Parameter11)

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:

相关推荐
武子康2 分钟前
调查研究-165 vLLM 深入浅出:从 PagedAttention 到生产级大模型推理服务
人工智能·openai
冬奇Lab3 分钟前
每日一个开源项目(第126篇):turbovec - 向量索引的内存杀手,1千万文档从31GB压到4GB
人工智能·开源·llm
继续商行4 分钟前
模型量化实践:GPTQ 与 AWQ 在生产环境的精度与速度权衡
人工智能
知识浅谈7 分钟前
人工智能日报 每日AI新闻(2026年6月8日):OpenAI安全加码、苹果AI升级前夜与国产AI应用落地
人工智能·安全·chatgpt
冬奇Lab14 分钟前
Agent 系列(17):Harness Engineering——给自主 Agent 装上安全护栏
人工智能·llm·agent
鸿栢男子焊胡工34 分钟前
汽车焊装线如何实现零漏焊?深度拆解 PIDS-A20AT 自动螺柱焊机全链路防错体系
人工智能·汽车·鸿栢科技
晨曦中的暮雨42 分钟前
Golang速通(Javaer版)
java·开发语言·后端·golang
七老板的blog1 小时前
当 Spring StateMachine 遇见大模型:构建工业级 AI 写作流水线
java·人工智能·spring
Sirius Wu1 小时前
意图&实体ToolCall_Prompt调优
人工智能·机器学习·语言模型·prompt·aigc