halcon模板匹配学习(二) 准备模板

如下,我们将介绍匹配的第一个操作:准备模板

初始时刻,我们准备好参考图像,并对其做一定的处理,然后我们需要从参考图像中导出模板,也就是将参考图像裁剪成所谓的模板图像。获取模板图像可以通过设置ROI来完成。对于某些应用来说,也可以使用综合模板代替模版图像。综合模板既可以是综合创造的模板图像,也可以是一个XLD轮廓。

裁剪参考图像,使之成为模板图像

为了创建模板图像,我们需要从参考图像中选取ROI,并使用 reduce_domain裁剪图像的定义域为我们选取的ROI。这样我们就创建了模板图像,后续将作为匹配算子的输入参数。

选取ROI有两种方法:

  • 直接指定法。
    我们可以直接指定区域的参数进而直接生成区域。HALCON 提供了多种算子用来创建区域,既包括标准的形状像矩形gen_rectangle2)或者椭圆(gen_ellipse) 到自由形状的区域,比如多边形区域(gen_region_polygon_filled).为了使用这些算子,你需要这些区域的参数,比如矩形的位置、大小、方向或者园的位置和半径。如果这些参数不能直接获得,你可以使用draw算子,比如你可以在打开的图像上画一个形状,然后返回其参数。这些算子可以在HDevelop菜单 Operators :fa-play: Graphics :fa-play: Drawing 获得。
  • 通过图像处理获得区域。
    有时我们可以通过图像处理获得区域,如阈值处理分割图像、通过blob分析connection、fill_up、select_shape等可以选取某种特征的区域。

综合模板图像,作为模板图像的替代选择

综合模板图像

综合模板图像主要应用于 correlation-based 匹配和所有基于轮廓的2D方法 比如 shape-based, component-based, local deformable, and perspective deformable matching.
如下我们举例说明。




我们想要定位电容。如果我们选择明亮的圆域作为ROI区域,则会发现该区域包括大量的噪声点。因此最后匹配出的电容只有一个。如果我们改进之前的圆区域,换成一个环形区域作为ROI,则最后匹配出理想的电容区域。但是即使这样,环形区域使得内部的区域丢失了一部分,而且仍然包含部分噪点,所以不理想。

最好的方法是使用综合模板图像。具体步骤如下:
Step 1: 创造一个XLD轮廓
首先我们使用算子gen_ellipse_contour_xld创造一个圆形区域。

RadiusCircle := 43
SizeSynthImage := 2*RadiusCircle + 10
gen_ellipse_contour_xld (Circle, SizeSynthImage/2, SizeSynthImage/2, 0, 
RadiusCircle, RadiusCircle, 0, 6.28318, 'positive', 1.5)

注意合成图像应该比区域大一些,因为对于 shape-based matching,当创建图像金字塔时,区域外面的像素也被使用。
Step 2: 创造一个图像,并将XLD插入图像中
然后我们使用算子gen_image_const创造一个空的图像,并使用算子* paint_xld*将XLD轮廓插入图像中.

gen_image_const (EmptyImage, 'byte', SizeSynthImage, SizeSynthImage)
paint_xld (Circle, EmptyImage, SyntheticModelImage, 128)

Step 3: 创建模型
使用综合模板创建模型。




请注意:
完整的代码,见:HDevelop 项目 solution_guide/matching/synthetic_circle.hdev

来自XLD轮廓的模型

对于 shape-based matching 和 the local and perspective deformable matching,你不必要从一个XLD轮廓中创建一个综合模板图像,因为你可以直接使用XLD轮廓作为模板。比如说,对于shape-based matching, 你不必要提供一幅图像,选择ROI,然后调用 create_shape_model, create_scaled_shape_model, or create_aniso_shape_model其中之一去创建模型。

相反,你可以简单地调用create_shape_model_xld, create_scaled_shape_model_xld, or create_aniso_shape_model_xld使用XLD轮廓作为输入参数。

举例说明。如下的完整项目,见 HDevelop example program: examples\hdevelop\Matching\Shape-Based\create_shape_model_xld.dev:

gen_circle_contour_xld (ContCircle, 300, 300, MeanRadius, 0, 6.28318, \
'positive', 1)
create_shape_model_xld (ContCircle, 'auto', 0, 0, 'auto', 'auto', \
'ignore_local_polarity', 10, ModelID)

对于 local and perspective deformable matching 的处理也可以相应的被使用。这里你可以使用算子create_local_deformable_model_xld for the local deformable matching and create_planar_uncalib_deformable_model_xldor create_planar_calib_deformable_model_xld, respectively, for perspective deformable matching.

