3

結果の画像でテンプレートのすべてのインスタンスを見つけるために、このようなコードがいくつかあります。

Image<Gray, Byte> templateImage = new Image<Gray, Byte>(bmpSnip);
Image<Gray, float> imgMatch = sourceImage.MatchTemplate(templateImage, Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCOEFF_NORMED);

次に imgMatch.Data[,,] プロパティをループして、スコアがしきい値 (> 0.75 など) を超えているかどうかを確認し、一致する画像にマーカーを配置します。しかし、一致はまったく意味がありません。座標を間違えているのではないかと思います。

        float[,,] matches = imgMatch.Data;
        for (int x = 0; x < matches.GetLength(0); x++)
        {
            for (int y = 0; y < matches.GetLength(1); y++)
            {
                double matchScore = matches[x, y, 0];
                if (matchScore > 0.75)
                {
                    Rectangle rect = new Rectangle(new Point(x,y), new Size(1, 1));
                    imgSource.Draw(rect, new Bgr(Color.Blue), 1);
                }

            }

        }

以下のように MinMax を使用する場合:

double[] min, max;
Point[] pointMin, pointMax;
imgMatch.MinMax(out min, out max, out pointMin, out pointMax);

マーカー(長方形)を設定して一致を強調表示すると、非常に良い結果が得られます。したがって、imgMatch.Data[,,] の座標を特定することに関係していると確信しています。

私が間違っている場所についてのアイデアはありますか?

4

2 に答える 2

4

答えは実際には次のとおりです。

Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCOEFF_NORMEDを使用しているため、結果はテンプレートのサイズによって異なります。得られた結果、つまり一致点は実際にはテンプレートの左上隅への参照であるため、一致の中心を見つけるには、Xからテンプレート幅の半分を、Yからテンプレート高さの半分を引くだけです。

if (matchScore > 0.75)
{
    Rectangle rect = new Rectangle(new Point(x - templateImage.Width ,y - templateImage-Height), new Size(1, 1));
    imgSource.Draw(rect, new Bgr(Color.Blue), 1);
}

これに加えて、0.75のしきい値のみを使用している場合、0.9以上のより高いしきい値を使用すると、より望ましい結果が得られます。必要な値のしきい値を正確に評価するには、imgMatchを直接確認するか、データのヒストグラム形成を確認します。

気をつけてクリス

于 2011-09-14T12:51:30.503 に答える
4

配列内の X 座標と Y 座標を誤って配置しました。これを試して:

        float[, ,] matches = imgMatch.Data;
        for (int y = 0; y < matches.GetLength(0); y++)
        {
            for (int x = 0; x < matches.GetLength(1); x++)
            {
                double matchScore = matches[y, x, 0];
                if (matchScore > 0.75)
                {
                   Rectangle rect = new Rectangle(new Point(x,y), new Size(1, 1));
                   imgSource.Draw(rect, new Bgr(Color.Blue), 1);
                }

            }

        }
于 2011-10-14T08:22:31.670 に答える