halcon算子(模板匹配)

《创建灰度值模板》

创建基于灰度值模版(基于归一化相关性模版)

*参数1: 输入的图片 做模版的图片

*参数2: 金字塔层级,设置为auto自动选择金字塔层级, 值越大,匹配速度越快, 不同分辨率下的模版

*参数3: 起始角度 rad(-180) 转成弧度数

*参数4:结束角度

*参数5:角度递增量

*参数6:'use_polarity' 使用极性 ignore_global_polarity 忽略极性

*参数7 ModelID 模版的id 获取匹配的结果可以通过id进行获取

create_ncc_model (ImageReduced, 'auto', rad(-180), rad(180), 'auto', 'use_polarity', ModelID)

《查找模板匹配结果》

find_ncc_model (Image1, ModelID, rad(-180), rad(180), 0.8, 1, 0.5, 'true', 0, Row1, Column1, Angle, Score)

*1 输入的图片

*2 模版id

*3、4 开始角度和结束角度

*5 最小得分

*6 匹配的个数 1 就是1个,0匹配多个

*7 重叠率 0.5 超出0.5 谁的得分高 就匹配到谁,

*8 是否启用亚像素级别 true使用

*9 金字塔层级 0 保留的细节多,计算量比较大

*10、11 模版匹配点的坐标

*12 模版匹配结果的角度

*13 模版匹配的得分

《释放模板句柄》

clear_ncc_model (ModelID) // 释放模版句柄

《模板的导入》

read_ncc_model ('1.shm', ModelID) // 导入模版

*参数1 模板的路径

*参数2 输出的图片

《模板的导出》

write_ncc_model (ModelID,'1.shm' )//导出模版

*参数1 输入的图片

*参数2 导出的路径

《基于形状的模板》

create_scaled_shape_model (ImageReduced, 'auto', rad(-45), rad(90), 'auto', 0.8, 1.1, 'auto', 'auto', 'ignore_global_polarity', 'auto', 'auto', ModelID)

*参数6、7 缩放比例最小值和最大值

*参数8 缩放的递增量

*参数9 Optimization优化方式 自动模型优化方式

*参数11 Contrast: 对比度 自动计算对比度

*参数12 MinContrast 最小的对比度

《获取模板中心点坐标》

get_shape_model_contours (ModelContours, ModelID, 1) // 获取模版轮廓信息

《刚性的仿射变换》

vector_angle_to_rigid (0, 0, 0, Row, Column, 0, HomMat2D)

*从第一个点的位置、角度变换到第二点的位置、角度

*HomMat2D 输出参数 获取变换矩阵

坐标原点 (0,0)不旋转(角度 0) 移动到 (Row, Column)仍然不旋转(角度 0) 生成一个纯平移矩阵 ,存到 HomMat2D

《把变换矩阵使用指定轮廓》

affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)

ModelContours:模板的原始轮廓(默认在原点)

HomMat2D移动指令(移到哪、转多少)

ContoursAffineTrans移动后的轮廓(画在图上就是匹配框)

《模板匹配》

find_scaled_shape_model (Image1, ModelID, rad(-45), rad(90), 0.8, 1.1, 0.5, 0, 0.5, 'least_squares', 0, 0.8, Row1, Column1, Angle, Scale, Score)

*参数SubFixel:是否启用亚像素级别 None:不启用,least_squares 启用亚像素级匹配 最小二乘法查找亚像素

*参数Greediness 贪婪度(值越大查找速度越快)

Image1

在找在这张图片里搜索目标。

ModelID

用啥找create_scaled_shape_model 创建好的模板 ID。

rad(-45)

最小角度 目标最少能旋转 -45°(逆时针 45 度)

rad(90)

最大角度 目标最多能旋转 90°(顺时针 90 度)

0.8

最小缩放 目标最小可以缩到原来的 0.8 倍

1.1

最大缩放 目标最大可以放到原来的 1.1 倍

0.5

最小得分(最关键!)

