请教 C++ Python 进程间通信

2019-05-14 21:23:03 +08:00
 wisefree

请教各位 V 友一个问题,我正在使用海康威视摄像头,官方给了很全的代码范例,包括 C++、Java、C# 但是没有给出 Python 的,如果用 Python 中的 ctypes 库来调用官方的 DLL,写起来十分的复杂

目前的粗略想法

  1. 用 C++来获取实时的图片
  2. 将获取的图片,交给 Python 来处理

请问大家有合适的方案么?

注:

8419 次点击
所在节点    C
70 条回复
CSM
2019-05-14 21:28:04 +08:00
Python 起一个 HTTP 服务器,C++每得到一个图片就 post 过去?(我猜的)
bsidb
2019-05-14 21:33:42 +08:00
gRPC
Leigg
2019-05-14 21:35:17 +08:00
你是想在内存中直接将图片流传给 python 吧
C++是可以调用 python 函数的,你找一下相关资料吧
这里有一个不是很详细但肯定需要折腾会儿
https://mp.weixin.qq.com/s/VFYrFB63BKd-W3yaJqE2NQ
不如 1 楼那样开发快。
hakono
2019-05-14 21:42:18 +08:00
相信我别尝试 python 调 dll 或者 c 调用 python
到时候这种跨语言调用,调试起来告诉你什么叫地狱。。。。

乖乖用通用的网络协议传就好了。c 艹建个服务器 python 获取,或者 1 楼那样 python 建个服务器 c 往里传数据

如果是楼上说的直接往内存里写数据,其实也能做到。Windows 的话看一下进程之间的 共享内存 怎么搞就知道了
catror
2019-05-14 21:45:52 +08:00
webrtc 吧,C++进程跑服务端,Python 进程跑客户端。定义好交互协议,客户端可以控制服务端,同时服务端有数据可以实时推送给客户端处理。
goreliu
2019-05-14 21:46:04 +08:00
摄像头是通用设备,用 Python 应该可以直接处理,找找相关的库,不用局限于官方。
nooper
2019-05-14 21:58:41 +08:00
外包给我,cython 搞定,可以结合 opencv 等
justou
2019-05-14 22:04:20 +08:00
用过大华相机的 sdk 跟 Sapera LT sdk, 如果机制都差不多的话, 都是通过一个回调函数获取图像, 这样的话不如在 cython 中直接使用其 sdk 的函数, 然后传给 python 处理就很容易了.
wisefree
2019-05-14 22:09:22 +08:00
@CSM 不管是不是猜的,先感谢一波
GeruzoniAnsasu
2019-05-14 22:09:40 +08:00
用 c++实现一个 python module 要比在 python 里用 ctypes 跨语言调用好得多

把要用的接口封装一下给 python 层就 ok 了
wisefree
2019-05-14 22:09:43 +08:00
@bsidb 谢啦,我去看看这方面的资料
wisefree
2019-05-14 22:11:13 +08:00
@hakono 感谢!:),不想下地狱,我会好好看看通用网络协议这个方案的
qieqie
2019-05-14 22:11:37 +08:00
方法 1:用 C++封装一个 C ABI 兼容的接口库,然后用 CDLL 调用
方法 2:写一个 CPython 的 extension,这方面登峰造极的是 OpenCV,它的 wrapper c++代码甚至是用 python 代码生成出来的
wisefree
2019-05-14 22:12:01 +08:00
@goreliu 海康好像不行,调用 sdk,获得的图像才是实时的
wisefree
2019-05-14 22:13:09 +08:00
@catror 学到了,我去看看哈,好像都是推荐用网络协议,感谢!
wisefree
2019-05-14 22:16:09 +08:00
@GeruzoniAnsasu @qieqie 我也考虑过封装,但是有一个问题,C++返回的数据并不是整数、字符串等类型,而是 Opencv 中的 Mat 对象,这个返回类型,用 Python 如何将接收呢?
wisefree
2019-05-14 22:20:40 +08:00
@justou 还没有了解过 cython,涨知识了,我去 google 下基本用法,感谢!
qieqie
2019-05-14 22:21:24 +08:00
@wisefree 只返回基本类型,拿 OpenCV 来说,你把图片 encode 成某种格式,比如 jpeg png 然后传 byte 数组就行了
husterqq
2019-05-14 22:40:56 +08:00
pybind
wisefree
2019-05-14 22:58:11 +08:00
@qieqie 大致明白了,谢谢给出的思路

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/564162

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX