C#Halcon从零开发_Day6_几何模板的制作、匹配、应用

目录

一、制作几何模板

二、几何模板的读取与匹配

三、几何模板的具体应用

3.1.ROI区域移动到模板匹配的位置(图片位置不变)

 3.1.1创建、保存几何模板

3.1.2模板匹配到新图片并移动ROI区域

3.2 模板匹配新图片移动到绘制的ROI位置(ROI区域不变)

四、双模板匹配

4.1 制作并保存模板1

4.2 制作并保存模板2

4.3绘制ROI区域

4.4双模板定位  将ROI区域移动到模板位置(图像不变)


一、制作几何模板


*1.读取图像
*2.绘制模板区域
*3.获取区域上的图像
*4.利用区域图像创建模板
*5 保存.shm格式模型文件
*6 可以查看模板

*获取窗口句柄
dev_get_window (WindowHandle)
*1 读取图像
read_image(Image,'C:/Users/10314/Desktop/C#编程心得/机器视觉/Halcon/Pic1.jpg')
*2 绘制模板区域 并生成区域
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
*3 减少图像处理范围-只留下刚刚生成的区域
reduce_domain (Image,Rectangle,ImageReduced)
*4 将区域减少过的图像创建模板
create_shape_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*5 保存此模板 ModelID:模型句柄
write_shape_model (ModelID, 'C:/Users/10314/Desktop/C#编程心得/机器视觉/Halcon/Models/model1.shm')

模板不再需要时,应使用clear_shape_model或clear_ncc_model等算子释放模板句柄,以释放相关资源

clear_shape_model (ModelID)
*<仅测试用>查看生成的几何模板的轮廓集,默认位置放在 (0,0 )
*get_shape_model_contours (ModelContours, ModelID, 1)

二、几何模板的读取与匹配


*1.读取模板
*2.读取图像
*3.进行模板匹配
*4.标注、利用匹配的结果,生成仿射矩阵
*5.进行仿射变换以实现模板匹配到现有的图像上

*1.读取模板
read_shape_model ('C:/Users/10314/Desktop/C#编程心得/机器视觉/Halcon/Models/model1.shm', ModelID1)
*2.读取图像
read_image (Image1, 'C:/Users/10314/Desktop/C#编程心得/机器视觉/Halcon/Pic2.jpg')
*3.模板匹配
*  1.Image 匹配图像   2.模板的句柄   
*  3.角度的开始   4.角度的范围 rad(360)任意角度匹配,速度会慢 
*  5.缩放比下限  6.缩放比上限
 * 7.最小分数:相似度,越和模板相近,分数越高   0 ≤ MinScore ≤ 1 推荐增量0.05 
 * 8.匹配个数 0:有多少就匹配多少 
 * 9.重叠度  0.5:重叠率低于50%也会被找到
 * 10.亚像素精度
 * 11.金字塔层数
 * 12.贪婪度
 *核心==> 匹配个数、最小分数
 **输出: Row,Column,角度,缩放比,分数
find_scaled_shape_model (Image1, ModelID1, rad(-180), rad(360), 0.7, 1.5, 0.2, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Scale, Score)

*可以通过元组数量判断是否匹配上

tuple_length (Row, MatchLength)

*4.对找出的模板进行交叉轮廓标注

dev_set_color ('yellow') *设置轮廓颜色
gen_cross_contour_xld (Cross, Row, Column, 100, Angle)
*拿到模板
get_shape_model_contours (ModelContours1, ModelID1, 1)
*生成仿射变换矩阵
vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)
*应用仿射变换矩阵
affine_trans_contour_xld (ModelContours1, ContoursAffineTrans, HomMat2D)

模板不再需要时,应使用clear_shape_model或clear_ncc_model等算子释放模板句柄,以释放相关资源

clear_shape_model (ModelID1)

三、几何模板的具体应用

引言:前面的集合模板制作和匹配只可以把模板的轮廓移动到需要匹配的图片上,因此只具有显示作用,而实际上我们更需要对图片上模板的那一块区域进行操作(如检测缺陷等),所以需要移动ROI区域到新图片的模板位置。

3.1.ROI区域移动到模板匹配的位置(图片位置不变)

 3.1.1创建、保存几何模板


 
* 获取当前窗口句柄
dev_get_window (WindowHandle)
 
* 读取图像文件
read_image (Image, 'D:/Desktop/pic1.jpg')
 
* 在窗口中绘制矩形,用户手动选择区域
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
 
* 根据绘制的矩形生成一个矩形区域
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
 
* 将图像缩小到矩形区域内
reduce_domain (Image, Rectangle, ImageReduced)
 
* 创建形状模板
create_shape_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
 
* 获取形状模板的轮廓
get_shape_model_contours (ModelContours, ModelID, 1)
 
* 将形状模板保存到文件
write_shape_model (ModelID, 'D:/Desktop/model1.shm')
 
* 清除形状模板,释放资源
clear_shape_model (ModelID)
 
* 创建、保存ROI区域
 
* 显示图像
dev_display (Image)
 
* 在窗口中绘制圆形,用户手动选择区域
draw_circle (WindowHandle, Row, Column, Radius)
 
* 根据绘制的圆形生成一个圆形区域
gen_circle (Circle, Row, Column, Radius)
 
* 将圆形区域保存到文件
write_region (Circle, 'D:/Desktop/ROI.hobj')
 


3.1.2模板匹配到新图片并移动ROI区域


 
* 读取新的图像文件
read_image (Image, 'D:/Desktop/pic2.jpg')
 
* 读取之前保存的形状模板
read_shape_model ('D:/Desktop/model1.shm', ModelID1)
 
