Halcon基于相关性的模板匹配create_ncc_model

2024-01-23 04:04

本文主要是介绍Halcon基于相关性的模板匹配create_ncc_model,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Halcon基于相关性的模板匹配

基于相关性的模板匹配也是一种基于灰度特征的匹配方法。该方法使用一种基于行向量的归一化互相关匹配法,在检测图像中匹配模板图像。与基于灰度值的匹配相比,该方法速度快得多,并且能够适应线性光照变化。与基于形状的模板匹配相比,该方法能适用于有大量纹理的模板,支持有轻微形变的搜索,能弥补形状模板在某些方面的不足。
使用基于相关性的匹配有如下步骤。
(1)从参考图像上选择检测的目标。使用矩形选区等方式,从参考图像上选择一块ROI,然后使用reduce_domain 算子将该区域裁剪成一个独立的图像区域。
(2)创建模板。用上一步裁剪后的图像创建一个归一化的互相关模型,使用的是create_ncc model 算子。该算子的原型如下:

create_ncc_model(Template : : NumLevels, AngleStart, AngleExtent, Anglestep, Metric : ModelID)

参数 Template 是输入的包括了ROI的图像。参数NumLevels 是金字塔的层数,默认可以设为auto,程序将自动确定合适的金字塔层级数,该层级数可以通过 get_ncc_model_params 算子进行查看。AngleStart和AngleExtent 两个参数确定了模板图像可能出现在检测图像上的旋转角度范围,在这个范围内的旋转才有可被搜素到。参数 AngleStep 为角度旋转变化的步长。模型的角度变化是在检测前进行预处理,并将旋转信息保存在内存中的。因此,旋转的角度大小和模型的点的数量决定了所需内存的大小。也可以设置AngleStep为auto或0,则程序会自动确定合适的旋转角度的步长。旋转的中心点是模板图像的重心。
表示在检测图像中识别模板的条件,或者说是“度量”。该参数在其他几种匹配算子中也经常用到。这里有两个可选择的值:use_polarity 和ignore_global_polarity。如果选择use_polarity,那么检测图像中的目标对象必须和模板中的目标对象具有相同的对比度“方向”。例如,模板中是一个暗背景上有一个亮的目标,那么在检索时,只有符合匹配条件并且亮度比背景亮的目标才能被检测出来。如果选择ignore_global_polarity,那么该亮度变化可以忽略,还是上面的例子,即使是前景与背景的对比度“方向”相反,即该目标比背景还暗,也能检测出来。
参数ModelID是模板的句柄,供匹配算子find_ncc_model调用。在该算子中,有一个参数MinSore用于指定匹配分数的最小值,即低于这个匹配分数的匹配结果就不需要返回了。由于匹配分数是从归一化的互相关系数中来的,为了提升匹配速度,这个分数的阈值应该尽可能设置得高一点,但是也要防止设得过高导致匹配失败。
匹配结束后,使用clear_ncc_model算子释放模板。其代码如下:

*读取参考的原始图像。如果是彩色的,需要先转化为单通道灰度图像
read_image (Image, 'data/carmex-0')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*设置窗口绘制参数,线宽设为3
dev_set_line_width(3)
dev_set_draw ('margin')
*创建圆形,因为目标区域是圆形,因为用圆形将ROI区域选择出来
gen_circle (Circle, 161, 208, 80)
*获取圆形的中心点,为匹配后的可视化显示结果做准备
area_center (Circle, Area, RowRef, ColumnRef)
*裁剪ROI区域,得到模板图像
reduce_domain (Image, Circle, ImageReduced)
*创建基于相关性的匹配模型,输入模板图像和模型参数
create_ncc_model (ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID)
*显示原始图像和圆形框
dev_display (Image)
dev_display (Circle)
stop ()
*读取测试图像。该测试图像和参考图像比起来有轻微的位移,旋转,缩放,以及失焦
read_image (Image2, 'data/carmex-1')
*进行行基于相关性的模板匹配
find_ncc_model (Image2, ModelID, 0, 0, 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
vector_angle_to_rigid (RowRef, ColumnRef, 0, Row, Column, 0, HomMat2D)
*对圆形进行仿射变换,使其将匹配的结果目标标识出来
affine_trans_region (Circle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
*显示测试画面和圆形标记圈
dev_display (Image2)
dev_display (RegionAffineTrans)
*匹配结束,释放模板资源
clear_ncc_model (ModelID)

这篇关于Halcon基于相关性的模板匹配create_ncc_model的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/635180

相关文章

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

最大流、 最小费用最大流终极版模板

最大流  const int inf = 1000000000 ;const int maxn = 20000 , maxm = 500000 ;struct Edge{int v , f ,next ;Edge(){}Edge(int _v , int _f , int _next):v(_v) ,f(_f),next(_next){}};int sourse , mee

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter