给客户做了一个自动化生产线的示教系统,其中一个步骤是对板子上特定位置的螺丝孔是否存在螺丝进行识别。第一个想到的是模板匹配的方法。基于形状的模板匹配方法其实很简单,拍个照片,手动设置一下模板位置,然后生成模板文件即可。后面再用生成的模板文件对其他照片上的指定位置进行识别。图像如下:
1、穹顶光源
2、环形光源
3、条形光源
测试不同的光照方案,对于圆形的物体,最好的还是穹顶光源。一直想试试大一点的环形光源,应该也可以。但是没有设备。
建立模板的HALcon代码:
*读取图像
read_image (Image, '04.bmp')
rgb1_to_gray (Image, GrayImage)
*在图像上手动绘制ROI,即选择绘制的模板区域
*draw_rectangle1 (200000, Row1, Column1, Row2, Column2)
draw_circle (200000, Row, Column, Radius)
*将绘制的模板区域生成矩形
*gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
gen_circle (Circle, Row, Column, Radius)
*提取出区域的图像,作为模板图像
*reduce_domain (Image, Rectangle, ImageReduced1)
reduce_domain (GrayImage, Circle, ImageReduced2)
*创建模板
*create_shape_model (ImageReduced1, 'auto', -0.39, 0.79, 'auto', 'auto', 'ignore_color_polarity','auto', 'auto', ModelID)
inspect_shape_model(ImageReduced2,ModelImages,ModelRegions,4,70)
*create_shape_model (Image, 4, -0.2, 0.4, 'auto', 'auto', 'ignore_color_polarity',30, 'auto', ModelID)
create_scaled_shape_model (ImageReduced2, 4, rad(0), rad(180), 'auto', 0.5, 1.5, 0.1, 'none', 'use_polarity', 70, 'auto', ModelID)
* inspect_shape_model(Image,ImageReduced1, Rectangle,4,100)
*将创建的模板存成指定路径的文件
write_shape_model (ModelID, 'Model1-44-30.shm')
使用模板进行匹配的代码:
list_image_files ('E:/董磊项目2/LUOSI/HalconCPP/穹顶光源', 'default', [], ImageFiles)
tuple_regexp_select (ImageFiles, '.bmp', ImageFiles)
for Index := 0 to |ImageFiles|-1 by 1
*read_image (Image1, '12.bmp')
read_image (Image1, ImageFiles[Index])
rgb1_to_gray (Image1, GrayImage)
dev_open_window(0, 0, 1024, 768, 'green', WindowID)
dev_display(GrayImage)
draw_circle (WindowID, Row, Column, Radius)
gen_circle (Circle, Row, Column, Radius)
dev_set_draw ('margin')
dev_set_line_width(20)
dev_set_color ('yellow')
dev_display (Circle)
reduce_domain(GrayImage,Circle,GrayImageReduced)
emphasize (GrayImageReduced, ImageEmphasize, 7, 7, 1)
*读取模板文件
read_shape_model ('Model1-4-50.shm', ModelID1)
find_scaled_shape_model (ImageEmphasize, ModelID1, rad(0), rad(180), 0.5, 1.5, 0.13, 1, 0, 'none', 0,0, Row6, Column6, Angle1,Scale1, Score1)
dev_display_shape_matching_results (ModelID1, 'red', Row6, Column6, Angle1, 1, 1, 0)
*显示每个模板的匹配度
dev_get_window (WindowHandle)
set_display_font(WindowHandle,16,'serif','true','false')
tuple_length (Score1, Length)
for I:=0 to Length-1 by 1
dev_disp_text(Score1[I],'image',Row6[I]-50,Column6[I]-30,'forest green',[],[])
endfor
stop()
endfor
关键的一点,要将照明适当过度曝光,你会发现在使用模板进行匹配的时候,有无螺丝的匹配度差别比较大。比较好区分。