* 在新的图像中查找匹配的形状模板
find_scaled_shape_model (Image, ModelID1, -0.39, rad(360), 0.7, 1.5, 0.2, 1, 0.5, 'least_squares', 0, 0.9, Row3, Column3, Angle, Scale, Score)
 
* 设置颜色为绿色
dev_set_color('green')
 
* 读取之前保存的ROI区域
read_region (Region, 'D:/Desktop/ROI.hobj')
 
* 计算ROI区域的中心坐标
area_center (Region, Area, Row4, Column4)
 
* 格式化消息字符串,显示原始中心坐标
message:='OriginRow:'+Row4$'.2f'+'\n'+'OriginColumn:'+Column4$'.2f'
 
* 显示消息,使用图像坐标系
disp_message(WindowHandle, message, 'image', Row4, Column4, '#ff0000', 'true')
 
* 计算从原始中心到匹配中心的刚体变换矩阵
vector_angle_to_rigid (Row4, Column4, 0, Row3, Column3, Angle, HomMat2D)
 
* 设置颜色为红色
dev_set_color('red')
 
* 对ROI区域进行仿射变换
affine_trans_region (Region, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
 
* 计算变换后的ROI区域的中心坐标
area_center (RegionAffineTrans, Area1, Row5, Column5)
 
* 格式化消息字符串,显示变换后的中心坐标
message:='LaterRow:'+Row5$'.2f'+'\n'+'LaterColumn:'+Column5$'.2f'
 
* 显示消息,使用图像坐标系
disp_message(WindowHandle, message, 'image', Row5, Column5, '#ff0000', 'true'

最终效果为:

3.2 模板匹配新图片移动到绘制的ROI位置(ROI区域不变)

*创建、保存几何模板
dev_get_window (WindowHandle)
read_image (Image, 'D:/Desktop/pic1.jpg')
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
reduce_domain (Image, Rectangle, ImageReduced)
create_shape_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
get_shape_model_contours (ModelContours, ModelID, 1)
write_shape_model (ModelID, 'D:/Desktop/model1.shm')
clear_shape_model (ModelID)
*创建ROI区域
dev_display (Image)
draw_circle (WindowHandle, Row, Column, Radius)
gen_circle (Circle, Row, Column, Radius)
*读取新图像并进行模板匹配
read_image (Image1, 'D:/Desktop/pic2.jpg')
read_shape_model ('D:/Desktop/model1.shm', ModelID1)
find_scaled_shape_model (Image1, ModelID1, -0.39, 0.78, 0.8, 1.3, 0.3, 1, 0.5, 'least_squares', 0, 0.9, Row3, Column3, Angle, Scale, Score)
*生成仿射变换矩阵并把图片移动到ROI区域
vector_angle_to_rigid (Row3, Column3, 0, Row, Column, 0, HomMat2D)
affine_trans_image (Image1, ImageAffineTrans, HomMat2D, 'constant', 'false')
dev_display(Circle)

最终效果为:

四、双模板匹配

注:对角度要求更高、检测要求更好,需要运用双模板匹配

dev_get_window (WindowHandle)
read_image(Image, 'C:/Users/10314/Desktop/pic3.jpg')


4.1 制作并保存模板1


draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
reduce_domain (Image, Rectangle, ImageReduced)
create_shape_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID1)
write_shape_model (ModelID1,'C:/Users/10314/Desktop/model1.shm')
write_region (Rectangle, 'C:/Users/10314/Desktop/region1.hobj')
get_shape_model_contours (ModelContours, ModelID1, 1)
clear_shape_model (ModelID1)


4.2 制作并保存模板2


draw_rectangle1 (WindowHandle, Row11, Column11, Row21, Column21)
gen_rectangle1 (Rectangle1, Row11, Column11, Row21, Column21)
reduce_domain (Image, Rectangle1, ImageReduced1)
create_shape_model (ImageReduced1, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID2)
write_region (Rectangle1, 'C:/Users/10314/Desktop/region2.hobj')
write_shape_model (ModelID2, 'C:/Users/10314/Desktop/model2.shm')
get_shape_model_contours (ModelContours1, ModelID2, 1)
clear_shape_model (ModelID2)


4.3绘制ROI区域


draw_circle (WindowHandle, Row5, Column5, Radius)
gen_circle (Circle, Row5, Column5, Radius)


4.4双模板定位  将ROI区域移动到模板位置(图像不变)


read_image(Image1, 'C:/Users/10314/Desktop/pic4.jpg')
read_shape_model ('C:/Users/10314/Desktop/model1.shm', ModelID1)
read_shape_model ('C:/Users/10314/Desktop/model2.shm', ModelID2)
read_region (Region1, 'C:/Users/10314/Desktop/region1.hobj')
read_region (Region2, 'C:/Users/10314/Desktop/region2.hobj')
find_shape_models (Image1, [ModelID1,ModelID2], -0.39, 0.79, 0.2, 2, 0.5, 'least_squares', 0, 0.9, Row6, Column6, Angle, Score, Model)
if(|Row6|>0)
    gen_cross_contour_xld (Cross, Row6[0], Column6[0], 100, Angle)
gen_cross_contour_xld (Cross, Row6[1], Column6[1], 100, Angle)
area_center (Rectangle, Area, Row3, Column3)
area_center (Rectangle1, Area1, Row4, Column4)
vector_to_rigid ([Row3,Row4], [Column3, Column4],Row6,Column6, HomMat2D1)

affine_trans_region (Circle, RegionAffineTrans, HomMat2D1, 'nearest_neighbor')
endif

效果图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值