はじめまして、以前から勉強のためにROMしていたものです。
今回、画像認識を使ってゲームのスクリーンショットから文字データを抜き出すアプリを開発しはじめたのですが、
opencvを使って、テンプレート検索までは可能になったのですが、Cv.MinMaxLocを使ってしまうと、MaxとMinしか取れないため、
最小と最大の2点しかとることができません。
そうではなく、しきい値をもうけて、複数箇所を求めたいのですが、どのようにすればいいのでしょうか?
c#でopencvを使ったテンプレートマッチングの複数検索について。
Re: c#でopencvを使ったテンプレートマッチングの複数検索について。
最大でマッチした部分を画像加工でマスクして再度テンプレートマッチングする・・を繰り返すやり方はだめですか?
Re: c#でopencvを使ったテンプレートマッチングの複数検索について。
いわんさんの回答していただいた処理を組んでみたところ、無事にできました。
しかし、調べてみるとopencvでしきい値以下を排除する関数を見つけたので、その関数を使えば、簡単に実現することができました。
今後、同じような事で調べる人がいるかもしれないので、ソースコードを残しておこうと思います。
環境は、OpenCvSharp3(All in package)を使用してコードを書きました。
しかし、調べてみると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);
}
}
}