私はemguを初めて使用するので、どこから始めればよいかについてアドバイスを求めています。
私は形状検出を調べましたが、必要なものには複雑すぎます..私は思う..そして私のsurfexampleは機能していません。このエラーが発生します:
EMGU.CVのSURFの例を機能させることができませんか?
とにかく、これは私がやりたいことです:画像Bで画像Aを見つけます。画像Aは、常に同じ灰色の1ピクセルの境界線と常に同じサイズ(私は信じています)を持っている単純な正方形ですが、内側の色は黒または他の約7色の1つ(これまで単色のみ)。ボタンを押すと、画像bで画像Aの座標を見つける必要があります。以下の画像を参照してください。
画像[〜#〜] b [〜#〜]
そして
画像[〜#〜] a [〜#〜]
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;
あなたは見ることができます http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html これはおそらくあなたが探しているものです。あなたの黒い四角がテンプレートになります。また、その周りに少し灰色を含めることもできます。これにより、検出器が大きな黒い領域で発火するのを防ぎます。