在C++和Python之间共享视频数据
我有一个USB摄像头(uEye),它有一个C++接口,可以让我配置一些摄像头的功能。这个C++程序可以从摄像头读取图像数据,并把这些数据存储到预先分配好的内存里。所有这些操作都是在Windows系统下进行的。
使用Python和numpy让我可以轻松地处理图像,并花时间研究我的处理算法。
我想做的事情是:
- 用C++程序来配置摄像头并获取图像(以视频的速度),
- 把数据传递给Python,
- 在Python中处理这些数据。
我觉得我不想把C++嵌入到Python里,或者把Python嵌入到C++里,因为我更喜欢有两个独立的系统(这样我可以在不使用Python的情况下使用摄像头,或者在不使用摄像头的情况下使用Python)。
到目前为止,我找到的方法是通过管道、套接字或映射内存来共享一些数据,不过这些方法似乎只适合小量数据或字符串。我找不到的是,这样的方式是否足够快,以及我是否应该尝试去实现。如果我想这样做,是否可行呢?
如果这样做不太好,有没有更好的选择?是把Python代码嵌入到C++里,还是反过来?或者干脆放弃Python,因为在开发时间上的节省并不能抵消实现进程间通信所需的额外努力?
2 个回答
既然你提到这个设备有一个“C++接口”,我猜它提供了一个头文件和一个DLL文件,你可以通过这些来链接和控制设备,使用的是一种叫做API的方式。在这种情况下,最快的方法就是把这个API用Python封装起来(可以使用Swig或者其他C++转Python的工具)。这样做的好处是开销非常小,只需要几次程序调用,就能直接把数据作为内存指针传递。
如果你不想和Python“绑定”,也可以自己用C++写一个控制程序,但我觉得把API连接到Python的最快和最方便的方法就是上面提到的方式。
最近在PyPy的博客上有一篇关于实时视频处理的文章。在这个例子中,他们使用mplayer来抓取和显示视频,这可能比直接和你的C++程序对接要简单一些(前提是你的程序能和摄像头配合使用)。如果不行的话,可以考虑一个简单的解决办法,就是把你两个应用程序的输入输出连接起来。另外,看看PyPy在视频处理方面的应用也是个不错的主意。