[机器视觉]halcon应用实例 多ROI模板匹配

本示例是单ROI的功能扩展示例,多ROI.后面有空了将出用户自定义ROI。

比单ROI增加ROI区域的连接和合并。还有for的实例应用。步骤同单ROI一样。不懂的可以看一下单ROI文章。[机器视觉]halcon应用实例 单ROI模板匹配-CSDN博客

有需要的可以【点赞】【关注】【收藏】【订阅】

dev_set_color ('red')
dev_set_draw ('margin')
*获取窗口句柄对象
dev_get_window (WindowHandle)
*读取图片
read_image (Image, 'E:/stevenChen/机器视觉学习/HDevelop/视觉图片/ROI/1.bmp')

*多ROI 
*选取ROI
*第一个ROI
*画矩形1
*参数说明
*WindowHandle (输入参数)窗口句柄
*Row1, Column1 (输出参数)矩形的左上角坐标
*Row2, Column2 (输出参数)矩形的右上角坐标
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
*生成矩形1
*根据上面算子的输出参数生成一个矩形
*Rectangle 输出参数,生成的矩形
*Row1, Column1 (输入参数)矩形的左上角坐标
*Row2, Column2 (输入参数)矩形的右上角坐标
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)

*-------------------
*第二个ROI
*画矩形
draw_rectangle1 (WindowHandle, Row10, Column10, Row20, Column20)
*生成矩形
*根据上面算子的输出参数生成一个矩形
gen_rectangle1 (Rectangle10, Row10, Column10, Row20, Column20)
*连接两个对象,ObjectsConcat = [Objects1,Objects2]
*参数列表:
*第1个参数Objects1是输入对象,即对象1
*第2个参数Objects2是输入变量,即对象2
*第3个参数ObjectsConcat是输出变量,即连接后的区域
*concat_obj (Rectangle, Rectangle10, ObjectsConcat)
*union2
*union2()——将两个区域合并成一个整体,仅限两个
*函数原型:union2(Region1(输入), Region2(输入) : RegionUnion(输出) : : )
*功能:将Region2 和Region1元组内的区域合并成一个独立的区域保存于RegionUnion 。把第二个参数Region2里的所有区域合并,然后将合并后的区域分别与Region1中的每一个区域进行合并,然后保存到RegionUnion 中。最后,RegionUnion 元素个数与Region1元素个数相同。
*参数:
*Region1 (input_object) ——要与Region2中的所有区域的并集计算的区域
*Region2 (input_object) ——要添加到Region1的区域
*RegionUnion (output_object) ——(输出)最终得到的区域
*      要素数::RegionUnion == Region1
union2 (Rectangle, Rectangle10, RegionUnion1)
*-------------------
*第三个ROI
*画矩形
draw_rectangle1 (WindowHandle, Row100, Column100, Row200, Column200)
*生成矩形
*根据上面算子的输出参数生成一个矩形
gen_rectangle1 (Rectangle100, Row100, Column100, Row200, Column200)
*concat_obj (Rectangle100, ObjectsConcat, ObjectsConcatAll)

*把所有的输入区域合并为一个区域
*功能:函数将Region元组内的全部区域合并成一个独立的区域,保存于RegionUnion
*参数:
*Region (input_object) ——要计算其并集的区域,也就是一个个的输入区域
*RegionUnion (output_object) ——所有输出区域的并集
            *要素数: RegionUnion <= Region
*union1 (Rectangle100, RegionUnionAll)
union2 (RegionUnion1, Rectangle100, RegionUnionAll)

*锁定ROI并创建模板
*单ROI
*获得特定区域Region位置的图像,获取区域图像
*Image (输入参数)输入的图像
*Rectangle 输入参数)输入的区域,上面画的矩形区域
*ImageReduced (输出参数)输出的图像,是Image中Rectangle的那部分图像
reduce_domain (Image, RegionUnionAll, ImageReduced)

