2017-06-12 70 views
0

我有这个需求:我想复制视频图像的选定部分(它们是来自飞行模拟器的仪表或其他仪器)并将它们复制到小型LCD显示器上。每个液晶显示器必须物理复制一台仪器,从而从源图像中选择一个区域。 我打算使用python,但也可能使用其他语言。但是我对图形没有任何经验,我不知道如何从视频板内存中读取原始图像。很多年前,使用EGA和VGA卡时,即使我从未有过这种需求,也很容易。现在我读到了Windows锁定了任何直接访问视频内存的尝试。这是真的吗?如果是的话,该怎么做? 我打算使用集成视频板。 感谢您的关注视频内存拷贝

+0

你提到的Windows ...你可以使用winapi直接在内存中以位图的形式呈现屏幕内容。在OpenGL中,存在旧的'glReadPixels'或者使用'FBO'或者渲染位图,但是这涉及到篡改渲染代码,如果你可以或不可以做到则渲染代码不清楚。您没有指定视频源(图像/视频文件,来自某些第三方App,IPC,LAN的真实视频源?)您没有指定平台(gfx访问与平台紧密相关) – Spektre

+0

您是对的。来源是一个飞行模拟器,这样图像就像一个视频。操作系统取决于用户,我将从我自己的应用程序开始,即Win10。目的是将选定的飞行模拟部分(即乐器)转移到许多不同的设备上,每一个设备都由一个小触摸屏和一个像Arduino或Raspberry这样的电路板组成。该板将在LCD上显示所选仪器的部分(想象一下指南针或雷达),触摸部分将用于向仪器发送仪器相关命令。 – Salrandazzo

+0

因此,我认为你不能篡改应用程序代码...使用winapi ...获取应用程序的句柄(或整个桌面),并在一段时间内将画布内容复制到应用程序中...对于乐器,不需要这样做与太大的FPS ...看到[获取运行OpenGL的子窗口的截图(Windows)](https://stackoverflow.com/a/18107834/2521214) – Spektre

回答

0

根据您的整体解决方案,您可能更容易将整个视频发送到每个小屏幕,并简单地缩放/裁剪回放以仅显示所需的部分。

这在带宽方面效率较低(可能 - 取决于如何压缩您提取的任何视频),但避免了必须执行任何处理器和电池耗尽的复杂视频操作。

如果你的系统是基于Android可以使用TextureView的setTransform做到这一点:https://developer.android.com/reference/android/view/TextureView.html#setTransform(android.graphics.Matrix)

在HTML5中,你可以使用CSS和视频实现了类似的事情变换:https://www.w3schools.com/cssref/css3_pr_transform.asp

+0

感谢您的回答。目标系统将是一个简单的液晶显示器加上一个Arduino或树莓板,没有电池问题。带宽可能是一个问题。但我会考虑你的建议,再次感谢。 – Salrandazzo

+0

遵循您的建议,我可以将整个模拟图像(视频)流式传输,并且每个远程设备都可以抓住它的一部分,与仪器显示相关的部分。我可以在发送端使用python + OpenCV。并且仍然不知道接收端是什么,取决于设备(Arduino或Raspberry)。 – Salrandazzo