云计算百科
云计算领域专业知识百科平台

Halcon小案例基于灰度值的模板匹配和基于形状的模板匹配

*基于灰度值的模板匹配:

•获取图片:read_image ()
•获取句柄:dev_get_window()
•设置区域填充方式:dev_set_draw()
•设置颜色:dev_set_color()
•绘制矩形ROI:gen_rectangle1 ()
•获取区域的面积和中心点坐标:area_center ()
生成十字形的亚像素级(XLD)轮廓:gen_cross_contour_xld
•抠图:reduce_domain()
•创建归一化互相关(NCC)模板(基于灰度值):create_ncc_model()
•创建仿射变换矩阵并且计算仿射变换矩阵:vector_angle_to_rigid()
•执行仿射变换:affine_trans_contour_xld ()
•展示模板匹配的轮廓:dev_display_shape_matching_results()
•查找NCC模板:find_ncc_model()
•对区域进行仿射变换:affine_trans_region()
•释放 NCC 模板:clear_ncc_model()

*// 获取图片
read_image (Image, 'smd/smd_on_chip_05.png')
*// 获取窗口句
dev_get_window (WindowHandle)
*// 设置绘制的填充模式
dev_set_draw ('margin')
*// 颜色
dev_set_color ('green')

*// 绘制感兴趣区域
gen_rectangle1 (ROI_0, 192.328, 179.323, 430.036, 451.181)
*// 获取感兴趣区域中心点
area_center (ROI_0, Area, Row, Column)
*// 生成十字形的亚像素级(XLD)轮廓,用于标记图像中的指定坐标点
*// 参数1 Cross 输出参数,生成的十字形XLD轮廓对象
*// 参数2 Rows 输入参数,十字形中心的行坐标
*// 参数3 Columns 输入参数,十字形中心的列坐标
*// 参数4 Size 输入参数,十字形单臂的长度(像素单位,如6表示每个臂从中心向外延伸6像素)
*// 参数5 Angle 输入参数,十字形的旋转角度(弧度单位,0.785398=π/4=45度,0为水平/垂直方向)
gen_cross_contour_xld (Cross, Row, Column, 10, 0)
*// 裁剪感兴趣区域的图像
reduce_domain (Image, ROI_0, ImageReduced)

*// 创建一个模板,基于灰度值
*// 参数1 模板图片
*// 参数2 金字塔层级 每层金字塔代表一种模板图像
*// auto自动选择层级,值越大 匹配速度越快 可能会丢失像素;值越小 匹配精度越高
*// 参数3 开始角度 单位是弧度
*// 参数4 结束角度
*// 参数5 角度的递增量 auto
*// 参数6 模板的方式 use_polarity 使用极性;ignore_global_polarity 忽略极性
*// 参数7 ModelID 模板的id
create_ncc_model (ImageReduced, 'auto', rad(-180), rad(180), 'auto', 'use_polarity', ModelID)

*// 对多张图片进行查找
for Index := 1 to 11 by 1
*// 遍历获取图片地址
path:='smd/smd_on_chip_'+Index$'02'+'.png'//$'02'字符串格式化不满足两位在十位补0
*// 获取图片
read_image (Image1, path)

*// 查找模板
*// 参数1 查找的图像源
*// 参数2 对应的模板 ModelID
*// 参数3、4 查找角度范围
*// 参数5 最小得分
*// 参数6 匹配的个数 1匹配1个, 0匹配多个
*// 参数7 最大的重叠度 0.5 大于0.5的话两个物品谁的得分高选谁
*// 参数8 SubPixel 是否使用亚像素检测 true使用亚像素检测
*// 参数9 NumLevels 金字塔层级,一般写0,保留原始细节,但是计算量大
*// 参数10、11 输出匹配点的坐标
*// 参数12、13 输出角度和得分
find_ncc_model (Image1, ModelID, rad(-180), rad(180), 0.5, 1, 0.5, 'true', 0, Row1, Column1, Angle, Score)

*// 仿射变换 vector_angle_to_rigid刚性变换 生成一个变换矩阵
*// 参数1、参数2 变换的起始点位置
*// 参数3 旋转的起始角度
*// 参数4、5 变换的结束点位置
*// 参数6 变换的结束点的角度
*// 参数7 HomMat2D变换矩阵
vector_angle_to_rigid (Row, Column, 0, Row1, Column1, Angle, HomMat2D)

