当前位置: 首页 > news >正文

Halcon指定区域的形状匹配

Halcon指定区域的形状匹配

文章目录

  • Halcon指定区域的形状匹配
    • 1.在参考图像中选择目标
    • 2.创建模板
    • 3.搜索目标

在这个实例中,会介绍如何根据选定的ROI选择合适的图像金字塔参数,创建包含这个区域的形状模板,并进行精确的基于形状模板的匹配。最后,将匹配到的形状区域在测试图像上标示出来。

1.在参考图像中选择目标

采集图像之后,接下来要做的是确定ROI的范围,创建一个包含目标的ROI。在本例中,首先使用read_image 算子获取参考图像,接着为了获取ROI,使用gen_rectangel1算子生成一个包含目标的矩形框。也可以使用其他类似的工具,如使用draw_rectangle1算子、draw_circlel算子创建一个包含目标物体的形状;或者利用形态学算法筛选出一个ROI。接着,使用reduce_domain 算子对选定的区域进行裁剪,创建模板图像。

2.创建模板

使用create_shape_model算子创建一个模板。在这之前,推荐使用inspect_shape_model算子,它可以帮助选择合适的模板参数,主要是金字塔层级和对比度。具体做法是,预设inspect_shape_model 算子的最后两个参数,其中NumLevels 表示金字塔的层级,Contrast表示点的最小对比度。该算子执行后会把预设了这两种参数的分级图像显示出来,可以根据需要判断参数设置得是否合理。例如,金字塔层级的最小图像如果不清晰,可以考虑降低层级数;如果对比度设置的值不足以提取出整个形状的轮廓,可以试着进行调整,以确定合适的参数。
在确定了金字塔层级和最小对比度之后,就可以创建模板了。创建模板时,除了上面两个参数外,还可以根据需要定义模板的其他参数。例如,可以通过AngleStart和AngleExtent 约束允许旋转的角度,通过 AngleStep约束角度变化的步长。这几个角度参数需要根据形状在图中可能发生的旋转角度进行设置。如果模板图像特别大,可以用Optimization对模型进行优化,减少点的数量。参数Metric 用来指定是否考虑极性的变化,如光照的影响。最后,还可以指定最小对比度参数MinContrast,用于将模板与图像噪声区分开来。
创建完成以后,create shape model算子会返回一个句柄,名称是ModelID,用来指定模板的名称。本例中还使用了get_shape_model_contours算子,用于观察提取出的形状轮廓。

3.搜索目标

创建好模板之后,接下来就是匹配计算。首先读取待检测的图像,然后使用find_shape_model算子搜索最佳匹配的区域,拽索到的区域的匹配分值会存入score参数中。如果各种参数都设定得很合适,应该会找到至少一个大于置信值的区域。
最后为了显示结果,可以在画面上依据计算结果绘图。这里绘制的是形状的轮廓,并根据图像的二维投影变换,将形状轮廓也进行了仿射变换,这样就能很清楚地看到结果。
如果这个模板不再使用,需用clear_shape_model算子将其清除,这样就可以将它所占用的内存释放了。该程序的运行结果如图所示。
在这里插入图片描述
图(a)为原始图像,用矩形框选择了箭头区域图像作为ROI,并根据其创建模板;图(b)为依据模板图像创建的图像金字塔;图(c)为测试图像,相比于原图,测试图像发生了小范围的缩放和旋转,并且有比较大的光照变化。拽索到最佳匹配形状后,在图上将其轮廓标示了出来。该程序的完整代码如下:

