1. 程式人生 > >halcon學習筆記模板匹配

halcon學習筆記模板匹配

halcon的模板匹配種類有很多種,方法各有優缺點,一般有基於灰度的匹配,基於形狀的匹配等等,這裡具體理論和方法不做詳解,只簡單總結一個例項。影象匹配一般需要對旋轉放縮排行處理,另外為了提高搜尋效率,常用用影象金字塔來處理模板影象,影象金子塔就是把影象按一定演算法,縮小為不同比例的模板,減少畫素。一般的模板匹配流程如下:

所以首先建立模板,模板的建立就是採集一張自己需要的原始影象,如下我採集的原始影象:

我需要的是銀聯那個標誌,生成模板的原始碼如下:

  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. *生成模板檔案  

生成的模板檔案要用來進行匹配,下面是我用攝像頭進行實時匹配的影象:

匹配的的原始碼如下,左上角是影象處理過程疊加的:

  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. grab_image_start (AcqHandle, -1)  
  9. while (true)  
  10.  grab_image_async (Image, AcqHandle, -1)   
  11. * Calibration 01: Code generated by Calibration 01  
  12. CamParOriginal:= [0.01629,-2024.24,8.30436e-006,8.3e-006,710.402,361.975,1280,960]  
  13. CameraPose := [-0.0236413,0.0135896,0.152813,16.2821,3.05758,76.5791,0]  
  14. *上面是我相機的標定量,根據自己相機標定填寫,此段程式碼不可直接用  
  15. CamParVirtualFixed:=CamParOriginal    
  16. CamParVirtualFixed[1]:=0    
  17. *上面是標定時候的引數設定  
  18. gen_radial_distortion_map(MapFixed,CamParOriginal,CamParVirtualFixed,'bilinear')    
  19. *生產徑向畸變對映圖,    
  20. *mapfixed是輸出,    
  21. *CamParOriginal是標定後的引數,    
  22. *CamParVirtualFixed也是輸出的引數,    
  23. *'bilinear'對映型別   
  24. map_image(Image,MapFixed,ImageRectifiedFixed)    
  25. *利用對映,消除影象畸變運算元   
  26. read_shape_model ('E:/HalconTest/實驗2d匹配/img_model/img_model3.shm', ModelID)  
  27. *讀取影象  
  28. 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)  
  29. *尋找單個帶尺度形狀模板最佳匹配  
  30. *ImageRectifiedFixed 要搜尋的影象  
  31. *ModelID 模板ID  
  32. *AngleStart 開始角度加rad(90)是將弧度制轉為角度值  
  33. *AngleExtent 角度範圍  
  34. *ScaleMin 模板行方向縮放最小尺度  
  35. *ScaleMax 模板行方向縮放最大尺寸  
  36. *MinScore 最低匹配分值 百分比  
  37. *NumMatches 匹配例項的個數  
  38. *MaxOverlap 最大重疊 在有重疊時也可檢測匹配  
  39. *SubPixel 是否亞畫素精度  
  40. *NumLevels 金子塔層數  
  41. *Greediness 搜尋貪婪度; 0安全慢;1塊不穩定;其他就是介於中間值  
  42. *剩下的幾個引數是匹配影象的位置狀態等引數  
  43. get_shape_model_contours (ModelContours, ModelID, 1)  
  44. *返回匹配結果的輪廓  
  45. for I := 0 to |Score| - 1 by 1  
  46.     *for迴圈查詢匹配  
  47.      vector_angle_to_rigid (0, 0, 0, Row[I], Column[I], Angle[I], HomMat2DRotate)  
  48.     *單匹配計算剛性變換矩陣 為了顯示匹配影象  
  49.      hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], Row[I], Column[I], HomMat2DScale)  
  50.      *新增一個擴充套件到一個均勻的二維變換矩陣 為了顯示匹配影象  
  51.      affine_trans_contour_xld (ModelContours, ModelTrans, HomMat2DScale)         
  52.      *應用任意二維仿射變換XLD輪廓 為了顯示匹配影象  
  53.      disp_message (WindowHandle,'匹配一個', 'image', Row[I], Column[I]+100, 'blue', 'true')   
  54.      *新增文字  
  55.      dev_display (ModelTrans)  
  56.      *顯示模型 為了顯示匹配影象  
  57. endfor  
  58. disp_continue_message (WindowHandle, 'black', 'true')  
  59. stop ()  
  60. * ****  
  61. * step: destroy model  
  62. * ****  
  63. endwhile  
  64. clear_shape_model (ModelID)