初始时刻不知道极性,因为轮廓不提供极性。所以需要在一个有代表性的图像中做实验,看看如何设置极性。开始忽略极性,即参数
Metric设置为ignore_local_polarity,后面设置极性.可以调用算子set_shape_model_metric for shape-based matching,set_local_deformable_model_metric
for local deformable matching, and set_planar_uncalib_deformable_model_metric or
set_planar_calib_deformable_model_metric, respectively, for perspective deformable matching.
然后极性信息就被存储到模型中。然后在接下里的搜索算子中可以通过参数
Metric设置各位合适的值,如’use_polarity’. 这种处理强烈推荐给迅速且鲁棒的搜索。

find_shape_model (Image, ModelID, 0, 0, 0.7, 0, 0, 'least_squares', 0, 0.9, Row, Column, Angle, Score)... accessing the indices of the matches
... that represent suitable drill holesvector_angle_to_rigid (0, 0, 0, Row[HoleIndices[0]], Column[HoleIndices[0]], Angle[HoleIndices[0]], HomMat2D)set_shape_model_metric (Image, ModelID, HomMat2D, 'use_polarity')for Index := 2 to 9 by 1read_image (Image, 'brake_disk/brake_disk_part_'+Index$'02d')find_shape_model (Image, ModelID, 0, 0, 0.7, 0, 0,   'least_squares', 0, 0.9, Row, Column, Angle, Score)
endfor

如下图为示意图:




注:关于极性的选择。



1. 使用极性模式: 要求模板与图像黑白亮度对应。
2. 忽略模板全局极性: 不需要模板与图像黑白亮度对应
3. 忽略局部极性: 不需要模板与图像黑白亮度对应,允许变化。


打赏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘继承技术之虚函数

虚函数 调用虚函数时函数行为将根据对象所属类的不同而变化。 父类指针或引用指向子类对象时&#xff0c;可访问子类重写方法&#xff08; virtual函数&#xff09;但无法访问在父类中没有定义的子类方法和数据成员。 #include <iostream>using namespace std;class Supe…

java中GET方式提交和POST方式提交

java中GET方式提交的示例&#xff1a; /*** 获取关注列表;* return*/SuppressWarnings("unchecked")public static ArrayList<String> getUserList() {StringBuffer bufferRes new StringBuffer();ArrayList<String> users null;try {URL realUrl new…

基于HALCON的模板匹配方法总结

很早就想总结一下前段时间学习HALCON的心得&#xff0c;但由于其他的事情总是抽不出时间。去年有过一段时间的集中学习&#xff0c;做了许多的练习和实验&#xff0c;并对基于HDevelop的形状匹配算法的参数优化进行了研究&#xff0c;写了一篇《基于HDevelop的形状匹配算法参数…

js 数组移除_2020前端面试--常见的js面试题

&#xff08;答案持续更新...&#xff09; 1.简述同步和异步的区别js是一门单线程语言&#xff0c;所谓"单线程"&#xff0c;就是指一次只能完成一件任务。如果有多个任务&#xff0c;就必须排队&#xff0c;前面一个任务完成&#xff0c;再执行后面一个任务&#xf…

spring-自动加载配置文件\使用属性文件注入

在上一篇jsf环境搭建的基础上 , 加入spring框架 , 先看下目录结构 src/main/resources 这个source folder 放置web项目所需的主要配置,打包时,会自动打包到WEB-INF下 首先看下pom.xml,需要引入一些依赖项: 1 <project xmlns"http://maven.apache.org/POM/4.0.0" x…

pygame碰撞检测

最近在学Pygame,花一段时间做了一个异常简陋版的"打砖块". 这次重点说一下困扰我比较长时间的碰撞检测(个人太菜..). 按照网上教程比较普遍的方法(也可能是我没看见别的),碰撞检测依次计算移动物体与被碰撞物体各个边之间坐标是否相交.例如下列代码,检测小球与窗口的…

2017-5-4 进程

进程&#xff1a;一个应用程序就是一个进程开启某个进程Process.Start("文件缩写名");通过绝对路径开启某个进程Process p new Process();p.StartInfo new ProcessStartInfo("要打开的程序绝对路径");p.Start(); 获取全部开启的进程&#xff1a;Process.…

很有用的cv牛人的网址和主要贡献

CV人物1&#xff1a;Jianbo Shi史建波毕业于UC Berkeley&#xff0c;导师是Jitendra Malik。其最有影响力的研究成果&#xff1a;图像分割。其于2000年在PAMI上多人合作发表"Noramlized cuts and image segmentation"。这是图像分割领域内最经典的算法。主页&#xf…

c++分治法求最大最小值实现_程序员:算法导论,分治法、归并排序,伪代码和Java实现...

