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:

相关推荐
大圣编程3 小时前
Java 多维数组详解
java·开发语言
山东云弈创峰科技5 小时前
山东云弈创峰:基于多模态AI的跨境供应链数字化重构
人工智能·重构
智慧景区与市集主理人6 小时前
巨有科技乡村农文旅智慧建设|适配乡村短板,打造轻量长效数字业态
人工智能·科技
甲维斯6 小时前
马斯克Grok4.5太会了!狙击GPT5.6,贴脸Opus4.8!
人工智能·ai编程
殳翰6 小时前
下服务器端开发流程及相关工具介绍(C++)
开发语言·c++
雪碧聊技术6 小时前
Badge 应用场景与落地实践指南
大数据·人工智能
ai产品老杨7 小时前
NVIDIA GPU部署AI视频分析项目实战记录
人工智能·音视频
落寞的星星7 小时前
这个对象就包含了已经转换好的DFA和各种词法分析器运转所需要的参数。下一步,我们就可以用ScannerInfo对象创建出Scanner对象,请看下面的代码:
开发语言·c#
nothing&nowhere7 小时前
用 Python 做问卷数据清洗:无效样本检测与处理实战
开发语言·python·数据清洗·数据处理·问卷星·问卷星脚本·刷问卷
2601_961593427 小时前
Rust 开发环境配置繁琐?RustRover 开箱即用搞定编码调试
开发语言·后端·macos·rust