在 C++ 和 Python 之间共享视频数据
Posted
技术标签:
【中文标题】在 C++ 和 Python 之间共享视频数据【英文标题】:Share video data between C++ and Python 【发布时间】:2011-07-29 10:08:36 【问题描述】:我有一个 USB 摄像头 (uEye),它有一个 C++ 接口,允许您配置摄像头的一些功能。 C++ 程序可以从相机读取图像数据并将其存储在预先分配的内存中的某个位置。所有这些都在 Windows 下运行。
带有 numpy 的 Python 为我提供了一个简单的环境来处理图像并花一些时间处理我的处理算法。
我想做的是:
-
使用c++程序配置摄像头并获取图像(以视频速率),
将数据传递给 Python
在 Python 中处理数据
我的印象是我不想在 Python 中嵌入 C++ 或在 C++ 中嵌入 Python,因为我更喜欢有两个独立的系统(所以我可以在没有 Python 的情况下使用相机,或者使用 Python 的东西没有相机)。
到目前为止,我可以找到使用管道、套接字或映射内存共享一些数据的方法,尽管它似乎仅限于少量数据或字符串。但是,我找不到的是这是否足够快以及我应该尝试实施的指示。我应该这样做吗?
如果这是一个坏主意,还有什么更好的选择?在 C++ 中嵌入 Python 代码,反之亦然?或者完全放弃 Python,因为节省的开发时间并不能抵消让进程间通信正常工作的额外努力?
【问题讨论】:
上次我用 Python(用 numpy)实现图形算法太慢了,我不得不把它翻译成 C++。速度提高了大约 x20。所以如果你想实时做,也许你应该重新考虑。 我明白你的意思。也许瓶颈在于 python 中的处理,并且使用文件作为传输介质的速度足以跟上 Python 处理可达到的帧速率。然后,当确定了所需的处理步骤(并且我用 matplotlib 制作了一些彩色图)时,我们可以考虑将所有内容移至 c++。我只是希望我可以跳过从磁盘写入/读取文件并从内存中执行相同操作。 【参考方案1】:PyPy 博客上有一个关于实时视频处理的 recent post。在示例中,他们使用 mplayer 来抓取和显示视频,这可能比尝试与您的 C++ 程序交互(假设它与您的网络摄像头一起使用)更可取。如果不是,那么按照这些思路思考一个简单的解决方案就是连接两个应用程序的标准输出/标准输入。将 PyPy 用于视频处理也可能是一个好主意。
【讨论】:
谢谢。假设我需要控制相机的板载参数,因此 mplayer 不是一个选项。关于标准输入/标准输出,这是否适用于二进制格式,还是我需要将图像数据转换为文本并返回?传输率不是一个可能的问题? 您可以通过管道传输二进制数据,传输速率应该不是问题。【参考方案2】:既然您说设备具有“C++ 接口”,我假设它提供了一个头文件 + DLL,您可以通过 API 链接和控制设备。在这种情况下,最快的方法是将此 API 包装在 Python 中(使用 Swig 或其他 C++ 到 Python API 工具)。这将提供非常低的开销,只需几个过程调用,直接将数据作为指向内存的指针传递。
如果你不想“嫁给”Python,也可以用 C++ 编写一个控制应用程序,但我认为将 API 连接到 Python 的最快和最方便的方法是上面的。
【讨论】:
C++ 中的控制应用程序已经存在。尽管如此,当我因为某些库不想一起玩(可能是由用于库和包装的不同编译器引起的?因此,我认为使用两个现有的工作系统(在 c++ 和 python 中)并让它们一起玩可能会更容易,而不是包装。以上是关于在 C++ 和 Python 之间共享视频数据的主要内容,如果未能解决你的问题,请参考以下文章
通过 Boost Python 在 C++ 对象之间传递共享指针的 Segfault
如何使用共享内存在 cpp 和 python 之间共享 cv::Mat 以进行处理