VB.NETで扱うOpenCVテンプレートマッチングで複数検出を行いたい

前提

VisualStudioCommunity2022のVisualBasic.NETでOpenCVを使用して画像解析を行いたいのですが、
既に単体での画像マッチング機能は作成できています。

ここでの画像マッチング機能とは、「テンプレート画像」と「対象画像」の2つの画像があり、
「対象画像」から「テンプレート画像」を探し、一致率とその場所を表示するプログラムのことを言います。

やりたいこと

現段階では、「最も一致率の高い場所を表示する」プログラムになっていますが、これを「一定のしきい値を超える場所をすべて表示する」プログラムに改変したいです。困っていることは、そのやり方がわかりません。

全体的な流れとしては、

テンプレート画像と対象画像をMatオブジェクトにそれぞれ格納する

Cv2.MatchTemplate()に先程のMatオブジェクト2つを渡し、検出結果が「Result(Matオブジェクト)」に格納される

Cv2.MinMaxLoc()に「Result」を渡し、最も一致率の高い位置と値を取得

出力

となります。

検出結果が格納された「Result」には「最も一致率の高い情報以外の情報」が格納されていると思われます。
その情報を取り出すような関数を探しています。

ソースコード

OpenCVSharpを導入済み
フォーム名:ImageMatching
設置したオブジェクト:Label1, Button1, PictureBox1, PictureBox2

VB.NET

1Imports OpenCvSharp 2Imports OpenCvSharp.Extensions 3 4Public Class ImageMatching 5 6 'ボタンがクリックされたとき 7 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 8 9 Dim Path1 As String = [対象画像のファイルパス] 10 Dim Path2 As String = [テンプレート画像のファイルパス] 11 12 Using TargetMat As New Mat(Path1), TemplateMat As New Mat(Path2) 13 14 'Result = テンプレートマッチングの結果を格納するオブジェクト 15 Using Result As New Mat 16 17 'テンプレートマッチングを実行 18 Cv2.MatchTemplate(TargetMat, TemplateMat, Result, TemplateMatchModes.CCoeffNormed) 19 20 '最も一致率の高い位置と値を取得する 21 Dim MaxVal As Double 22 Dim MaxPos As Point 23 Cv2.MinMaxLoc(Result, Nothing, MaxVal, Nothing, MaxPos) 24 25 'しきい値 = 70% 26 If MaxVal >= 0.7 Then 27 28 '最も一致率の高い位置に四角を描画する 29 TargetMat.Rectangle(New Rect(MaxPos, TemplateMat.Size), Scalar.LimeGreen, 15) 30 31 '一致率を表示 32 Label1.Text = MaxVal.ToString * 100 & "%" 33 34 End If 35 36 End Using 37 38 '画像を反映 39 PictureBox1.Image = TargetMat.ToBitmap 40 PictureBox2.Image = TemplateMat.ToBitmap 41 42 End Using 43 44 End Sub 45 46End Class

補足情報

参考にした記事:https://skprogramlab.hatenablog.com/entry/OpenCVSharp-Sample13

「最も一致率の高い情報以外の情報」が格納されていると思ったのはPythonやC#で実現している記事を見かけたからです。
そこでは同じくOpenCVSharpやOpenCVを使用していましたが、未熟なもので、読んでも理解できませんでした…💧

コメントを投稿

0 コメント