halcon利用图片来创建模板可分为如下步骤。可以进行人工选取(不推荐),也可以使用二值化来提取感兴趣的区域(推荐)。
- 二值化图片。常用算子:threshold。
- 形态学操作,优化阈值二值化后的结果,便于计算连通区域。 常用算子:closing_circle、opening_circle、erosion类算子、dilation类算子。
- 提取感兴趣的区域。常用算子:connection、select_obj等选择区域的算子。
- 根据提取到的感兴趣的区域,剪裁原图像,生成模板图像。常用算子:reduce_domain。
- 标定模板参数。包括计算模板中心坐标、规定模板起始角度。常用算子:area_center
- 创建模板。常用算子:create_shape_model。
- 保存模板为msh格式。常用算子:write_shape_model。
**********************1.创建模板并保存*************************************
*读取图像
read_image (Image, 'images/1.bmp')
mean_image(Image,ImageMean,9,9)
*二值化
threshold (ImageMean, Region, 85, 255)
*开、闭运算、区域选择提取ROI区域
closing_circle(Region,Region_closing,3)
opening_circle(Region,Region_opening,7)
connection(Region_opening,Region_connection)
count_obj(Region_connection, num)
select_obj(Region_connection, Region_selected, 1)
closing_circle(Region_selected,ROI_region,7)
*提取出区域的图像,作为模板图像
reduce_domain (Image, ROI_region, Image_ROI_region)
write_image (Image_ROI_region, 'tiff',0,'Region.tiff')
*计算模板区域中心坐标
area_center (ROI_region, Area_model, Row_model, Column_model)
*规定模板ROI_region的可变角度范围0-360,旋转角度变化为0
create_shape_model(Image_ROI_region,'auto',rad(0), rad(360),rad(0),['none','no_pregeneration'],'ignore_global_polarity','auto','auto',ModleID)
*将创建的模板存成指定路径的文件
write_shape_model (ModleID, 'modle.shm')
stop()
左图为样本图片,右图为提取到的模板区域。
创建好模板后,可以用模板匹配其他的图片并进行定位。定位步骤如下:
- 在图像中查找模板。常用算子:find_shape_model。
- 进行仿射变换。常用算子:vector_angle_to_rigid。
- 根据仿射变换的结果计算图像中匹配到的区域。常用算子:affine_trans_region。
- 根据匹配到的区域,剪裁图像,生成匹配结果。常用算子:reduce_domain。
find_shape_model (Image_sample, WindowHandle_result, rad(0), rad(360), 0.8, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
Image_Row:=[Image_Row,Row]
Image_Column:=[Image_Column,Column]
Image_Angle:=[Image_Angle,Angle]
Image_Score:=[Image_Score,Score]
*对匹配到的中心与模板的中心求取映射关系:仿射变换
vector_angle_to_rigid(Row_model,Column_model,rad(0),Row,Column,Angle,HomMat2D)
*根据映射关系求出模板对应的图像范围
affine_trans_region(ROI_region,RegionAffineTrans,HomMat2D,'nearest_neighbor')
*将检测到的区域(RegionAffineTrans)保存为图片
reduce_domain(Image_sample,RegionAffineTrans,ResultReduced)