我有一些想法,以及您可以考虑的可能可行的解决方案。
首先,考虑跟踪单个像素增量并仅传输/存储这些增量。一个典型的交互会话通常只涉及很小部分的 UI 更改;对于长时间使用计算机的会话,移动或调整窗口大小往往不太常见(有趣的是)。这可以有效地捕获简单的内容,例如输入的文本、光标移动和小的 UI 更新,而无需大量额外工作。
您还可以考虑尝试在较低级别挂钩操作系统,以获取例如像素的显示列表,甚至(最佳)“损坏”矩形列表。例如,Mac OS X 的 Quartz 合成器可以为您提供这些信息。这可以帮助您快速缩小要更新的范围,并且在理想情况下,可以为您提供屏幕本身的有效表示。
如果您可以查询有关窗口的操作系统(窗口管理器)信息,则可以为每个可见窗口存储单独的数据流(像素增量),然后在播放期间应用简单的显示列表方法来“渲染”它们。然后,识别移动窗口很简单,因为您可以简单地区分显示列表。
如果您可以查询操作系统关于光标位置的信息,您可以使用光标移动来快速估计移动增量,因为光标移动通常与屏幕上的对象移动(例如移动窗口、图标、拖动对象等)有很好的相关性。这使您可以避免处理图像以确定移动增量。
一个可能的解决方案(或者如果您仍然无法通过上述方法识别移动增量的最后手段):我们实际上可以相当容易地处理单个移动矩形的(非常常见的)情况。制作帧中所有变化的像素的蒙版。识别掩码中最大的连通分量。如果它近似于一个矩形,那么您可以假设它代表一个移动的区域。窗口移动完全正交(例如完全在 x 或 y 方向),在这种情况下,总增量看起来像一个稍大的矩形,或者窗口沿对角线移动,在这种情况下,总增量将有一个 8 边形状。无论哪种方式,您都可以估计运动矢量,并通过区分区域来验证这一点。请注意,这种处理会故意忽略您必须考虑的细节,例如 像素在窗口附近独立移动,或看起来没有变化的区域(例如窗口中的大块纯色)。实际的实现必须处理上述所有问题。
最后,我将研究有关实时运动估计的现有文献。在优化运动估计和补偿(例如视频编码)方面已经做了很多工作,因此如果您发现上述方法不合适,您也可以使用这些工作。