模板匹配中级篇,Halcon实战项目讲解一,基于相关性。
相关性匹配:
优点:不受光照和变焦的影响
缺点:单一模板受大小,遮挡等多种情况影响
实际程序:
程序:
- Image Acquisition 02: Code generated by Image Acquisition 02
read_image (Image, ‘D:/shijue/fangshuidai/dongfangyuhonhg2/Image_20211210164409323.bmp’)
rgb1_to_gray (Image, GrayImage)
gen_rectangle1 (ROI_0, 836.493, 836.702, 1475.59, 1658.43)
reduce_domain (GrayImage, ROI_0, ImageReduced)
create_ncc_model (ImageReduced, ‘auto’, rad(0), rad(360), ‘auto’, ‘use_polarity’, ModelID)
area_center (ImageReduced, ModelRegionArea, RefRow, RefColumn)
list_files (‘D:/shijue/fangshuidai/dongfangyuhonhg2’, [‘files’,‘follow_links’], ImageFiles)
tuple_regexp_select (ImageFiles, [’\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$’,‘ignore_case’], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image1, ImageFiles[Index])
rgb1_to_gray (Image1, GrayImage1)- Image Acquisition 03: Do something
find_ncc_model (GrayImage1,ModelID , rad(0), rad(360), 0.5, 1, 0.5, ‘true’, 0, Row, Column, Angle, Score)
if (Score>0)
vector_angle_to_rigid (RefRow, RefColumn, 0, Row, Column,Angle, HomMat2D1)
affine_trans_region (ROI_0, RegionAffineTrans, HomMat2D1, ‘nearest_neighbor’)
dev_display (Image1)
gen_cross_contour_xld (Cross, Row, Column, 150, 0.785398)
dev_display_ncc_matching_results (ModelID, ‘green’, Row, Column, Angle, 0)
endif
endfor
单步讲解:
read_image (Image, ‘D:/shijue/fangshuidai/dongfangyuhonhg2/Image_20211210164409323.bmp’)
//读取我们进行模板建立多的图片。应该使用具有代表性的图片。
rgb1_to_gray (Image, GrayImage)
//将图片转化为灰度图片。由于这次读取的模板为基于灰度值的相关性模板,所以所建立的模板和被匹配的模板只能为灰度图片
gen_rectangle1 (ROI_0, 836.493, 836.702, 1475.59, 1658.43)
//绘制ROI区域,我们在绘制ROI区域的时候可以直接选取最为特征的区域例如。
//我要寻找产品的中心点
//可以这样子画
- Image Acquisition 03: Do something
或者
//都是可以的,但是一定要记住要选取具有特征的地方
reduce_domain (GrayImage, ROI_0, ImageReduced)
//对图像进行裁剪
create_ncc_model (ImageReduced, ‘auto’, rad(0), rad(360), ‘auto’, ‘use_polarity’, ModelID)
//创建模板。ImageReduced:来源图片。‘auto’:金字塔层数。rad(0):最小匹配角度。rad(360):最大匹配角度。‘auto’:旋转角度的步长。‘use_polarity’:匹配方法。ModelID:模板句柄。
area_center (ImageReduced, ModelRegionArea, RefRow, RefColumn)
//读取坐标,方便输出
list_files (‘D:/shijue/fangshuidai/dongfangyuhonhg2’, [‘files’,‘follow_links’], ImageFiles)
tuple_regexp_select (ImageFiles, [’\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$’,‘ignore_case’], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image1, ImageFiles[Index])
//读取文件夹的图片
rgb1_to_gray (Image1, GrayImage1)
//将图片转化为灰度图片
find_ncc_model (GrayImage1,ModelID , rad(0), rad(360), 0.5, 1, 0.5, ‘true’, 0, Row, Column, Angle, Score)
//使用模板进行匹配。GrayImage1:输入图片。ModelID:模板句柄。rad(0):最小角度。rad(360):最大角度。0.5:匹配的精度。1:匹配个数。0.5:最大重叠度。‘true’:是否采用亚像素精度。Row, Column, Angle:输出的横纵坐标和角度。Score:匹配精度分数
if (Score>0)
//防止没有匹配到的图片导致halcon报错。如果没有匹配图片则Score会输出为0即为空值。
vector_angle_to_rigid (RefRow, RefColumn, 0, Row, Column,Angle, HomMat2D1)
affine_trans_region (ROI_0, RegionAffineTrans, HomMat2D1, ‘nearest_neighbor’)
//进行仿射变换显示
dev_display (Image1)
gen_cross_contour_xld (Cross, Row, Column, 150, 0.785398)
//显示中心点
dev_display_ncc_matching_results (ModelID, ‘green’, Row, Column, Angle, 0)
//显示匹配矩形
Endif
endfor
总结:对于模板匹配的相关性匹配而言,他的匹配是基于图像的大小像素的灰度值。意思就是如果我的模板是2020cm的,匹配样板是3030的即使我们看的是一样的仍然不能匹配。对于一张图片而言如果所得的图片有所遮挡到我们预先模板的区域也是不能正常识别的。
模板匹配比较常用于各类的定位项目,和其他项目的预处理。
对于模板匹配而言我们不一定要使用ROI区域可以直接使用blob分析,但是原则都是将我们需要建立模板的图像进行抠图。
这类型图像仍然可以识别
像这类图像均不行:(其余均可)
//有遮挡
//大小不同
//重叠有遮挡