先看原图
首先将要匹配的图片剪切出来
代码如下
*读取模板图片和要查找的目标图片
read_image (Image, 'green-dot')
*read_image (ImageSearch, 'green-dots')
*/准备图片阶段//
*主要是要匹配的模板
threshold (Image, Region,0,100)
*将区域分离
connection (Region, ConnectedRegions)
*根据面积挑选出需要的部分
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10000,20000)
*将区域闭合
fill_up (SelectedRegions, RegionFillUp)
*膨胀以便使得区域稍大,可以完全覆盖"图案"
dilation_circle (RegionFillUp, RegionDilation,10)
*将相应的图片裁剪下
reduce_domain (Image, RegionDilation, ImageReduced)
接下来创建轮廓模板
* 要寻找的模板与原模版大小比例
* 模板旋转的角度
create_scaled_shape_model (ImageReduced,5,rad(0),rad(360), 'auto', 0.7,1.5, 'auto', 'auto', 'ignore_local_polarity', 'auto', 'auto', ModelID)
* 使用ignore_local_polarity时,即使前背景对比度不同也能找到模型
*得到模板匹配的轮廓 匹配轮廓默认在0,0点
get_shape_model_contours (ModelContours, ModelID, 1)
首次找到的模板轮廓位于(0,0)点 就是左上角那个
将找到的轮廓变换回初始位置
*得到模板的中心(即要匹配的轮廓的初始位置,不是(0,0)那个轮廓)
area_center (RegionFillUp, Area, Row, Column)
*//将模板轮廓平移到中心///
*产生模板平移的仿射变换 将(0,0)点的轮廓变换回轮廓的初始位置
vector_angle_to_rigid (0,0,0, Row, Column,0, HomMat2D)
*将仿射变换应用于轮廓
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
接下来就可以加载新的照片,进行模板匹配了
*读取要匹配的图片
read_image (ImageSearch, 'green-dots')
stop()
*寻找匹配的模板
find_scaled_shape_model (ImageSearch, ModelID,rad(0),rad(360), 0.5, 1.5, 0.5,0, 0.5, 'least_squares', 5, 0.8, Row1, Column1, Angle, Scale, Score)
*逐个显示模型
for I:= 0 to |Score|-1 by 1
*建立平移数组
hom_mat2d_identity (HomMat2DIdentity)
*平移
hom_mat2d_translate (HomMat2DIdentity, Row1[I], Column1[I], HomMat2DTranslate)
*旋转
hom_mat2d_rotate (HomMat2DTranslate, Angle[I], Row1[I], Column1[I], HomMat2DRotate)
*缩放
hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], Row1[I], Column1[I], HomMat2DScale)
*将仿射变换应用于图像
affine_trans_contour_xld (ModelContours, ContoursAffineTrans1, HomMat2DScale)
endfor
最终结果
首先看下要匹配的图像
首先圈出要寻找的感兴趣区域
read_image (Image, '//Mac/Home/Documents/halcon/demos/基于灰度的模板匹配/1.dib')
*//先将需要匹配的区域提取出///
rgb1_to_gray (Image, GrayImage)
get_image_size (GrayImage, Width, Height)
dev_open_window_fit_image (GrayImage, 0, 0, -1, -1, WindowHandle)
dev_display (GrayImage)
*自行画出圆形的感兴趣区域
draw_circle (WindowHandle, Row, Column, Radius)
*产生圆形区域
gen_circle (Circle, Row, Column, Radius)
*将区域对应的图片裁剪下来
reduce_domain (GrayImage, Circle, ImageReduced)
创建寻找模板
*/模板匹配相关内容
*创建匹配模板
create_template (ImageReduced, 255, 4, 'sort', 'original', TemplateID)
*二值化大致取出区域
threshold (Image, Region, 128, 255)
*将区域分离
connection (Region, ConnectedRegions)
*挑出符合条件的区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10000,50000)
*将选中的区域呈现在一张图片中
add_channels (SelectedRegions, Image, GrayRegions)
*
best_match (GrayRegions, TemplateID, 20, 'false', Row1, Column1, Error)
*产生一个元组 作用是生成与找到的模板个数匹配的圆的半径 这里为100
*|Row1|找到了圆的个数
tuple_gen_const (|Row1|,100, Newtuple)
*画出找到的元素
gen_circle (Circle1, Row1, Column1, Newtuple)