質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

445閲覧

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

AnimatorMasatoy

総合スコア45

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2023/12/07 06:46

前提

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を使用していましたが、未熟なもので、読んでも理解できませんでした…💧

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

検出結果が格納された「Result」には「最も一致率の高い情報以外の情報」が格納されていると思われます。

「思われます」じゃなくて,ちゃんと調べましょうよ.

Result には「各画素位置におけるマッチングスコアが格納されている」という話になっているハズです.
そしたら

「一定のしきい値を超える場所をすべて表示する」

をするなら,この Result に何らかのしきい値処理を行えばよいでしょう.
単純なしきい値処理ならば OpenCV に threshold みたいなのがあるハズなので,まずはそれを試してみてはどうでしょうか.

ただし,これ系は「非極大値抑制 (Non maximum suppression)」という話がかならず付いて回るので,「しきい値処理さえ行えばそれで終了」という話とはならないでしょう.
→この単語の意味がわからない場合,まずはググると良いでしょう.

投稿2023/12/07 07:30

編集2023/12/07 07:34
fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2023/12/07 07:56 編集

> その情報を取り出すような関数を探しています。 あなたのやりたいことそれそのものに完全にマッチする関数が用意されているとは限らない. おそらく「非極大値抑制込みで matchTemplate の処理結果を いい感じに 得る」的な関数なんてのは無いと思う. とりあえず画像データの各画素値にアクセスする手段を知るべき. 既に知っているならば,`Result` の中身を走査してやりたいことを好きにやればよい.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問