halcon如何識別硬幣?

2022-11-19 15:00:16

halcon如何識別硬幣?

前言

最近一直在學習halcon,在此做了一個案例,分享給大家,效果圖如下:

1.思路分析

通過觀察,發現1元,5角,1角,它們在面值的文字描述不一樣,硬幣顯示的花紋不一樣,如果我們通過模板匹配,那我們需要考慮2個因素,正/反面完全不一樣。
換個思路,找到不變的因素【硬幣外圈大小】,用最小的變數作為我們判斷的基準,從而降低問題的複雜度。

2.程式碼邏輯分析

  1. 我們首先指定3個模板【硬幣的圓圈大小】
  2. 讀取原圖片
  3. 使用模板匹配
  4. 標註不同的硬幣

3.程式碼實現

3.1 建立模板

點選檢視程式碼
建立模板
*畫外圈圓
draw_circle (3600, Row1, Column1, Radius)
gen_circle (Circle, Row1, Column1, Radius)
dev_display (Image)
*畫內圈圓
draw_circle (3600, Row2, Column2, Radius1)
gen_circle (Circle1, Row2, Column2, Radius1)
*取區域的差
difference (Circle, Circle1, RegionDifference)
reduce_domain (ImageEmphasize, RegionDifference, ImageReduced)
*建立模板
create_shape_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
write_shape_model (ModelID, 'D:/WorkSpace/硬幣/1元.shm')

3.2 模板匹配

點選檢視程式碼
read_image (Image, 'E:/WorkSpace/HalconDemo/硬幣檢測/硬幣/微信圖片_20220620213720.jpg')

*均值濾波器
mean_image (Image, ImageMean, 3, 3)
*圖片增亮
emphasize (ImageMean, ImageEmphasize, 7, 7, 10)
*讀取模板
  read_shape_model ('1元.shm', ModelID)
  
  read_shape_model ('1角.shm', ModelID1)
  
  read_shape_model ('5角.shm', ModelID2)
  
  arr:=[ModelID,ModelID1,ModelID2]
  *設定字型的樣式
    set_display_font (3600, 30, 'mono', 'true', 'false')
  for Index1 := 0 to 2 by 1
        *模板匹配
    find_shape_model (Image, arr[Index1], -0.39, 0.78, 0.4, 0, 0.5, 'least_squares', 2, 0.9, Row, Column, Angle, Score)

      if (|Score|>0)
          tuple_length (Row, Length1)
          for Index2 := 0 to Length1-1 by 1
              *字串顯示的位置
                set_tposition (3600, Row[Index2]-40, Column[Index2]-40)
     switch (Index1)
            case 0:
         dev_set_color ('red')
         write_string (3600, '1元')
          break
             case 1:
         dev_set_color ('green')
         write_string (3600, '1角')
          break
             case 2:
          dev_set_color ('blue')
          write_string (3600, '5角')
         break
     endswitch
          endfor
      endif
  endfor

4.效果展示

效果1:

效果2:

5.總結

我在這裡偷了懶,只是取了外圈大小,來確定不同硬幣的識別,如果圖片中存在不是硬幣,但是大小一樣,這樣一定會誤檢,這也是我們的這個方案不嚴謹的地方,這是案例,我們以學習為主,如果你有更好的方式,請不吝賜教!