Как отобразить рисовать прямоугольник из OpenCV.MatchTemplate - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь найти изображение на скриншоте и нарисовать прямоугольник вокруг него. То, что я не понимаю, как интерпретировать мою result матрицу, чтобы идентифицировать область, содержащую изображение.

Приведенный ниже код нарисует прямоугольник, но на самом деле он не в нужном месте, и я не знаю, потому что я не правильно использую result или что-то еще.

using (Mat templateImage = CvInvoke.Imread("\\top_1.png", Emgu.CV.CvEnum.ImreadModes.AnyColor))
using (Mat inputImage = CvInvoke.Imread(AppDomain.CurrentDomain.BaseDirectory + "\\currentScreen.png", Emgu.CV.CvEnum.ImreadModes.AnyColor))
{
    Mat result = new Mat();
    CvInvoke.MatchTemplate(inputImage, templateImage, result, Emgu.CV.CvEnum.TemplateMatchingType.SqdiffNormed);

    result.MinMax(out double[] minVal, out double[] maxVal, out Point[] minLoc, out Point[] maxLoc);

    int x = minLoc[0].X;
    int y = minLoc[0].Y;
    int w = maxLoc[0].X - minLoc[0].X;
    int h = maxLoc[0].Y - minLoc[0].Y;

    Form f = new Form
    {
        BackColor = Color.Red,
        //TransparencyKey = Color.Red,
        FormBorderStyle = FormBorderStyle.None,
        TopMost = true,
        Location = new Point(x, y),
        Size = new Size(w, h)
    };

    Application.EnableVisualStyles();
    Application.Run(f);
}

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Я понял свою ошибку после прочтения и перечитывания документации несколько раз. В итоге я не стал использовать это, так как нашел гораздо более простой и надежный метод для своего варианта использования, но для пользы других:

Функция MinMax() дает вам как минимум, так и максимум, потому что какой вы используете зависит от используемого типа соответствия. Например, Emgu.CV.CvEnum.TemplateMatchingType.SqdiffNormed возвращает результаты, где min - наибольшее совпадение.

Местоположение, возвращаемое в minLo c - это просто верхняя левая координата templateImage, поэтому оно совпадает с тем же размером площадь как templateImage означает, что я просто должен был сделать:

int x = minLoc[0].X;
int y = minLoc[0].Y;
int w = maxLoc[0].X + templateImage.Width;
int h = maxLoc[0].Y + templateImage.Height;

Я был пойман, потому что я не предполагал, что templateImage, найденный в inputImage, был бы того же размера.

0 голосов
/ 24 января 2020

Единственное, что я вижу, это положение формы, вы должны установить для StarPosition значение Manual

            Form f = new Form
            {
                StartPosition = FormStartPosition.Manual,
                BackColor = Color.Red,
                //TransparencyKey = Color.Red,
                FormBorderStyle = FormBorderStyle.None,
                TopMost = true,
                Location = new Point(x, y),
                Size = new Size(w, h)
            };

Это изображение на экране

Это шаблон

Это результат

Это без StartPosition

...