【Halcon】基于形状的模板匹配的定位.md
看到一句非常入心的话:天雨大不润无根之草,道法宽只度有缘之人!
说的就是这个理,所有的因果都要追至事物的本质。从古至今,从国家到个人,如果只是华而不实、外强中干,就算机会、机遇在你身旁,你能做的也只能是眼睁睁的看它溜走。
如果想做出点什么,
想收获更多
…
那就撸起袖子加油干!
——《Y忍冬草》
本例程代码主要讲解的是通过形状匹配获取物体,具有抗光照变化和旋转不变性!
1、代码
*
* online shape-based matching with adaptation to illumination changes
* rotational invariant
* rotation/translation to "normalize" the input image
*
* set online to true if you are using an image acquisition device
* if online is set to false, a virtual image acquisition device is opened which reads an image sequence from hard disk
*
online := false
VisUndefPixelBlack := 1
* 关闭窗口更新
dev_update_window ('off')
dev_update_pc ('off')
dev_update_var ('off')
dev_update_time ('off')
* 根据是否是在线抓图,选择抓图方式
if (online)* open the 'real' image acquisition deviceinfo_framegrabber ('1394IIDC', 'revision', RevisionInfo, RevisionInfoValues)open_framegrabber ('1394IIDC', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'default', 'default', -1, -1, AcqHandle)
else* open the virtual image acquisition deviceinfo_framegrabber ('File', 'general', Information, ValueList)open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'pendulum/pendulum', 'default', -1, 1, AcqHandle)
endif
grab_image (Image, AcqHandle)
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, Width + 30, Width, Height, 'black', WindowRot)
dev_open_window (0, 0, Width, Height, 'black', WindowID)
* 设置当前活动窗口
dev_set_window (WindowID)
* 设置显示图像大小
dev_set_part (0, 0, Height - 1, Width - 1)
dev_set_window (WindowRot)
dev_set_part (0, 0, Height - 1, Width - 1)
dev_display (Image)
set_display_font (WindowID, 16, 'mono', 'true', 'false')
* 创建齐次变换矩阵
hom_mat2d_identity (HomMat2DIdentity)
* disp_continue_message (WindowID, 'black', 'true')
* stop ()
* ------------------------
* select the model object
* ------------------------
if (online)* * define template by drawing a rectangle* dev_update_pc ('off')dev_set_window (WindowID)dev_set_draw ('margin')dev_set_line_width (5)grab_image (ImageTempl, AcqHandle)dev_set_window (WindowID)dev_display (ImageTempl)disp_message (WindowID, 'define the template', 'window', 12, 12, 'black', 'true')dev_set_color ('green')draw_rectangle2 (WindowID, RowTempl, ColumnTempl, PhiTempl, Length1, Length2)gen_rectangle2 (Rectangle, RowTempl, ColumnTempl, PhiTempl, Length1, Length2)dev_display (Rectangle)reduce_domain (ImageTempl, Rectangle, ImageReduced)create_shape_model (ImageReduced, 4, 0, rad(360), 'auto', 'none', 'use_polarity', 30, 10, ModelID)intensity (ImageReduced, Image, TemplMean, Deviation)dev_update_pc ('on')
else* * load default object for virtual framegrabber* Length1 := 32.0Length2 := 12.5PhiTempl := -0.315RowTempl := 112.5ColumnTempl := 92.0copy_obj (Image, ImageTempl, 1, 1)gen_rectangle2 (Rectangle, RowTempl, ColumnTempl, PhiTempl, Length1, Length2)reduce_domain (Image, Rectangle, ImageReduced)* 创建形状模型create_shape_model (ImageReduced, 4, 0, rad(360), 'auto', 'none', 'use_polarity', 30, 10, ModelID)* 计算图像灰度值的均值和偏差intensity (ImageReduced, Image, TemplMean, Deviation)
endif
* RowRot := RowTempl
* ColumnRot := ColumnTempl
RowRot := Height / 2
ColumnRot := Width / 2
* ------------------------------------------
* visualize normalized input image
* ------------------------------------------
* 根据点和角度计算刚性矩阵
vector_angle_to_rigid (RowTempl, ColumnTempl, PhiTempl, RowRot, ColumnRot, 0, HomMat2DRotate)
* 对图像进行仿射变换
affine_trans_image (ImageTempl, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')
if (VisUndefPixelBlack == 1)* 将图像扩展到最大尺寸full_domain (ImageAffineTrans, ImageFull)dev_set_window (WindowRot)dev_display (ImageFull)
elsedev_set_window (WindowRot)dev_display (ImageAffineTrans)
endif
dev_set_window (WindowID)
dev_display (ImageTempl)
disp_message (WindowID, 'run the template matching', 'image', 20, 20, 'yellow', 'false')
disp_message (WindowID, 'run the template matching', 'image', 20, 20, 'yellow', 'false')
disp_message (WindowID, '(click left to start,', 'image', 50, 20, 'yellow', 'false')
disp_message (WindowID, 'right to stop)', 'image', 80, 20, 'yellow', 'false')
* disp_continue_message (WindowID, 'black', 'true')
* stop ()
Button := 0
while (Button != 1)* 获取当前鼠标状态get_mbutton (WindowID, dummy, dummy, Button)
endwhile
dev_update_pc ('off')
* ------------------------
* shape-based matching
* ------------------------
Button := 0
Exp := 1
while (Button != 4)if (online)grab_image_async (Image, AcqHandle, -1)elsegrab_image (Image, AcqHandle)endifcount_seconds (Seconds1)find_shape_model (Image, ModelID, 0, rad(360), 0.7, 1, 0.5, 'least_squares', 0, 0.7, Row, Column, Angle, Score)if (Score > 0.5)gen_rectangle2 (Rectangle, Row, Column, PhiTempl + Angle, Length1, Length2)reduce_domain (Image, Rectangle, ImageReduced)intensity (ImageReduced, Image, Mean, Deviation)* Compensate for rotation and translationvector_angle_to_rigid (Row, Column, PhiTempl + Angle, RowRot, ColumnRot, 0, HomMat2DRotate)affine_trans_image (Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')count_seconds (Seconds2)Time := round(1000 * (Seconds2 - Seconds1))if (VisUndefPixelBlack == 1)full_domain (ImageAffineTrans, ImageFull)dev_set_window (WindowRot)dev_display (ImageFull)elsedev_set_window (WindowRot)dev_display (ImageAffineTrans)endifdev_set_window (WindowID)dev_display (Image)disp_message (WindowID, Time + ' ms', 'window', 12, 12, 'black', 'true')dev_set_color ('green')dev_display (Rectangle)elsedev_display (Image)endif* --------------------------* Exit with mouse click* --------------------------dev_error_var (Error, 1)dev_set_check ('~give_error')get_mposition (WindowID, R, C, Button)dev_error_var (Error, 0)dev_set_check ('give_error')if (Error != H_MSG_TRUE)Button := 0endif
endwhile
* 清除形状模型
clear_shape_model (ModelID)
disp_continue_message (WindowID, 'black', 'true')
stop ()
close_framegrabber (AcqHandle)
dev_set_window (WindowRot)
dev_close_window ()
dev_update_pc ('on')
dev_update_var ('on')
dev_update_time ('on')
dev_update_window ('on')
2、结果
3、算子
- full_domain(Image : ImageFull : : )将图像区域扩展到最大尺寸
- dev_set_window( : : WindowHandle : )设置用于显示的活动窗口
- hom_mat2d_identity( : : : HomMat2DIdentity)定义旋转变换矩
- create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)创建形状匹配模型
- intensity(Regions, Image : : : Mean, Deviation)计算图像灰度值的均值和偏差
- vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)通过点和角度计算仿射变换矩阵
- affine_trans_image(Image : ImageAffineTrans : HomMat2D, Interpolation, AdaptImageSize : )对图像进行仿射变换
- get_mbutton( : : WindowHandle : Row, Column, Button)等待鼠标按键按下,并获取其状态
- get_mposition( : : WindowHandle : Row, Column, Button)获取鼠标位置及状态
4、参考
- Halcon官方帮助文档
【Halcon】基于形状的模板匹配的定位.md相关推荐
- halcon基于形状的模板匹配第三例:rectify_result.hdev
这个例子其实是在比较两种ROI"还原"的方式: 模板匹配后,获得仿射变换矩阵T,则对于ROI的分析有两种: 1.全局的,将T.inv()*Img_target得到目标图片全局还原后 ...
- Qt与halcon联合开发实现基于形状的模板匹配
目录 前言 一.基于形状的模板匹配是什么? 二.具体实现 1.算子介绍 2.关键代码实现 总结 前言 第一次在CSDN写博客,准备写一个简单的形状匹配算子的用法及实现的介绍. 一.基于形状的模板匹配是 ...
- OpenCV基于形状的模板匹配
OpenCV基于形状的模板匹配 引言 基于形状的匹配算法 具体代码 KcgMatch.h KcgMatch.cpp main.cpp 匹配的结果 引言 在OpenCV中有个用于模板匹配的基本函数mat ...
- OpenCV实现基于形状的模板匹配(附源码)
效果预览 OpenCV实现基于形状的模板匹配(多角度+不同亮度) 实例演示一: 实例演示二: 实例演示三: 实例演示四: 实例演示五: 实例演示六ÿ
- HALCON基于形变的模板匹配实现
基于形变的模板匹配 先看匹配结果: 下面是HALCON的代码,用匹配助手生成的,现在得到的就是模板上61个点的坐标,还有仿射矩阵,利用仿射矩阵可以算出61个点匹配上的像素坐标. * * Matchin ...
- 基于形状的模板匹配(用于字符识别)研究
一.各模板匹配方法对比 1.基于灰度的匹配一般被称为模版匹配,直接以灰度进行匹配效果不好,对光照很敏感,所以一般会以灰度归一化互相关(NCC)作为匹配依据,增强光照变化下的鲁棒性,为了降低计算量,多采 ...
- HALCON联合C#检测表面缺陷——基于形状的模板匹配设置流程
接上一篇文章,上两篇文章我们把匹配助手中生成的代码导出到C#文件,导出的过程如果有不清楚的可以给我留言. 上一节我们也说过,代码是分为两个部分的,前一部分是设置模板,后一部分是检测流程. 这里多说两句 ...
- HALCON基于形状匹配详解
HALCON基于形状的模板匹配详细说明 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间.去年有过一段时间的集中学习,做了许多的练习和实验,并对基于HDevelop的形状 ...
- Halcon学习笔记之模板匹配-基于形状的多模板匹配
基于形状的模板匹配在我们实际的项目中应用最广,同时在一些项目中,光是选中一个目标作为匹配的模板,效果可能还达不到我们所需要达到的要求或者我们所需要检测的目标存在多个特征需要去判别,所以这个时候可以考虑 ...
最新文章
- jupyter notebook 内核好像挂掉了
- Linux1:Linux概述
- Android开发之修改项目的仓库地址亲测有效
- php无限加载,php递归无限页面加载
- 使用React和axios设置服务器端渲染的最简单方法
- linux登录后出现_bash-4.1#终端提示符异常
- 剑指offer之连续子数组的最大和
- [NodeJS] Hello World 起步教程
- dedecms漏洞getshell EXP最新可用
- 2008是中国的奥运年
- linux 端口映射 命令,linux查看端口映射命令
- CMM3学习笔记二—工程类PA之需求管理(REQM)
- 机器学习:贝叶斯网络
- Win10屏保设置详细教程
- android程序联网失败,请检查网络是否可用
- NFS挂载问题:mount.nfs: access denied by server while mounting 192.168.1.100:/home/rootfs
- Go 1.9 sync Map 源码阅读笔记
- 收缩毛孔全过程,很详细! - 健康程序员,至尚生活!
- 使用Chrome DevTools的Timeline分析页面性能
- 华为鸿蒙有可能成功吗 (by quqi99)
热门文章
- 北医继续学院计算机自测,北京大学医学部网络教育学院 L200自测(1-2节)试卷.doc...
- 九宫图构图学习[2]
- 达梦数据库之redo日志文件损坏修复方法
- lol1.7更新服务器维护,LOL7.1版本更新维护补偿
- android log.d 格式化,Android7.1 logd 日志记录缓冲区大小
- 模拟器下载安装【用于monkey测试】
- 达内科技:聪明的价格战
- Linux之RPM包的安装、升级与卸载命令
- 股东人数选股软件V1.2
- android中下载视频(包括m3u8)的类