我想知道是否有一种快速算法可以检测在两个连续屏幕截图之间移动的部分。该算法应采用两个图像并在一个图像中输出一组(矩形)区域,以及一个描述匹配区域在另一个图像中的位置的矢量。
我想将其用于无流量视频压缩算法,该算法可以简化屏幕捕获。我认为这使得用例与运动检测的常规应用略有不同:
由于视频压缩管道还有其他步骤并且应该实时发生,因此运动检测应该很快。
有什么有用的吗?
答案 0 :(得分:2)
我有一些想法,你可以考虑一个可行的解决方案。
首先,考虑跟踪单个像素增量并发送/存储这些像素增量。典型的交互式会话通常涉及UI的非常小的部分变化;移动或调整大小的窗口对于长时间的计算机使用会话往往不太常见(传闻)。这样可以有效地捕获输入文本,光标移动和小UI更新等简单内容,而无需额外的工作。
您还可以考虑尝试将操作系统挂钩到较低级别,例如显示像素列表,或甚至(最佳地)“损坏”矩形列表。例如,Mac OS X的Quartz合成器可以为您提供此信息。这可以帮助您快速缩小要更新的内容,在理想情况下,可以为您提供有效的屏幕表示。
如果您可以查询操作系统(窗口管理器)有关窗口的信息,您可以为每个可见窗口存储单独的数据流(像素增量),然后应用简单的显示列表方法在回放期间“渲染”它们。然后,识别移动窗口是微不足道的,因为您可以简单地区分显示列表。
如果您可以查询操作系统有关光标位置的信息,您可以使用光标移动快速估算移动增量,因为光标移动通常与屏幕上的对象移动很相关(例如移动窗口,图标,拖动对象等)。 )。这样可以避免处理图像以确定移动增量。
对于一个可能的解决方案(或者如果你仍然无法用上面的方法识别运动增量),我们实际上可以很容易地处理单个移动矩形的(非常常见的)情况。制作帧中所有像素的掩码。识别掩码中最大的连接组件。如果它近似于一个矩形,那么您可以假设它代表一个移动的区域。窗口移动完全正交(例如完全在x或y方向),在这种情况下,总delta看起来像一个略大的矩形,或窗口对角移动,在这种情况下,总delta将具有8面形状。无论哪种方式,您都可以估计运动矢量,并通过区分区域来验证这一点。请注意,此处理会故意忽略您必须考虑的细节,例如在窗口附近独立移动的像素,或者看起来没有变化的区域(例如窗口中的大块纯色)。实际的实施必须处理上述所有问题。
最后,我将介绍有关实时运动估计的现有文献。在优化运动估计和补偿方面已经做了很多工作。视频编码,如果您发现上述方法不合适,您也可以使用该工作。
答案 1 :(得分:2)
Opencv涵盖了图像处理的深入,并提供了大量有关该主题的教程。
http://docs.opencv.org/doc/tutorials/tutorials.html
PDF比网站更多。 Google for ... opencv tutorials pdf ... top link。
主要网站。 http://opencv.willowgarage.com/wiki/
基本上有一些数学函数可以运行在为您工作的图像上。卷积等等。
答案 2 :(得分:2)
跨帧跟踪运动的常用方法是: 1.确定要在图像1中跟踪的点 2.将输入图像中的点与输出图像中的点相关联 3.确定让他们在那里的转变
对于第1步,有很多“跟踪器”,你可以在OpenCV中找到一些相当标准的“有趣”点(边缘交点,局部最大值等)。 Kanade-Tomasi图像跟踪器就是其中之一。但是,为了您的使用,您可能更愿意创建一个常规的点网格。
对于第2步,常见的技术是使用降低分辨率的四叉树......我的意思是拍摄您的图像,创建宽度和高度为1/2的新图像,并再次使用。现在你在顶部有一个非常低分辨率的图像,你可以更快地搜索数量级,并为你提供一个边界框来查看下一个更高的rez图像。在您的情况下,优化可能是首先查看输出以查看它是否完全更改,当您找到匹配的点x时,y也会在其旁边查找点x + 1或y + 1等。
对于第3步,这取决于你...如果你在谈论在屏幕上滑动的窗户,那么将会有大块的补丁一起移动,但在边缘外侧和内侧都是相同的。但是,如果有任何动画,那可能会让事情失去意义。而鼠标光标本身就是一个小东西,它会四处移动并降低算法效率。
答案 3 :(得分:1)
我实施了一种简单的技术,可以补偿大多数动作并且易于实现。
每帧被分成恒定大小的图块,例如8×8像素。编解码器管理可自定义数量的瓦片的环形缓冲区,例如2 20 。现在,对于编解码器在输入流中遇到的每个区块,它检查是否已经在环形缓冲区中找到它。如果是,它只是保存了tile索引,如果没有,它会将tile存储在ringbuffer中。
每当图像的一部分被过去的任何图像中的多个块大小移动时,很可能在高速缓存中找到切片。这样,人们可以补偿大多数动作。由于在环形缓冲区中找到一个磁贴非常快,因此速度足以实时运行。