c#でopencvを使ったテンプレートマッチングの複数検索について。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ポッチー

c#でopencvを使ったテンプレートマッチングの複数検索について。

#1

投稿記事 by ポッチー » 8年前

はじめまして、以前から勉強のためにROMしていたものです。
今回、画像認識を使ってゲームのスクリーンショットから文字データを抜き出すアプリを開発しはじめたのですが、
opencvを使って、テンプレート検索までは可能になったのですが、Cv.MinMaxLocを使ってしまうと、MaxとMinしか取れないため、
最小と最大の2点しかとることができません。
そうではなく、しきい値をもうけて、複数箇所を求めたいのですが、どのようにすればいいのでしょうか?

アバター
いわん
記事: 30
登録日時: 8年前

Re: c#でopencvを使ったテンプレートマッチングの複数検索について。

#2

投稿記事 by いわん » 8年前

最大でマッチした部分を画像加工でマスクして再度テンプレートマッチングする・・を繰り返すやり方はだめですか?

ポッチー
記事: 3
登録日時: 8年前
連絡を取る:

Re: c#でopencvを使ったテンプレートマッチングの複数検索について。

#3

投稿記事 by ポッチー » 8年前

いわんさんの回答していただいた処理を組んでみたところ、無事にできました。
しかし、調べてみるとopencvでしきい値以下を排除する関数を見つけたので、その関数を使えば、簡単に実現することができました。
今後、同じような事で調べる人がいるかもしれないので、ソースコードを残しておこうと思います。
環境は、OpenCvSharp3(All in package)を使用してコードを書きました。

コード:

//MatのSrc Tmpに画像データを代入
            Mat Src = Cv2.ImRead(@"G:\AAA\WOWS\画像\test1.jpg");
            Cv2.CvtColor(Src, Src, ColorConversionCodes.BGR2GRAY);

            Mat Tmp = Cv2.ImRead(@"G:\AAA\WOWS\画像\test2.png");
            Cv2.CvtColor(Tmp, Tmp, ColorConversionCodes.BGR2GRAY);

            //空のMatを作成
            Mat Result = new Mat();

            List<float> Xpoint = new List<float>();
            List<float> Ypoint = new List<float>();

            //空Matに全座標の比較データ(配列)を格納
            OpenCvSharp.Cv2.MatchTemplate(Src, Tmp, Result, TemplateMatchModes.CCoeffNormed);

            //比較データ(配列)のうち、しきい値0.85以下を排除(0)にする
            OpenCvSharp.Cv2.Threshold(Result, Result, 0.85, 1.0, ThresholdTypes.Tozero);

            //0以上の座標データをXpoint Ypointに格納する
            for (int x = 0; x < Result.Rows; x++)
            {
                for (int y = 0; y < Result.Cols; y++)
                {
                    if (Result.At<float>(x, y) > 0)
                    {
                        Xpoint.Add(x);
                        Ypoint.Add(y);

                    }

                }
            }

閉鎖

“C言語何でも質問掲示板” へ戻る