Halcon_模板匹配

在这里插入图片描述
*

模板匹配
*读取并显示图像;
*确定模板ROI及检测ROI;
*创建模型;
*匹配模板;
*ROI仿射变换,得到ROI位置


dev_update_off()
dev_close_window ( )

*#读取整个文件夹的图像
*1 列出指定路径下的文件
list_files ('./Files', 'files', Files)
tuple_regexp_select (Files, '\\.jpg$', Files)
read_image (Image, Files[0])

dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)

*2 根据模板形状创建相应区域
read_image (T, './moban/moban_1.jpg')

get_image_size (T, Width, Height)
dev_set_color ('red')

*圆形
gen_circle (shape, 2093, 1630, 1773)
*矩形
*gen_rectangle1 (shape, 164.5, 126.5, 323, 476.5)

*多边形轮廓
*dev_set_color ('green')
*dev_set_line_width (3)
*坐标数组
*rows1:=[20,100,100,20,20]
*cols1:=[20,20,250,250,20]
*radius:=[20,20,20,20,20]
*rows2:=[20,20,100,100,20]
*cols2:=[320,550,550,320,320]
*带圆角的多边形轮廓
*gen_contour_polygon_rounded_xld (Contour, rows1, cols1, radius, 1)
*不带圆角的多边形轮廓
*gen_contour_polygon_xld (Contour1, rows2, cols2)
*生成十字形状
*gen_cross_contour_xld( : Cross : Row, Col, Size, Angle :)


*3 将模板从所在区域分离
* read_image (image, 'D:/0halcon/demo/20220425/2.jpg')*可以选择一个文件
*opening_circle (Image, RegionOpening, 3.5)
reduce_domain (Image, shape, ImageReduced)

*4 创建模板
*圆用create_shape_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
create_shape_model (ImageReduced, 4, rad(0), rad(360), 'auto', 'auto', 'use_polarity', 30, 10, ModelID)
*算子原型:create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)
*Template :用于创建模板的图像,是原图的模板ROI区域;
*NumLevels:金字塔层的最大层数;
*AngleStart:模板的最小旋转角度,以弧度为单位;
*AngleExtent:旋转角度范围,必须≥0,以弧度为单位;如果超出角度范围,则模型搜索不到
*AngleStep:角度步长,以弧度为单位;
*Optimization:生成模型的优化方法;
*Metric:模板匹配的条件,在模板与图像亮暗发生反转时可使用;
*Contrast:创建模型时,模型点的对比度;
*MinContrast :在搜索的图像中,搜索对象的最小对比度,必须<Contrast*ModelID:模型的句柄。

*5 设置原点
area_center (shape, Area, Row1, Column1)
set_shape_model_origin (ModelID, Row1, Column1)
*set_shape_model_origin (ModelID, -Row, -Column)

*6 获取初始模板轮廓
get_shape_model_contours (ModelContours, ModelID, 1)

dev_set_color ('red')
dev_set_draw ('margin')
dev_display (ModelContours)
 
*7 匹配模板 
for Index := 0 to |Files|-1 by 1
    read_image (Image, Files[Index])
    *7.1在另一幅图中查找对应区域  //进行模板匹配找模板
    *开运算
    *opening_rectangle1 (Image, RegionOpening, Width, Height)

    find_shape_model (Image, ModelID, 0, rad(360), 0.4, 1, 0.5, 'least_squares', 0, 0.7, Row3, Column3, Angle, Score)
    *算子原型:find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, *NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)*
    *Image :输入图像;
    *ModelID:模型的句柄;
    *AngleStart:模板的最小旋转角度,以弧度为单位;
    *AngleExtent:旋转角度范围,必须≥0,以弧度为单位;如果超出角度范围,则模型搜索不到
    *MinScore:要搜索到的模型实例的最小得分,如果低于此分数,则搜索不到;
    *NumMatches:要搜索到的模型实例的个数;
    *MaxOverlap:要找到的模型实例的最大重叠;
    *SubPixel:确定找到的目标是否使用亚像素精度提取;
    *NumLevels:搜索过程中使用的金字塔级别的数量 ;
    *Greediness :搜索启发式的“贪婪度”,(0:安全但缓慢;1:快,但可能匹配不到)
    *Row:找到的模型实例的行坐标,坐标值是找到模板的原点在图像坐标系中的行坐标;
    *Column:找到的模型实例的列坐标,坐标值是找到模板的原点在图像坐标系中的列坐标;
    *Angle:找到的模型实例的角度;
    *Score: 找到的模型实例的分数。
    
    *7.2坐标转行,得到模板的ROI和检测ROI,确定匹配位置的轮廓
    *7.2.1 先获取模板轮廓,获取轮廓在(0,0)位置;
    *7.2.2:求模板匹配实例---的旋转矩阵;    
    *7.2.3:利用仿射变换---得到匹配实例--轮廓;    
    *7.2.4:轮廓转成区域;
    if (Row3>=0) //如果找到模板数>0
        *显示找到的--模板轮廓
        dev_display_shape_matching_results (ModelID, 'red', Row3, Column3, Angle, 1, 1, 0)
        
        *循环遍历每个查到的实例
        for I := 0 to |Score| - 1 by 1
            
            vector_angle_to_rigid (Row3, Column3, Angle, Row3, Column3, Angle, HomMat2D1)
            *算子原型:vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)
            *Row1:原始点的行坐标;
            *Column1:原始点的列坐标;
            *Angle1:原始点的角度;
            *Row2:变换点的行坐标;
            *Column2:变换点的列坐标;
            *Angle2:变换点的角度;
            *HomMat2D:输出的变换矩阵。
            
            *给旋转矩阵添加缩放信息
            hom_mat2d_scale (HomMat2D1, 2, 2, Column3, Row3, HomMat2DScale)
            
            *通过初始模板和旋转矩阵运算---得到模板实例轮廓
            affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DScale)
            
            *轮廓转区域
            gen_region_contour_xld (ContoursAffineTrans, Region, 'filled')
            
            *得到匹配图像的轮廓线
            affine_trans_contour_xld (ContoursAffineTrans, ContoursAffineTrans1, HomMat2DScale)
            affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')

        endfor
        *dev_set_color ('red')
        *dev_display (RegionAffineTrans)
   
        
     endif
     
endfor
  
**获取指定轮廓上点的像素坐标
*get_contour_xld (ContoursAffineTrans, Row1, Col)
  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值