【VisualBasic+OpenCVSharp4】による円(十円玉)画像認識処理

記事
IT・テクノロジー

■はじめに

VisualBasic+OpenCVSharp4によって、色々な画像認識処理のプログラムを試験的に作成しましたが、その中で、十円玉の画像認識のサンプルプログラムが一番、年上の友人にウケたので、それを載せます。

■作成環境

OS:Windows10
言語:Microsoft Visual Studio2022 Visual Basic + OpenCVSharp4(パッケージ)
被写体:十円玉数枚
カメラ:COOLPIX A10(NIKON) 静止画を使用

■円(十円玉)検出処理部分のプログラムソース


Dim matSoc As Mat = New Mat(画像ファイル名)
Dim matGry As Mat =
      matSoc.CvtColor(ColorConversionCodes.BGR2GRAY)
Dim matHou As Mat = matSoc.Clone()
'
Cv2.GaussianBlur(matGry, matGry, 
            New OpenCvSharp.Size(9, 9), 0)
Dim Circles As CircleSegment() =
       Cv2.HoughCircles(matGry, HoughModes.Gradient,
       解像度, 円同士が最低限距離,
       円の全体を検出する際の閾値, 円の中心を検出する際の閾値,
       検出する円の半径の下限, 検出する円の半径の上限)
Dim Ip As Integer = 0
For Each item As CircleSegment In Circles
     matHou.Circle(New Point(item.Center.X, item.Center.Y), 
 CInt(Math.Truncate(item.Radius)), New Scalar(0, 255, 0), 3)
      Ip = Ip + 1
       Cv2.PutText(matHou, Ip.ToString("00"),
                      New Point(item.Center.X - item.Radius / 2, 
             item.Center.Y - item.Radius / 2),
                    HersheyFonts.HersheyComplexSmall, 1, 
         New Scalar(255, 255, 0), 1, LineTypes.AntiAlias)

Next
pic_Main1.Image = matHou.ToBitmap
SetSBarLabText(1, Ip.ToString() & "個、円検出しました.")

■円(十円玉)検出処理例

《例1》
HC231010A.png

《例2》
HC231010B.png

《例3》
HC231010C.png

《例4》
HC231010D.png

《例5》
HC231010E.png

《例6》
HC231010F.png

《例7》
HC231010G.png

《例8》
HC231010I.png




■円(十円玉)検出処理例、その2


上記の《例7》の設定値を変えると、

HC231010H.png


■円検出の問題点

 単純な円検出しかしていないので、検出精度はよくないです。もっと、正確に円検出しようすれば、撮影時のライティングを工夫したり、処理を追加して、十円玉の影を取り除く必要があります。さらに、接触した十円玉、重なった十円玉を、正確に円検出しようすれば、さらなる処理が必要です。

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す