Haclon 实现模版匹配

实现思路:首先拍一张图片作为模版,然后对需要检测的图片进行目标匹配,可区分正反,并输出正确目标的中心点位置,以及输出目标的旋转角度

废话不多说,上代码

* 定义常数 pi
pi := 3.141592653589793

* 打开窗口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

* 显示图像
read_image (Image, 'K:/1/11.jpg')
dev_display (Image)

* 创建固定矩形 ROI 区域
gen_rectangle1 (ModelRegion, 100, 100, 400, 400)

* 将图像裁剪到模板区域
reduce_domain (Image, ModelRegion, TemplateImage)

* 创建形状模型
create_shape_model (TemplateImage, 5, rad(0), rad(360), rad(1.0046), ['none','no_pregeneration'], 'use_polarity', [13,26,4], 4, ModelID)

* 获取模型轮廓用于后续变换和显示
get_shape_model_contours (ModelContours, ModelID, 1)

* 设置显示参考位置
smallest_rectangle1_xld (ModelContours, Row1, Column1, Row2, Column2)
RefRow := (max(Row2)-min(Row1))/2
RefColumn := (max(Column2)-min(Column1))/2
vector_angle_to_rigid (0, 0, 0, RefRow, RefColumn, 0, HomMat2D)
affine_trans_contour_xld (ModelContours, TransContours, HomMat2D)

* 显示模型轮廓
dev_display (Image)
dev_set_color ('green')
dev_set_draw ('margin')
dev_display (TransContours)

* 结束模型初始化
* Matching 01: END of generated code for model initialization

* 开始模型应用
* 处理测试图像
TestImages := ['K:/1/1-3.jpg']
for T := 0 to |TestImages| - 1 by 1
    read_image (Image, TestImages[T])

    * 设置较低的分数阈值和较高的匹配数量以检测更多目标
    find_shape_model (Image, ModelID, rad(0), rad(360), 0.9, 10, 0.5, 'least_squares', [5,1], 0.75, Row, Column, Angle, Score)

    * 检测并显示多个目标
    dev_display (Image)
    for I := 0 to |Score| - 1 by 1
        hom_mat2d_identity (HomMat2D)
        hom_mat2d_rotate (HomMat2D, Angle[I], 0, 0, HomMat2D)
        hom_mat2d_translate (HomMat2D, Row[I], Column[I], HomMat2D)
        affine_trans_contour_xld (ModelContours, TransContours, HomMat2D)
        dev_set_color ('green')
        dev_display (TransContours)

        * 将角度值限制在 0 到 2π 之间
        if (Angle[I] < 0)
            Angle[I] := Angle[I] + 2 * pi
        endif
        if (Angle[I] >= 2 * pi)
            Angle[I] := Angle[I] - 2 * pi
        endif

        * 将弧度转换为度数
        AngleInDegrees := Angle[I] * 180 / pi

        * 打印检测到目标的中心点和旋转角度(度数),并换行
        write_string (WindowHandle, '目标中心点: Row: ' + Row[I]$'.2f' + ', Column: ' + Column[I]$'.2f')
        write_string (WindowHandle, ', Angle: ' + AngleInDegrees$'.2f' + ' degrees')
        write_string (WindowHandle, ' ')
    endfor
endfor

模板图片和效果图片如下(输出打印文字根据自己需求进行修改):

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr Dinosaur

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值