可以选择快速截取窗口

时间:2018-06-03 18:45:22

标签: c# winforms emgucv

我有一个实用程序,我正在和其他一些人一起测试,它会截取另一个窗口的截图,然后使用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 :(得分:5)

也许您可以使用Desktop Window ManagerDwmRegisterThumbnail

请查看以下example,看看它是否适合您。

这是一种非常快速的流式传输另一个窗口图像的方式,就像任务栏中的预览图像一样。但不确定它对于图像分析是否可行。