【Halcon】基于形状的模板匹配的定位.md

本文介绍了一种基于形状的图像匹配方法,该方法能够抗光照变化和旋转不变性,适用于实时图像识别场景。通过创建形状模型并应用仿射变换,算法能够在不同条件下准确识别目标物体。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看到一句非常入心的话:天雨大不润无根之草,道法宽只度有缘之人!

说的就是这个理,所有的因果都要追至事物的本质。从古至今,从国家到个人,如果只是华而不实、外强中干,就算机会、机遇在你身旁,你能做的也只能是眼睁睁的看它溜走。

如果想做出点什么,

想收获更多

那就撸起袖子加油干!

​ ——《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 device
    info_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 device
    info_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.0
    Length2 := 12.5
    PhiTempl := -0.315
    RowTempl := 112.5
    ColumnTempl := 92.0
    copy_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)
else
    dev_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)
    else
        grab_image (Image, AcqHandle)
    endif
    count_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 translation
        vector_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)
        else
            dev_set_window (WindowRot)
            dev_display (ImageAffineTrans)
        endif
        dev_set_window (WindowID)
        dev_display (Image)
        disp_message (WindowID, Time + ' ms', 'window', 12, 12, 'black', 'true')
        dev_set_color ('green')
        dev_display (Rectangle)
    else
        dev_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 := 0
    endif
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官方帮助文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值