■はじめに
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》
《例2》
《例3》
《例4》
《例5》
《例6》
《例7》
《例8》
■円(十円玉)検出処理例、その2
上記の《例7》の設定値を変えると、
■円検出の問題点
単純な円検出しかしていないので、検出精度はよくないです。もっと、正確に円検出しようすれば、撮影時のライティングを工夫したり、処理を追加して、十円玉の影を取り除く必要があります。さらに、接触した十円玉、重なった十円玉を、正確に円検出しようすれば、さらなる処理が必要です。