得分范围:0 ~ 1

低于 0.5 的结果直接丢掉

数值越高,匹配越准,但更容易找不到

你第三个框不准,就是这个值设太低了

0

最多找几个目标

0 = 找到所有符合的目标

1 = 只找一个

0.5

金字塔重叠度不用管,默认 0.5 就行。

'least_squares'

精度模式 least_squares = 高精度亚像素定位

0

插值默认 0 即可。

0.8

贪婪度

越大:找得越快,但可能漏检

越小:找得越准,但更慢0.8 是平衡值。

输出结果

Row1, Column1

目标中心坐标(画框用)

Angle

目标旋转角度

Scale

目标缩放倍数

Score

匹配得分 越接近 1 越准,低于 0.5 都是误匹配

《展示基于形状模版匹配结果》

dev_display_shape_matching_results (ModelID, 'red', Row1, Column1, Angle, Scale, Scale, 0)

ModelID你做好的模板 ID,用来画轮廓。

'red' 匹配框画成红色,也可以写 'green'、'blue'。

Row1, Column1 匹配到的目标中心位置

Angle 目标旋转角度

Scale, Scale 目标缩放大小(等比例缩放写两个一样就行)。

0 固定参数,直接写 0 就完事。

《仿射变换查找结果》

*基础的变换 平移变换、旋转变换、缩放变换、倾斜变换

for Index := 0 to |Row1|-1 by 1

*1创建初始化的仿射矩阵

hom_mat2d_identity (HomMat2DIdentity)

*2 生成平移变换矩阵 参数1初始化的矩阵 参数2和参数3移动的位置

hom_mat2d_translate (HomMat2DIdentity,Row1[Index], Column1[Index], HomMat2DTranslate)

*3 生成一个旋转矩阵 参数1是平移矩阵

hom_mat2d_rotate (HomMat2DTranslate, Angle[Index],Row1[Index], Column1[Index], HomMat2DRotate)

*4 生成一个缩放矩阵 参数1是旋转矩阵

hom_mat2d_scale (HomMat2DRotate, Scale[Index], Scale[Index],Row1[Index], Column1[Index], HomMat2DScale)

*5 使用矩阵

affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DScale)

*6展示变换之后轮廓信息

dev_display (ContoursAffineTrans)

平移变换 hom_mat2d_translate

作用:移动位置把轮廓从原点 → 移到目标中心。

旋转变换 hom_mat2d_rotate

作用:调整角度让框跟着目标的旋转角度一起转。

缩放变换 hom_mat2d_scale

作用:调整大小让框的大小匹配目标大小。

倾斜变换(你没用到)

hom_mat2d_slant作用:拉斜、歪着变换(一般匹配不用)

相关推荐
陆业聪2 小时前
从 OpenClaw 到 Android:Harness Engineering 是怎么让 Agent 变得可用的
android·人工智能·ai编程
用户5191495848452 小时前
SEO LAT Auto Post 插件远程代码执行漏洞利用工具 (CVE-2024-12252)
人工智能·aigc
AI茶水间管理员2 小时前
部署70B大模型到底要多大显存?一文算清所有账
人工智能·后端
卿着飞翔2 小时前
win11安装opencode
人工智能
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章42-模板匹配N
图像处理·人工智能·opencv·算法·计算机视觉
北京耐用通信2 小时前
工业级抗干扰!耐达讯自动化CC-Link IE转Modbus RTU网关,稳定运行,让数据不丢包
人工智能·科技·物联网·网络协议·自动化·信息与通信
JackieZhengChina2 小时前
BMAD-METHOD 筑梦架构:AI 驱动的开源敏捷开发方法
人工智能·架构·开源
ryrhhhh2 小时前
AI搜索占位全流程自动化:矩阵跃动小陌GEO·龙虾智能体的技术架构与落地路径
人工智能·矩阵·自动化
头顶秃成一缕光2 小时前
大语言模型基础(大白话讲解)
人工智能·深度学习·机器学习