halcon学习笔记模板匹配

halcon的模板匹配种类有很多种,方法各有优缺点,一般有基于灰度的匹配,基于形状的匹配等等,这里具体理论和方法不做详解,只简单总结一个实例。图像匹配一般需要对旋转放缩进行处理,另外为了提高搜索效率,常用用图像金字塔来处理模板图像,图像金子塔就是把图像按一定算法,缩小为不同比例的模板,减少像素。一般的模板匹配流程如下:

halcon学习笔记模板匹配

 

所以首先创建模板,模板的创建就是采集一张自己需要的原始图像,如下我采集的原始图像:

halcon学习笔记模板匹配

 

我需要的是银联那个标志,生成模板的源代码如下:

[plain] view plain copy
  1. read_image (Image, 'E:/HalconTest/实验2d匹配/exp/110.jpg')  
  2. *读取模板图像  
  3. rgb1_to_gray (Image, GrayImage)  
  4. *灰度操作  
  5. gen_rectangle1 (ROI_0, 189.5, 531.5, 325.5, 717.5)  
  6. *选择要匹配的图像,去除不必要的  
  7. reduce_domain (GrayImage, ROI_0, ImageReduced2)  
  8. *减少图像,分割出切除的那部分  
  9. bin_threshold (ImageReduced2, Region1)  
  10. *自动灰度阈值处理  
  11. connection (Region1, ConnectedRegions1)  
  12. *求联通域  
  13. select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 8, 14016)  
  14. *选择图像  
  15. reduce_domain (ImageReduced2, SelectedRegions1, ImageReduced3)  
  16. *分割出图像  
  17. inspect_shape_model (ImageReduced3, ModelImages1, ModelRegions1, 4, 30)  
  18. *创建一个形状的表示模型  
  19. create_scaled_shape_model (ImageReduced3, 'auto', rad(-45), rad(90), 'auto', 0.9, 1, 0, 'no_pregeneration', 'ignore_global_polarity', 'auto', 'auto', ModelID)  
  20. *使用用图像创建带有缩放的匹配模板,上面的灰度分割什么的其实可以不要  
  21. *NumLevels 最高金子塔层数  
  22. *AngleStart 开始角度加rad(90)是将弧度制转为角度值  
  23. *AngleExtent 角度范围  
  24. *AngleStep 旋转角度步长  
  25. *ScaleMin 模板行方向缩放最小尺度  
  26. *ScaleMax 模板行方向缩放最大尺寸  
  27. *MinScore 最低匹配分值 百分比  
  28. *ScaleStep 步长  
  29. *Optimization 优化选项 是否减少模板点数  
  30. *Metric 匹配度量级性旋转   
  31. *MinContrast 最小对比度  
  32. *ModelID 生成模板ID  
  33. write_shape_model (ModelID, 'C:/Users/shanwenjun/Desktop/img_model3.shm')  
  34. *生成模板文件  

生成的模板文件要用来进行匹配,下面是我用摄像头进行实时匹配的图像:

halcon学习笔记模板匹配

 

匹配的的源代码如下,左上角是图像处理过程叠加的:

