遇到的是两颗螺丝,受环境光影响,轮廓非常复杂.思考逻辑如下:
1.减少轮廓复杂程度,使用到的算子edges_sub_pix
edges_sub_pix (ImageReduced, Edges, 'canny', 6, 20, 40)
2.使用xld创建模板create_shape_model_xld
create_shape_model_xld (Edges, 'auto', 0, 0, 'auto', 'auto', 'ignore_local_polarity', 30, ModelID)
3.reduce_domain减少搜索范围 find_shape_model匹配取结果,这里会把没有打螺丝的也找到,因为轮廓简化了
4.使用get_grayval在中心点取10点像素点的颜色做判断.
read_image (Image, 'clip')
gen_rectangle2 (ROI_0, 117, 185, rad(40.1207), 116.387, 41.7915)
reduce_domain (Image, ROI_0, ImageReduced)
*创建匹配模板
create_shape_model (ImageReduced, 'auto', -0.39, rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*write_shape_model (ModelID, 'C:/Users/斌/Desktop/sss/xxx.shm')*写入创建好的模板
*read_shape_model ('C:/Users/斌/Desktop/sss/xxx.shm', ModelID)*读取以前创建好的模板
*获取创建好的模板轮廓显示在0,0位置
get_shape_model_contours (ModelContours, ModelID, 1)
*参数说明:
*1、要匹配的图元 2、模型句柄 3、模型最小旋转角 4、模型最大旋转角 5、行方向的最小缩放比 6、行方向最大缩放比 7、列方向最小缩放比 8、列方向最大缩放比 9、找到模型的最小分数
*10、找到模型的数量 11、模型的最大重叠 12、亚像素精度 13、金字塔数 14、贪婪值 15、16找到的图像的中心坐标;17、18行列的缩放比 20、得分
find_shape_model (Image, ModelID, -0.39, rad(360), 0.7, 20, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
if (|Score|>0)
dev_display (Image)
dev_display_shape_matching_results (ModelID, 'red', Row, Column, Angle, 1, 1, 0)
*显示匹配的分数
disp_message (200000, Score, 'window', Row, Column+5, 'black', 'true')
endif
模版匹配类型 | 执行步骤 | 应用场合 |
基于组件匹配 |
| 组件匹配是形状匹配的扩展,但不支持大小缩放匹配; 适用于多个对象定位的场合, |
基于形状匹配 |
| 定位对象内部的灰度值可以有变化,但对象边缘轮廓必须清晰平滑的场合 |
基于灰度匹配 |
| 定位对象内部的灰度值必须没有大的变化,没有缺失的部分,没有干扰图像噪声的场合 |
基于互相关匹配 | 1.创建模版create_ncc_model; 2.搜索模版find_ncc_model; 3.释放模版clear_ncc_model; | 搜索对象有轻微的变形,大量的纹理,模糊图像中的对象等场合,其速度快于传统的灰度匹配; |
基于变形匹配 | 1.创建模版create_local_deformable_model; 2.搜索模版find_local_deformable_model; 3.释放模版clear_deformable_model; | 对象有轻微的变形的场合 |
基于描述匹配 | 1.创建模版create_calib_descriptor_model; 2.搜索模版find_calib_descriptor_model; 3.释放模版clear_descriptor_model; | 对象有透视变形的场合,但它不是通过对象的轮廓来匹配的,而是根据一些描述的点来进行匹配的,这些点按照位置和灰度值进行的分类。 |