替代快速截取窗口的屏幕截图

Posted

技术标签:

【中文标题】替代快速截取窗口的屏幕截图【英文标题】:Alternative to taking rapid screenshots of a window 【发布时间】:2018-11-13 03:39:17 【问题描述】:

我正在与其他几个人一起测试一个实用程序,它会截取另一个窗口的屏幕截图,然后使用 OpenCV 在该屏幕截图中查找较小的图像。

这没有问题,但是,我正在努力提高效率,并且想知道,如果有一种方法可以将屏幕“流式传输”到我的应用程序,然后针对通过的每个新帧运行一个函数。

这是我当前的代码:

    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】:

也许你可以使用Desktop Window ManagerDwmRegisterThumbnail

看看下面的example,看看它是否适合你。

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

【讨论】:

以上是关于替代快速截取窗口的屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

当程序成为前台窗口时,我的代码会截取程序的屏幕截图。屏幕截图的时间出现了一个小问题

即使窗口重叠,如何在 Qt(Python、Linux)中截取特定窗口的屏幕截图?

让 powershell 进入 ie 类,并在 ui 测试期间截取 ie 窗口的屏幕截图

我如何同时传递 x 和 y 轴以及屏幕的高度和宽度以快速以编程方式截取屏幕截图

在 QML 中截取特定项目的屏幕截图的方法是啥?

弹出窗口的屏幕截图不清晰