分治法我们首先先介绍分治法。分治法的思想&#xff1a;将原问题分解为几个规模较小但类似于原问题的子问题&#xff0c;递归地求解这些子问题&#xff0c;然后在合并这些子问题的解来解决原问题的解。还是拿扑克牌举例子&#xff0c;假设桌上有两堆牌面朝上的牌(牌面朝上&…

菜根谭#82

风来疏竹&#xff0c;风过而竹不留声&#xff1b;雁度寒潭&#xff0c;雁去而潭不留影&#xff1b;故君子事来而心始现&#xff0c;事去而心随空。 转载于:https://www.cnblogs.com/star4knight/p/3604403.html

解读ASP.NET 5 MVC6系列(9):日志框架

解读ASP.NET 5 & MVC6系列&#xff08;9&#xff09;&#xff1a;日志框架 原文:解读ASP.NET 5 & MVC6系列&#xff08;9&#xff09;&#xff1a;日志框架框架介绍 在之前的.NET中&#xff0c;微软还没有提供过像样的日志框架&#xff0c;目前能用的一些框架比如Log4N…

2017第18周四

继续加班中&#xff0c;很多事不如预期。时间花费很多但效果不成比例。越忙落下的事越多&#xff0c;有时候还需要让自己静下来想想&#xff0c;到底有什么是重要的。集中精力放在重要的哪些事&#xff0c;尽自己最大努力即可&#xff0c;尽最大努力即使没有达到也可以没有遗憾…

halcon相关的链接

论坛、培训 halcon学习网&#xff1a;http://www.ihalcon.com/鸟叔机器视觉&#xff1a;http://bbs.szvbt.com/forum.php 博客 韩兆新的博客园majunfuLife and Codingzhaojun的博客風韻無聲骑蚂蚁上高速的博客小马_xiaoLV2小新识图程序园-程序员的世界章柯渊的博客 注&…

[转]Java8-本地缓存

这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存。因为Map有一个新的方法可以在key为Null的时候自动计算一个新的value值。非常完美的实现cache。来看下代码&#xff1a; public static void main(String[] args) {for (int i 0; i < 10; i)Syst…

python opencv图像处理程序_Python-OpenCV学习(四):基本图像处理

转载请注明出处&#xff1a;danscarlett的博客园 参考资料&#xff1a; 目录&#xff1a; 读取 imread 显示 imshow 存储 imwrite 缩放 resize 加边框 copyMakeBorder 裁剪 img[x_start:x_end,y_start:y_end] 1.图像读取&#xff1a; cv2.imread(fileName,flagsNone) 函数功能&…

Java进程占用CPU资源过多分析

问题描述&#xff1a; 生产环境下的某台tomcat7服务器&#xff0c;在刚发布时的时候一切都很正常&#xff0c;在运行一段时间后就出现CPU占用很高的问题&#xff0c;基本上是负载一天比一天高。 问题分析&#xff1a; 1&#xff0c;程序属于CPU密集型&#xff0c;和开发沟通过&…

分针网——怎么轻松学习JavaScript

js给初学者的印象总是那么的“杂而乱”&#xff0c;相信很多初学者都在找轻松学习js的途径。我试着总结自己学习多年js的经验&#xff0c;希望能给后来的学习者探索出一条“轻松学习js之路”。js给人那种感觉的原因多半是因为它如下的特点&#xff1a;A&#xff1a;本身知识很抽…

MATLAB中floor、round、ceil、fix区别

Matlab取整函数有: fix, floor, ceil, round.具体应用方法如下&#xff1a;fix朝零方向取整&#xff0c;如fix(-1.3)-1; fix(1.3)1;floor&#xff0c;顾名思义&#xff0c;就是地板&#xff0c;所以是取比它小的整数&#xff0c;即朝负无穷方向取整&#xff0c;如floor(-1.3)-2…

python时间序列分析航空旅人_用python做时间序列预测一:初识概念

利用时间序列预测方法&#xff0c;我们可以基于历史的情况来预测未来的情况。比如共享单车每日租车数&#xff0c;食堂每日就餐人数等等&#xff0c;都是基于各自历史的情况来预测的。 什么是时间序列&#xff1f; 时间序列&#xff0c;是指同一个变量在连续且固定的时间间隔上…

解决mysql不能远程登入的问题

mysql远程不能登入&#xff0c;问题就在于当时设置的账号只限制本地访问&#xff0c;mysql默认也只是本地访问。之前的设置&#xff1a; 通过命令行登录管理MySQL服务器&#xff08;提示输入密码时直接回车&#xff09;&#xff1a; mysql> /usr/local/webserver/mysql/bin/…