[plain] view plain copy
  1. dev_close_window ()  
  2. dev_open_window (0, 0, 640, 480, 'black', WindowHandle)  
  3. *先关闭活动图形窗口,再打开这个窗口,标识符为WindowHandle;  
  4. *相对于界面左上角第0行、第0列,大小是我相机的拍照比例,颜色为黑色。  
  5. open_framegrabber ('MindVision11', 1, 1, 0, 0, 0, 0, 'progressive', 8, 'Gray', -1, 'false', 'auto', 'Camera MV-U130RC#C17D8221-3', 0, -1, AcqHandle)  
  6. *DirectShow是笔记本摄像头或者其他DirectShow的摄像头,MindVision11是我相机的摄像头;  
  7. * 注意摄像头的名称,可以用工具栏中的“助手”——打开新的Image Acquisition获取摄像头及插入代码  
  8.   
  9. grab_image_start (AcqHandle, -1)  
  10. while (true)  
  11.  grab_image_async (Image, AcqHandle, -1)   
  12. * Calibration 01: Code generated by Calibration 01  
  13. CamParOriginal:= [0.01629,-2024.24,8.30436e-006,8.3e-006,710.402,361.975,1280,960]  
  14. CameraPose := [-0.0236413,0.0135896,0.152813,16.2821,3.05758,76.5791,0]  
  15. *上面是我相机的标定量,根据自己相机标定填写,此段代码不可直接用  
  16.   
  17. CamParVirtualFixed:=CamParOriginal    
  18. CamParVirtualFixed[1]:=0    
  19. *上面是标定时候的参数设置  
  20.   
  21. gen_radial_distortion_map(MapFixed,CamParOriginal,CamParVirtualFixed,'bilinear')    
  22. *生产径向畸变映射图,    
  23. *mapfixed是输出,    
  24. *CamParOriginal是标定后的参数,    
  25. *CamParVirtualFixed也是输出的参数,    
  26. *'bilinear'映射类型   
  27.   
  28. map_image(Image,MapFixed,ImageRectifiedFixed)    
  29. *利用映射,消除图像畸变算子   
  30.   
  31. read_shape_model ('E:/HalconTest/实验2d匹配/img_model/img_model3.shm', ModelID)  
  32. *读取图像  
  33. find_scaled_shape_model (ImageRectifiedFixed, ModelID, rad(-180), rad(180), 0.5, 1.2, 0.3, 1, 0.5, 'none', 4, 0.9, Row, Column, Angle, Scale, Score)  
  34. *寻找单个带尺度形状模板最佳匹配  
  35. *ImageRectifiedFixed 要搜索的图像  
  36. *ModelID 模板ID  
  37. *AngleStart 开始角度加rad(90)是将弧度制转为角度值  
  38. *AngleExtent 角度范围  
  39. *ScaleMin 模板行方向缩放最小尺度  
  40. *ScaleMax 模板行方向缩放最大尺寸  
  41. *MinScore 最低匹配分值 百分比  
  42. *NumMatches 匹配实例的个数  
  43. *MaxOverlap 最大重叠 在有重叠时也可检测匹配  
  44. *SubPixel 是否亚像素精度  
  45. *NumLevels 金子塔层数  
  46. *Greediness 搜索贪婪度; 0安全慢;1块不稳定;其他就是介于中间值  
  47. *剩下的几个参数是匹配图像的位置状态等参数  
  48. get_shape_model_contours (ModelContours, ModelID, 1)  
  49. *返回匹配结果的轮廓  
  50.   
  51. for I := 0 to |Score| - 1 by 1  
  52.     *for循环查找匹配  
  53.      vector_angle_to_rigid (0, 0, 0, Row[I], Column[I], Angle[I], HomMat2DRotate)  
  54.     *单匹配计算刚性变换矩阵 为了显示匹配图像  
  55.      hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], Row[I], Column[I], HomMat2DScale)  
  56.      *添加一个扩展到一个均匀的二维变换矩阵 为了显示匹配图像  
  57.      affine_trans_contour_xld (ModelContours, ModelTrans, HomMat2DScale)         
  58.      *应用任意二维仿射变换XLD轮廓 为了显示匹配图像  
  59.      disp_message (WindowHandle,'匹配一个', 'image', Row[I], Column[I]+100, 'blue', 'true')   
  60.      *添加文本  
  61.      dev_display (ModelTrans)  
  62.      *显示模型 为了显示匹配图像  
  63. endfor  
  64.    
  65. disp_continue_message (WindowHandle, 'black', 'true')  
  66. stop ()  
  67. * ****  
  68. * step: destroy model  
  69. * ****  
  70. endwhile  
  71. clear_shape_model (ModelID)