12

我是 emgu 的新手,想要一些关于从哪里开始的建议。

我已经查看了形状检测,但它对于我需要的东西来说太复杂了..我认为..而且我的 surfexample 不起作用。我收到此错误:

无法让 EMGU.CV 中的 SURF 示例正常工作?

无论如何,这就是我想做的:在图像 B 中找到图像 A。图像 A 是一个简单的正方形,它始终具有相同的灰色 1 像素边框并且始终具有相同的大小(我相信),但内部颜色可能是黑色或大约 7 种其他颜色之一(只有纯色)。当我按下按钮时,我需要在图像 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

您可以查看http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html 这可能是您正在寻找的。你的黑色方块将是模板。您也可以尝试在其周围添加一点灰色。这将防止探测器在大的黑色区域上发射。

于 2013-05-07T09:42:24.370 回答