Альтернатива быстрым скриншотам окна - PullRequest
0 голосов
/ 03 июня 2018

У меня есть утилита, которую я тестирую с несколькими другими людьми, которая делает снимки экрана другого окна, а затем использует OpenCV для поиска меньших изображений на этом снимке экрана.

Это работает без проблем, однако яЯ пытаюсь сделать его более эффективным, и мне было интересно, а не делать снимок экрана окна каждые X миллисекунд, если бы был способ, которым я мог бы «передать» экран в мое приложение, а затем запустить функцию для каждого нового кадра

Это мой текущий код:

    public static bool ContainsImage(Detection p_Detection, out long elapsed)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();

        Image<Gray, byte> imgHaystack = new Image<Gray, byte>(CaptureApplication(p_Detection.WindowTitle));
        Image<Gray, byte> imgNeedle = new Image<Gray, byte>(p_Detection.Needle);

        if (imgHaystack.Width >= p_Detection.Settings.Resolution || imgHaystack.Height >= p_Detection.Settings.Resolution)
        {
            imgHaystack = imgHaystack.Resize(imgHaystack.Width / p_Detection.Settings.Scale, imgHaystack.Height / p_Detection.Settings.Scale, Emgu.CV.CvEnum.Inter.Area);
            imgNeedle = imgNeedle.Resize(imgNeedle.Width / p_Detection.Settings.Scale, imgNeedle.Height / p_Detection.Settings.Scale, Emgu.CV.CvEnum.Inter.Area);
        }

        if (imgNeedle.Height < imgHaystack.Height && imgNeedle.Width < imgHaystack.Width)
        {
            using (Image<Gray, float> result = imgHaystack.MatchTemplate(imgNeedle, Emgu.CV.CvEnum.TemplateMatchingType.CcoeffNormed))
            {
                result.MinMax(out double[] minValues, out double[] maxValues, out Point[] minLocations, out Point[] maxLocations);

                if (maxValues[0] > p_Detection.Settings.MatchThreshold)
                {
                    stopWatch.Stop();
                    elapsed = stopWatch.ElapsedMilliseconds;

                    imgHaystack.Dispose();
                    imgNeedle.Dispose();
                    return true;
                }
            }
        }

        stopWatch.Stop();
        elapsed = stopWatch.ElapsedMilliseconds;

        imgHaystack.Dispose();
        imgNeedle.Dispose();
        return false;
    }

Я не совсем уверен, что это самый эффективный способ выполнить то, что я пытаюсь, любая помощь будетблестящий.

Спасибо.

1 Ответ

0 голосов
/ 08 июня 2018

Может быть, вы можете использовать Desktop Window Manager и DwmRegisterThumbnail?

Взгляните на следующий пример и посмотрите, может ли он работать на вас.

Этодействительно быстрый способ потоковой передачи изображения из другого окна, такой же, как изображение предварительного просмотра на панели задач.Не уверен, что это удобно для анализа изображений.

...