3

私の混乱を解消したいだけです。いくつかの数値を照合するために、openCVテンプレート照合方法をテストしました。最初に、この番号のシーケンス0 1 2 3 4 5 1 2 3 4 5があります(2値化後、おそらく文字幅が異なります)。テンプレートマッチングは、番号「1」に一致するようにどのように機能しますか?それをしますか。

  1. 2つの一致(2つの出力)が見つかるまで、すべてのウィンドウをスライドします。または
  2. 最初の「1」に一致した後に停止する、または
  3. 2つの数値「1」の間の最も高い相関を見つけて、どちらかを選択します。

一致する番号「1」

編集済み:添付されているのは出力です。1つの数字「1」にのみ一致し、2つの「1」には一致しません。

[Q] 2つの数字「1」を同時に検出するにはどうすればよいですか?

4

1 に答える 1

5

私はそれが古い質問であることを知っていますが、ここに答えがあります。

MatchTemplate を実行すると、グレースケールの画像が出力されます。その後、MinMax を実行する必要があります。次に、探している範囲に結果があるかどうかを確認できます。以下の例では、EmguCV (C# の OpenCV のラッパー) を使用して、0.75 未満の場合にのみ、最良の検索 (minValues 配列のインデックス 0) の周りに四角形を描画します (このしきい値は必要に応じて調整できます)。

コードは次のとおりです。

Image<Gray, float> result = new Image<Gray, float>(new System.Drawing.Size(nWidth, nHeight));
result = image.CurrentImage.MatchTemplate(_imageTemplate.CurrentImage, Emgu.CV.CvEnum.TM_TYPE.CV_TM_SQDIFF_NORMED);


double[] minValues;
double[] maxValues;
System.Drawing.Point[] minLocations;
System.Drawing.Point[] maxLocations;

result.MinMax(out minValues, out maxValues, out minLocations, out maxLocations);
if (minValues[0] < 0.75)
{
    Rectangle rect = new Rectangle(new Point(minLocations[0].X, minLocations[0].Y), 
        new Size(_imageTemplate.CurrentImage.Width, _imageTemplate.CurrentImage.Height));
    image.CurrentImage.Draw(rect, new Bgr(0,0,255), 1);
}
else
{
    //Nothing has been found
}

編集

出力の例を次に示します。

出力例

于 2013-03-28T13:40:21.873 に答える