* 这个例子用来介绍 HALCON中的形状模板匹配
dev_close_window()
*读取图像并获取其宽高
read_image(ModelImage, 'data/arrow1')
median_image (ModelImage, ImageMedian, 'circle', 6, 'mirrored')
get_image_size(ModelImage, Width,Height)
dev_open_window (0, 0, Width/2, Height/2, 'white', WindowHandle)
*显示模板图像
dev_display (ModelImage)
* 设置画笔颜色和线条
dev_set_color ('yellow')
dev_set_line_width (3)
* -------------------  形状模板匹配程序  ----------------
*第1步:选择模板中的目标
Row1 := 281
Column1 := 160
Row2 := 440
Column2 := 312
*用矩形框选定一个目标区域
gen_rectangle1 (ROI, Row1, Column1, Row2, Column2)
*显示ROI区域
dev_display (ROI)*剪裁出这个区域
reduce_domain (ModelImage, ROI, ImageROI)
*第2步,创建模板*检查模板参数
inspect_shape_model (ImageROI, ShapeModelImages, ShapeModelRegions, 4, 50)*显示金字塔各层级的图像,以检查层数的合理性
dev_display (ShapeModelRegions)
area_center (ShapeModelRegions, AreaModelRegions, RowModelRegions,ColumnModelRegions)
count_obj (ShapeModelRegions, HeightPyramid)*确定金字塔的层级
for i := 1 to HeightPyramid by 1
if (AreaModelRegions[i - 1] >= 15)NumLevels := iendif
endfor*使用ROI图像创建模板
create_shape_model (ImageROI, NumLevels, 0, rad(360), 'auto', 'none', 'ignore_global_polarity', 50, 10, ModelID)
*获取轮廓信息,用于结果显示
get_shape_model_contours (ShapeModel, ModelID, 1)
* step 3: 在检测图像中搜索模板
*读取检测图像
read_image(SearchImage, 'data/arrow2')
*寻找最佳模板匹配
find_shape_model (SearchImage, ModelID, 0, rad(360), 0.3, 1, 0.5, 'least_squares', 0, 0.7,	RowCheck, ColumnCheck, AngleCheck, Score)
*如果找到了目标,则将它标示出来
if (|Score| > 0.9)*计算刚性变换矩阵vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck,	MovementOfObject)*应用二维仿射变换XLD轮廓,以便在图像中显示检测到的轮廓affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject)*显示检测图像gen_rectangle2 (recResult, RowCheck, ColumnCheck, AngleCheck, 80, 80)dev_set_draw ('margin')dev_display (SearchImage)*标示出检测到的模板dev_display (ModelAtNewPosition)dev_set_color ('blue')dev_display (recResult)
endif
* -------------------  程序结束  -----------------
* 清除模板
clear_shape_model (ModelID)
http://www.lryc.cn/news/288362.html

相关文章:

  • Linux——常用命令
  • 外包干了2个月,技术反而退步了...
  • 洛谷C++简单题练习day6—P1830 城市轰炸
  • 【linux-interconnect】What NVIDIA MLNX_OFED is?
  • Unity开发中的XML注释
  • [MQ]常用的mq产品图形管理web界面或客户端
  • JWT令牌(JSON Web Token)
  • 华硕ASUS K43SD笔记本安装win7X64(ventoy为入口以支撑一盘多系统);友善之臂mini2440开发板学习
  • npm设置源(原淘宝源域名已过期)
  • 操作系统-进程通信(共享存储 消息传递 管道通信 读写管道的条件)
  • NODE笔记 2 使用node操作飞书多维表格
  • Scikit-Learn 高级教程——自定义评估器
  • 6 时间序列(不同位置的装置如何建模): GRU+Embedding
  • Git 基本概念
  • android:excludeFromRecents
  • 微信小程序登录获取手机号教程(超详细)
  • uniapp app更新
  • C语言第八弹---一维数组
  • 科普栏目 | 水离子水壁炉是如何打造清新环境,提升居家生活?
  • python 进程
  • 网络编程套接字(1)
  • harmonyOS app 开发环境配置流程
  • 【嵌入式学习】C++QT-Day2-C++基础
  • 新手基础易懂的创建javaweb项目的方法(适用于IDEA 2023版)
  • 决策树的基本构建流程
  • [极客大挑战 2019]Upload1
  • Android 渲染机制
  • go语言Map与结构体
  • C#,打印漂亮杨辉三角形(帕斯卡三角形)的源代码
  • [SUCTF 2019]CheckIn1