模板图片:目标是获取图像左上角位置的数字

直接想法,直接用一个框将数字框出来,然后对图片进行模板匹配(不可行,因为图像中的数字不是固定的)

所以需要选择图像中的固定不变的区域来作为模板,然后根据模板区域来找到我们的目标区域,案例以左上角的商标名称作为模板区域

代码:案例图片在C:\Users\HJ\AppData\Roaming\MVTec\HALCON-21.05-Progress\examples\images\blister(根据自己安装halcon的位置来寻找)

*读取模板图片,了解目标需求:获取图片左上角的数字并识别出来
read_image (TemplateImage, 'C:/Users/HJ/Desktop/test_image/cd_cover/cd_cover_01.png')
get_image_size (TemplateImage, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display(TemplateImage) *第一想法肯定是:既然要找数字,直接模板匹配找数字就好了,但是模板匹配找的是与图像中与模板类似的区域,但数字明显会发生变化。
*所以需要找所有图像上固定不会变的区域来作为模板,并求出这个区域的中心,本例以左上角的商标名称作为模板区域
draw_rectangle1(WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1(NumberRectangle, Row1, Column1, Row2, Column2)
reduce_domain(TemplateImage, NumberRectangle, TemplateImageReduced)
area_center(NumberRectangle, Area, CenterModelROIRow, CenterModelROIColumn) *选择完模板区域之后,我们的目标区域(数字)在模板区域的下面,所以再用一个框将目标区域框出来
*这样子就知道了目标区域与模板区域之间的关系,在后续进行模板匹配的时候,匹配到模板区域之后,就可以通过仿射变换将目标区域找出来
gen_rectangle1 (NumberROI, Row2, Column1, Row2 + 30, Column2) *创建一个shape模型,角度范围0-rad(360)
create_shape_model(TemplateImageReduced, 'auto', 0, rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
get_shape_model_contours(ShapeModel, ModelID, 1)
ImageFiles := 'cd_cover/cd_cover_'
for I := 1 to 4 by 1
read_image(SearchImage, ImageFiles + I$'.2d')
find_shape_model (SearchImage, ModelID, 0, rad(360), 0.7, 1, 0.7, 'least_squares', 0, 1, RowMatch, ColumnMatch, AngleMatch, Score)
if (|Score| > 0)
*先对模板区域进行仿射变换,找到图片中的模板区域
vector_angle_to_rigid (0, 0, 0, RowMatch, ColumnMatch, AngleMatch, MovementOfModel)
affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfModel) *做一个仿射变换,获取模板区域的仿射变换矩阵,因为模板匹配的结果默认是以(0,0)作为原点,所以需要映射到实际图片中的位置
vector_angle_to_rigid (CenterModelROIRow, CenterModelROIColumn, 0, RowMatch, ColumnMatch, AngleMatch, MovementOfObject)
affine_trans_region(NumberROI, RegionAffineTrans, MovementOfObject, 'nearest_neighbor') *获取到目标区域之后,求目标区域(矩阵)的逆,然后将该逆矩阵和原图做矩阵运算,生成新的图像
hom_mat2d_invert(MovementOfObject, HomMat2DInvert)
affine_trans_image(SearchImage, RectifiedSearchImage, HomMat2DInvert, 'constant', 'false')
*生成的图像是旋转正了的,区域与模板图像的区域位置相同,所以就可以获取前出目标区域
reduce_domain(RectifiedSearchImage, NumberROI, RectifiedNumberROIImage)
endif endfor
clear_shape_model(ModelID)

Halcon 模板匹配实战代码(一)的更多相关文章

  1. halcon 模板匹配(最简单)

    模板匹配是机器视觉工业现场中较为常用的一种方法,常用于定位,就是通过算法,在新的图像中找到模板图像的位置.例如以下两个图像.   这种模板匹配是最基本的模板匹配.其特点只是存在平移旋转,不存在尺度变化 ...

  2. 重新看halcon模板匹配

    工业中模板匹配有很多需求. 代码如下: read_image (Image, 'J:/测试图片/test1/1.bmp') get_image_size (Image, Width, Height) ...

  3. halcon模板匹配

    在机器视觉应用中,经常需要对图像进行仿射变换.1.在基于参考的视觉检测中,由于待检图像与参考图像或多或少都会存在几何变化(平移.旋转.缩放等),所以在做比较之前一般都要对待检图像进行仿射变换以对齐图像 ...

  4. halcon 模板匹配 -- 转化 vector_angle_to_rigid

    ********************************模板匹配 ********************create_shape_model创建模板,这个函数有许多参数,其中金字塔的级数由N ...

  5. halcon 模板匹配 -- find_shape_model

    find_shape_model(Image : :  //搜索图像 ModelID, //模板句柄 AngleStart,  // 搜索时的起始角度 AngleExtent, //搜索时的角度范围, ...

  6. halcon 模板匹配 -- create_shape_model

    create_shape_model(Template : : //reduce_domain后的模板图像 NumLevels,//金字塔的层数,可设为“auto”或0—10的整数 AngleStar ...

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

    注:很抱歉,忘记从转载链接了,作者莫怪.... 基于HALCON的模板匹配方法总结 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间.去年有过一段时间的集中学习,做了许多 ...

  8. 转载:基于HALCON的模板匹配方法总结

    转载链接:     http://blog.csdn.net/b108074013/article/details/37657801 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总 ...

  9. Halcon编程-基于形状特征的模板匹配

    halcon软件最高效的一个方面在于模板匹配,号称可以快速进行柔性模板匹配,能够非常方便的用于缺陷检测.目标定位.下面以一个简单的例子说明基于形状特征的模板匹配.      为了在右图中,定位图中的三 ...

随机推荐

  1. 分布式存储之GlusterFS

    公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 1.glusterfs概述 GlusterFS系统是一个可扩展的网络文件系统,相比其他分布式文件系统,GlusterFS具有 ...

  2. wsgiref模块,动静态网页,jinja2模块,django

    基于wsgiref模块搭建服务端 from wsgiref import simple_server def run(request, response): """ :p ...

  3. 用 Python 远程控制 Windows 服务器,太好用了!

    在很多企业会使用闲置的 Windows 机器作为临时服务器,有时候我们想远程调用里面的程序或查看日志文件 Windows 内置的服务「 winrm 」可以满足我们的需求 它是一种基于标准简单对象访问协 ...

  4. 由C# dynamic是否装箱引发的思考

    前言 前几天在技术群里看到有同学在讨论关于dynamic是否会存在装箱拆箱的问题,我当时第一想法是"会".至于为啥会有很多人有这种疑问,主要是因为觉得dynamic可能是因为有点特 ...

  5. WSL2-CentOS7固定IP

    WSL2-CentOS7固定IP WSL2 采用 Hyper-V 的 Internal Virtual Switch,这个虚拟交换机本身是可以设置静态 IP 地址的,但是 WSL2 却自作聪明,在每次 ...

  6. Fail2ban 命令详解 fail2ban-regex

    fail2ban-regex是fail2ban提供的用来测试正则表达式的一个小工具,我们可以用它来测试正则表达式是否能够匹配到日志文件中的要禁止的IP行. fail2ban-regex默认情况下自动匹 ...

  7. 爬虫Ⅱ:scrapy框架

    爬虫Ⅱ:scrapy框架 step5: Scrapy框架初识 Scrapy框架的使用 pySpider 什么是框架: 就是一个具有很强通用性且集成了很多功能的项目模板(可以被应用在各种需求中) scr ...

  8. 二叉树遍历在Unity中的实现

    前言:今天放一天,想到要放国庆假了就心烦气躁,躺床上又焦虑,回想起面试官的一副扑克脸,马上跳起来看了看数据结构. 今天复习了二叉树,包括一些基本概念和特性,当看到二叉树遍历的章节时,马上联想到了Uni ...

  9. 白嫖Azure与体验GoLand远程开发

    前言 近期因为有本地开发远程使用Linux编译部署的需求,而虚拟机的性能实在是不敢恭维,WSL的坑之前也踩过(没有systemd等),故考虑使用SSH连接云服务器开发. 目前VSCode提出了Remo ...

  10. C#与SQL Server连接时,如何编写连接字符串?

    一.Windows身份验证时: String conStr = "Data Source=数据库服务器地址;Initial Catalog=数据库名称;Integrated Security ...