Halcon--基于描述符的模板匹配

文章目录

  • 前言
  • 一、思路
  • 二、实现
  • 三、源码
  • 总结


前言

Halcon–基于描述符的模板匹配


一、思路

基于描述符的匹配允许一定程度上的透视形变,并且能够在有无标定的图像当中进行。但不同的是基于描述符的匹配与物体的轮廓无关,只跟目标的特征点相关。
①选择ROI,对ROI进行裁剪得到模板图像。
②根据有无标定,采用create_uncalib_descriptor_model或create_calib_descriptor_model算子进行基于描述符的匹配模型的创建。
③也是根据有无标定两种情况,采用算子find_uncalib_descriptor_model或find_calib_descriptor_model进行搜索目标。
④通过调参进行匹配过程的优化。
⑤清除模型,释放内存。

二、实现

Halcon--基于描述符的模板匹配_第1张图片
Halcon--基于描述符的模板匹配_第2张图片

三、源码

dev_close_window ()
*读取参考图像,这里的参考图像应只包含识别的关键区域,用于创建模板
read_image (ImageLabel, 'D:/USER/Desktop/design/dataset/labelShape-0.jpg')
*设置窗口参数用于显示图像
get_image_size (ImageLabel, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle1)
dev_set_draw ('margin')
dev_display (ImageLabel)
*设置用于存储特征点和感兴趣区域的变量
NumPoints := []
RowRoi := [10,10,Height - 10,Height - 10]
ColRoi := [10,Width - 10,Width - 10,10]
*将参考图像中的除边缘外的区域都设为感兴趣区域。因为参考图像已经近似于匹配的纹理样本
gen_rectangle1 (Rectangle, 10, 10, Height - 10, Width - 10)
*显示参考图像上选择的ROI区域
dev_set_line_width (4)
dev_display (Rectangle)
stop ()
*将感兴趣区域剪裁为模板图像
reduce_domain (ImageLabel, Rectangle, ImageReduced)
dev_clear_window ()
dev_display (ImageLabel)
*创建基于描述符的模板
create_uncalib_descriptor_model (ImageReduced, 'harris_binomial', [], [], ['min_rot','max_rot','min_scale','max_scale'], [-90,90,0.2,1.1], 42, ModelID)
*设置模型的原点,为了后面获取坐标作参照
set_descriptor_model_origin (ModelID, -Height / 2, -Width / 2)
*获取模型中特征点的位置
get_descriptor_model_points (ModelID, 'model', 'all', Row_D, Col_D)
*将模型中计算出的特征点存入NumPoints变量中
NumPoints := [NumPoints,|Row_D|]

*读取测试图像,这里读取的是单通道灰度图像,因此省略了通道转化的步骤
read_image (ImageGray, 'D:/USER/Desktop/design/dataset/labelShape-1.jpg')
dev_resize_window_fit_image (ImageGray, 0, 0, -1, -1)
dev_display (ImageGray)
*对描述符特征点进行匹配
find_uncalib_descriptor_model (ImageGray, ModelID, 'threshold', 800, ['min_score_descr','guided_matching'], [0.003,'on'], 0.25, 1, 'num_points', HomMat2D, Score)
*显示匹配结果,将特征点用不同的颜色绘制出来
if ((|HomMat2D| > 0) and (Score > NumPoints[0] / 4))
    get_descriptor_model_points (ModelID, 'search', 0, Row, Col)
	*创建十字标识符
    gen_cross_contour_xld (Cross, Row, Col, 6, 0.785398)
    projective_trans_region (Rectangle, TransRegion, HomMat2D, 'bilinear')
    projective_trans_pixel (HomMat2D, RowRoi, ColRoi, RowTrans, ColTrans)
    angle_ll (RowTrans[2], ColTrans[2], RowTrans[1], ColTrans[1], RowTrans[1], ColTrans[1], RowTrans[0], ColTrans[0], Angle)
    Angle := deg(Angle)
    if (Angle > 70 and Angle < 110)
        area_center (TransRegion, Area, Row, Column)
        dev_set_color ('green')
        dev_set_line_width (4)
        dev_display (TransRegion)
        dev_set_colored (6)
        dev_display (Cross)                
   endif
endif
stop ()
*匹配结束,释放模板资源
clear_descriptor_model (ModelID)

总结

希望对你有所帮助,有所疑惑欢迎留言交流。

你可能感兴趣的:(Halcon,机器视觉,计算机视觉,图像处理)