*// 使用变换矩阵应用到哪个区域上
*// 最后一个参数 在变换之后找不到原始图像对应的像素的时候,填充的处理方式
*// nearest_neighbor 最近邻插值法,速度快适合区域变换
*// biliner 双线性插值法 精度更高
affine_trans_region (ROI_0, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
*// 绘制一个十字形轮廓
gen_cross_contour_xld (Cross1, Row1, Column1, 6, Angle)
*// 展示仿射变换之后的区域
dev_display (RegionAffineTrans)

*// 判断是否匹配到
if (|Row1|>0)
*// 判断得分
if (Score>0.9)
*// 绘制匹配出的轮廓
*// 最后一个参数 0默认大小
* dev_display_ncc_matching_results (ModelID, 'green', Row1, Column1, Angle, 0)
dev_disp_text ('OK:'+Score, 'window', Row1, Column1, 'black', [], [])
else
*// 绘制匹配出的轮廓
*// 最后一个参数 0默认大小
* dev_display_ncc_matching_results (ModelID, 'red', Row1, Column1, Angle, 0)
dev_disp_text ('NG:'+Score, 'window', Row1, Column1, 'black', [], [])
endif
endif
*// 停止运行
stop ()
endfor
*// 释放模板
clear_ncc_model (ModelID)

*基于形状的模板匹配:

•获取图片:read_image ()
•获取句柄:dev_get_window()
•设置区域填充方式:dev_set_draw()
•设置颜色:dev_set_color()
•设置区域线宽:dev_set_line_width()
•绘制圆形:draw_circle()
•抠图:reduce_domain()
展示图像:dev_display ()
•创建支持缩放的形状模板:create_scaled_shape_model()
•获取对应金字塔层级的图像:get_shape_model_contours ()
•创建仿射变换矩阵并且计算仿射变换矩阵:vector_angle_to_rigid()
•执行仿射变换:affine_trans_contour_xld ()
•查找具有缩放变化的形状模型:find_scaled_shape_model()
•展示模板匹配的轮廓:dev_display_shape_matching_results()
•清空窗体:dev_clear_window ()
•生成初始化的 2D 齐次仿射变换矩阵(单位矩阵): hom_mat2d_identity()
•生成带平移的 2D 仿射变换矩阵:hom_mat2d_translate ()
•生成带旋转的 2D 仿射变换矩阵:hom_mat2d_rotate()
•生成带缩放的 2D 仿射变换矩阵:hom_mat2d_scale()
•清空模板的句柄:clear_shape_model()

*// 获取图像
read_image (Image, 'green-dot')
*// 获取窗体句柄
dev_get_window (WindowHandle)
*// 设置填充模式
dev_set_draw ('margin')
*// 设置颜色
dev_set_color ('green')
*// 设置线宽
dev_set_line_width (2)

*// 绘制区域
gen_circle (ROI_0, 273.703, 285.367, 92.2865)
*// 获取面积和中心点坐标
area_center (ROI_0, Area, Row, Column)
*// 裁剪
reduce_domain (Image, ROI_0, ImageReduced)

*// 创建一个基于形状的模板
*// 参数1 创建的模板图像
*// 参数2 金字塔层级
*// 参数3、4 起始角度 结束角度
*// 参数5 角度递增量
*// 参数6、7 最小缩放比例 最大缩放比例
*// 参数8 缩放比例的递增量
*// 参数9 是否采用模型优化 auto自动选择优化级别
*// 参数10 是否使用极性 use_polarity
*// 参数11 对比度阈值 一般使用auto自动计算
*// 参数12 最小的对比度阈值 一般使用auto自动计算
*// 参数13 模板的标识
create_scaled_shape_model (ImageReduced, 'auto', rad(-45), rad(90), 'auto', 0.8, 1.1, 'auto', 'auto', 'ignore_global_polarity', 'auto', 'auto', ModelID)

*// 展示图像
dev_display (Image)
dev_display (ImageReduced)

*// 获取对应金字塔层级的图像 默认位置在图片的左上角(0,0) 没有旋转0
get_shape_model_contours (ModelContours, ModelID, 1)
*// 创建一个仿射矩形矩阵
vector_angle_to_rigid (0, 0, 0, Row, Column, 0, HomMat2D)
*// 使用矩阵
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
stop ()

*// 获取照片
read_image (Image1, 'green-dots')
*// 查找具有缩放变化的形状模型
*// SubPixel:亚像素精度 none不使用亚像素精度;'least_squares'使用最下二乘法提高亚像素精度
*// Greediness 贪婪度 取值范围0~1 值越大搜索速度越快但精度降低 搜索结果会少
find_scaled_shape_model (Image1, ModelID, rad(-45), rad(90), 0.8, 1.1, 0.5, 0, 0.5, 'least_squares', 0, 0.9, Row1, Column1, Angle, Scale, Score)

*// 展示匹配成功的区域的方法一//———————
* dev_display_shape_matching_results (ModelID, 'green', Row1, Column1, Angle, 1, 1, 0)
dev_close_window ()
for Index := 0 to |Scale|-1 by 1

*// 展示匹配成功的区域的方法二//———————
*// 创建一个仿射矩形矩阵//———————
* vector_angle_to_rigid (0, 0, 0, Row1[Index], Column1[Index], Angle[Index], HomMat2D)
*// 使用矩阵//———————
* affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
* dev_display (ContoursAffineTrans)

*// 展示匹配成功的区域的方法三//———————
*// 1.生成一个初始化的仿射矩阵(齐次矩阵)//———————
hom_mat2d_identity (HomMat2DIdentity)
*// 2.生成一个平移的变换矩阵//———————
*// 参数1 初始化的仿射矩阵
*// 参数2、3 结束点的位置
*// 参数4 生成的平移矩阵
hom_mat2d_translate (HomMat2DIdentity,Row1[Index], Column1[Index], HomMat2DTranslate)
*// 3.生成一个旋转的仿射矩阵//———————
hom_mat2d_rotate (HomMat2DTranslate, Angle[Index],Row1[Index], Column1[Index], HomMat2DRotate)
*// 4.生成一个缩放的仿射矩阵//———————
hom_mat2d_scale (HomMat2DRotate, Scale[Index], Scale[Index], Row1[Index], Column1[Index], HomMat2DScale)
*// 5.使用最终的仿射矩阵//———————
affine_trans_contour_xld (ModelContours, ContoursAffineTrans1, HomMat2DScale)
dev_display (ContoursAffineTrans1)
endfor

*// 清空模板的句柄
clear_shape_model (ModelID)

希望对大家有所帮助, 感谢大家的关注和点赞。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Halcon小案例基于灰度值的模板匹配和基于形状的模板匹配
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!