12

emgu を初めて使用するので、どこから始めればよいかアドバイスをお願いします。

私は形状検出を調べましたが、必要なものには複雑すぎます..私は思う..私のサーフサンプルは機能していません。次のエラーが表示されます。

EMGU.CV の SURF の例を動作させることができませんか?

とにかく、これは私がやりたいことです:画像Bで画像Aを見つけます。画像Aは、常に同じ灰色の1ピクセルの境界線と常に同じサイズ(私は信じています)を持つ単純な正方形ですが、内側の色は黒または約 7 色のうちの 1 つ (単色のみ)。ボタンを押したときに画像bの画像Aの座標を見つける必要があります。下の画像を参照してください。

画像B

画像b

画像A

画像を

4

2 に答える 2

25

Goosebumps答えは正しいですが、少しのコードも役立つかもしれないと思いました。MatchTemplateこれは、ソース画像 (画像 B) 内のテンプレート (画像 A) を検出するために使用する私のコードです。前述Goosebumpsのように、テンプレートの周りに灰色を含めることをお勧めします。

Image<Bgr, byte> source = new Image<Bgr, byte>(filepathB); // Image B
Image<Bgr, byte> template = new Image<Bgr, byte>(filepathA); // Image A
Image<Bgr, byte> imageToShow = source.Copy();

using (Image<Gray, float> result = source.MatchTemplate(template, Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCOEFF_NORMED))
{
    double[] minValues, maxValues;
    Point[] minLocations, maxLocations;
    result.MinMax(out minValues, out maxValues, out minLocations, out maxLocations);

    // You can try different values of the threshold. I guess somewhere between 0.75 and 0.95 would be good.
    if (maxValues[0] > 0.9)
    {
        // This is a match. Do something with it, for example draw a rectangle around it.
        Rectangle match = new Rectangle(maxLocations[0], template.Size);
        imageToShow.Draw(match, new Bgr(Color.Red), 3);
    }
}

// Show imageToShow in an ImageBox (here assumed to be called imageBox1)
imageBox1.Image = imageToShow;
于 2013-05-07T11:58:39.057 に答える
3

これはおそらくあなたが 探しているものです。あなたの黒い四角がテンプレートになります。周りに少しグレーを入れてみてもよいでしょう。これにより、検出器が大きな黒い領域で発火するのを防ぎます。

于 2013-05-07T09:42:24.370 に答える