*用于创建形状模板
*形状模板是一种用于检测和匹配特定形状的工具,常用于目标识别、物体定位和测量等应用中。
*参数说明:
*ObjectModel:包含待创建模板的形状的二值图像。
*NumLevels:金字塔层数,用于多尺度匹配。可设为“auto”或0—10的整数
*AngleStart:起始角度(以度为单位),用于模板的旋转范围。rad(-180)
*AngleExtent:旋转角度的范围(以度为单位)。rad(-180), rad(180)表示360度匹配
*AngleStep:旋转角度的步长,可以是’auto’或具体的值。
*ScaleMin:最小缩放比例。
*ScaleMax:最大缩放比例。
*ScaleStep:缩放比例的步长。
*Optimization:优化模式,用于加速模板匹配。
*Metric:模板匹配的度量方式。
*Contrast:对比度增强系数。
*MinContrast:最小对比度阈值。
*ModelID:输出的模板ID。
*https://blog.csdn.net/xiaogongzhu001/article/details/131120014
*1.NumLevels(金字塔的层数),金字塔的层数越大,找到匹配使用的时间就越小。(金字塔的层数越大,提取到的特征越少,精准度越低,所以对应的识别时间少)
*如果金字塔的层数设置的太大,模板不容易识别出来,这是需要将find_shape_model函数中MinScore和Greediness参数设置的低一些。
*参数解析及优化 https://blog.csdn.net/the_future_way/article/details/115345989
*create_shape_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
create_shape_model (ImageReduced, 'auto', rad(-180), rad(180), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*-----模板创建结束----------------------------------

*-----开始测试----------------------------------------------

*图片文件夹
imageDir := 'E:/stevenChen/机器视觉学习/HDevelop/视觉图片/ROI'
 
*获取文件列表
list_files (imageDir, ['files','follow_links','recursive'], ImageFiles)
 
*可以用for算子把文件一个一个打开
for Index := 0 to |ImageFiles| - 1 by 1
    *从文件集合中获取指定索引的数据
    imagePath := ImageFiles[Index]    
    *判断文件是否存在,存在返回true,否则返回false
    *imagePath 输入参数:要判断的文件路径
    *FileExists 输出参数: 输出文件是否存在,存在返回true,否则返回false
    file_exists (imagePath, FileExists)
    
    if (FileExists)
        *显示文本消息
        dev_close_window ()
        *读取图片
        read_image (Image, imagePath)  
        get_image_size (Image, Width, Height)
        dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
        dev_display (Image)
        *4.加载测试图像
        *read_image (Image1, 'E:/stevenChen/机器视觉学习/HDevelop/视觉图片/ROI/12.bmp')
        *5.使用已有模板句柄来匹配
        *形状模板匹配
        *形状匹配原理:模板创建后,会根据模板中的边缘等关系去图像中进行搜索,可以理解成提取模板中的灰度发生变化的那些点,
        *然后再去图像中匹配,这样的效果是对干扰比较稳定,匹配速度快,并且即使边缘发生部分遮挡,匹配效果依旧较好
        *参数说明
        *参数1:输入图像--单通道图像
        *参数2:模板句柄
        *参数3:搜索时的起始角度 rad(-180), rad(180) 正好是一圈
        *参数4:搜索时的终止角度,必须与创建模板时的有交集 
        *参数5:被找到的模板最小分数--大于等于这个值才能被匹配
        *      默认值:0.5      建议值:0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0
        *      典型值范围:0≤MinScore ≤ 1
        *      最小增量:0.01       建议增量:0.05
        *参数6:要找到的模板最大实例数
        *参数7:要找到的模型实例的最大重叠
        *      默认值:0.5       建议值:0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0
        *      典型值范围:0≤ MaxOverlap≤ 1      最小增量:0.01     建议增量:0.05
        *参数8:计算精度的设置
        *        'none', 'interpolation', 'least_squares', 'least_squares_high', 'least_squares_very_high'
        *        'max_deformation 1', 'max_deformation 2', 'max_deformation 3', 'max_deformation 4'
        *        'max_deformation 5', 'max_deformation 6'
        *参数9:搜索时金字塔的层级
        *参数10:贪婪度,搜索启发式,一般都设为0.8,越高速度快,容易出现找不到的情况
        *       0≤ Greediness ≤ 1   
        *最后4个:输出匹配位置的行和列坐标、角度、得分 【中心坐标】
        *https://blog.51cto.com/liming19680104/5152387
*        find_shape_model (Image1, ModelID, rad(0), rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
        find_shape_model (Image, ModelID, rad(-180), rad(180), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
        
        *6.把匹配轮廓显示到图像中
        *ModelContours 输出参数,匹配到的模块轮廓,
        *ModelID 输入参数,模板ID,
        *Level 金字塔层数
        get_shape_model_contours(ModelContours, ModelID, 1)
        *从点和角度计算刚性仿射变换
        *参数:
        *Row1 (输入参数) ——原始点的行坐标
        *Column1 (输入参数) ——原始点的列坐标
        *Angle1 (输入参数) ——原始点的角度
        *Row2 (输入参数) ——转换点的行坐标
        *Column2 (输入参数) ——转换点的列坐标
        *Angle2 (输入参数) ——转换点的角度
        *HomMat2D (输出参数) ——输出转换矩阵
        *原文链接:https://blog.csdn.net/m0_51271525/article/details/121017373
        vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)
        *ength := tuple_length (row,len)
        tuple_length (Row, rowLength)
        if(rowLength > 0)
            *仿射变换轮廓
            *对XLD轮廓进行任意仿射2D变换
            *将任意仿射2D变换,即缩放、旋转、平移和倾斜(倾斜)应用于轮廓中给定的xld轮廓,并以ContoursAffineTrans的形式返回变换后的轮廓
            *参数:
            *Contours (输入参数) ——输入XLD轮廓。
            *ContoursAffineTrans (输出参数) ——转换后的XLD轮廓
            *HomMat2D (输入参数) ——输入转换矩阵
            affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
            
            *显示结果
            dev_display (Image)
            dev_set_color ('green')
            dev_display (ContoursAffineTrans)
        else
            disp_message (WindowHandle, '没有匹配到ROI', 'window', 12, 12, 'black', 'true')
        endif
    else
        disp_message (WindowHandle, '图片-不存在->路径:'+imagePath, 'window', 12, 12, 'black', 'true')
    endif
endfor
*释放模板句柄
clear_shape_model (ModelID)

  • 25
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

StevenChen85

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

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

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

打赏作者

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

抵扣说明:

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

余额充值