请教各位 V 友一个问题,我正在使用海康威视摄像头,官方给了很全的代码范例,包括 C++、Java、C# 但是没有给出 Python 的,如果用 Python 中的 ctypes 库来调用官方的 DLL,写起来十分的复杂
目前的粗略想法
请问大家有合适的方案么?
注:
谢谢各位V友的方案,有用的回复均已经感谢,抱拳。
我来总结下吧,便于后来的读者
用 C++封装一个 C ABI 兼容的接口库
编写一个python的extension
cython、swig、pybind11、cffi、boost.python
网络通信
大大扩大的眼界,很多知识以前都没有听说过,:)
![]() | 1 CSM 2019-05-14 21:28:04 +08:00 via Android ![]() Python 起一个 HTTP 服务器,C++每得到一个图片就 post 过去?(我猜的) |
2 bsidb 2019-05-14 21:33:42 +08:00 ![]() gRPC |
![]() | 3 Leigg 2019-05-14 21:35:17 +08:00 via iPhone ![]() 你是想在内存中直接将图片流传给 python 吧 C++是可以调用 python 函数的,你找一下相关资料吧 这里有一个不是很详细但肯定需要折腾会儿 https://mp.weixin.qq.com/s/VFYrFB63BKd-W3yaJqE2NQ 不如 1 楼那样开发快。 |
4 hakono 2019-05-14 21:42:18 +08:00 via iPhone ![]() 相信我别尝试 python 调 dll 或者 c 调用 python 到时候这种跨语言调用,调试起来告诉你什么叫地狱。。。。 乖乖用通用的网络协议传就好了。c 艹建个服务器 python 获取,或者 1 楼那样 python 建个服务器 c 往里传数据 如果是楼上说的直接往内存里写数据,其实也能做到。Windows 的话看一下进程之间的 共享内存 怎么搞就知道了 |
![]() | 5 catror 2019-05-14 21:45:52 +08:00 via Android ![]() webrtc 吧,C++进程跑服务端,Python 进程跑客户端。定义好交互协议,客户端可以控制服务端,同时服务端有数据可以实时推送给客户端处理。 |
![]() | 6 goreliu 2019-05-14 21:46:04 +08:00 via iPhone ![]() 摄像头是通用设备,用 Python 应该可以直接处理,找找相关的库,不用局限于官方。 |
![]() | 7 nooper 2019-05-14 21:58:41 +08:00 外包给我,cython 搞定,可以结合 opencv 等 |
![]() | 8 justou 2019-05-14 22:04:20 +08:00 ![]() 用过大华相机的 sdk 跟 Sapera LT sdk, 如果机制都差不多的话, 都是通过一个回调函数获取图像, 这样的话不如在 cython 中直接使用其 sdk 的函数, 然后传给 python 处理就很容易了. |
10 GeruzoniAnsasu 2019-05-14 22:09:40 +08:00 via Android ![]() 用 c++实现一个 python module 要比在 python 里用 ctypes 跨语言调用好得多 把要用的接口封装一下给 python 层就 ok 了 |
![]() | 13 ![]() 方法 1:用 C++封装一个 C ABI 兼容的接口库,然后用 CDLL 调用 方法 2:写一个 CPython 的 extension,这方面登峰造极的是 OpenCV,它的 wrapper c++代码甚至是用 python 代码生成出来的 |
![]() | 16 wisefree OP @GeruzoniAnsasu @qieqie 我也考虑过封装,但是有一个问题,C++返回的数据并不是整数、字符串等类型,而是 Opencv 中的 Mat 对象,这个返回类型,用 Python 如何将接收呢? |
![]() | 18 qieqie 2019-05-14 22:21:24 +08:00 ![]() @wisefree 只返回基本类型,拿 OpenCV 来说,你把图片 encode 成某种格式,比如 jpeg png 然后传 byte 数组就行了 |
19 husterqq 2019-05-14 22:40:56 +08:00 ![]() pybind |
![]() | 22 xiaoyaocmx 2019-05-14 23:09:36 +08:00 ![]() 我也遇到过这个问题,考虑过 pybind11,然后用了 zeromq |
![]() | 23 wisefree OP @xiaoyaocmx 这今天也搜到了 zeromq 这个解决方案,你用了 protobuf 了么? |
![]() | 24 goreliu 2019-05-14 23:17:27 +08:00 via iPhone ![]() |
25 dfjslkjdf 2019-05-14 23:28:02 +08:00 ![]() |
26 sepelf 2019-05-15 07:00:22 +08:00 via iPhone ![]() thrift 了解下 |
![]() | 27 wisefree OP @goreliu 简单的用 ctypes 封装,写起来很方便,复杂的回调函数、结构体指针什么的,用 ctypes 容易了。swig,这个方案倒是可以考虑下 |
![]() | 30 binux 2019-05-15 08:50:21 +08:00 ![]() 根据我古老的记忆,ctypes 调不了 C++ 吧,你的封装一次吧 |
![]() | 31 thfurior 2019-05-15 09:05:59 +08:00 ![]() ls+1,ctypes 调不了 c++,只能调 c 封装成的 dll/so,我以前搞过用 boost python 封装 c++的 python 库,使用非常方便,楼主不妨试试 |
![]() | 32 Moker 2019-05-15 09:35:26 +08:00 ![]() 进程通信上共享内存吧 或者把 go 当成粘合剂试下? |
![]() | 33 sujin190 2019-05-15 09:51:31 +08:00 ![]() cython 之前用过,似乎无法完全自动解析 struct 或是 class 提供的指针,不过标准类型比如 char 的支持还是不错的,建议可以写一个 c 文件返回 char 字节流,然后在 python 中导入调用这个函数接收字节流,再用 cython 把 python 文件编译成扩展就行了,性能也不错的,不过我觉得写一个 python 扩展也不难啊 |
![]() | 34 geelaw 2019-05-15 09:59:58 +08:00 via iPhone ![]() 也并不非要用网络协议,命名管道就可以。 |
![]() | 35 Yoock 2019-05-15 10:03:43 +08:00 via iPhone ![]() IPC |
![]() | 36 dinjufen 2019-05-15 10:07:06 +08:00 ![]() 卧槽,这个我刚做过。我用的 boost/python 库,参见:http://www.pianshen.com/article/5251280159/,在 C++部分将海康摄像头图片转为 Python 直接可用的 PyObject,Python 那边用 opencv-python 直接可用,很方便,就是配置麻烦。不过你说的实时是要延迟多低?我做的延迟 70ms 左右 |
![]() | 38 ipwx 2019-05-15 10:36:22 +08:00 ![]() 图片用 mmap 或者别的 shared memory 手段直接共享内存,然后依靠 socket/named mutex & inter-process queue 之类的进行协调,这个方案怎么样? |
39 Arnie97 2019-05-15 10:45:01 +08:00 via Android ![]() 网络协议当然可以,除此之外可以看看这几种比选方案 https://github.com/tleonhardt/Python_Interface_Cpp |
![]() | 40 zhongchengyong 2019-05-15 1:57:08 +08:00 ![]() 提供一些新思路:之前使用 Python 调用 C/C++用的是 swig,也看到有使用 CFFI 的。 |
![]() | 41 BingoXuan 2019-05-15 11:03:49 +08:00 via Android ![]() 我一般选择 zmq,默认可以传输 json 数据,写一个 jsonrpc 也是很快 |
![]() | 47 wisefree OP @zhongchengyong thanks |
![]() | 49 xiaoyaocmx 2019-05-15 13:15:30 +08:00 via Android ![]() @wisefree 没有诶 |
![]() | 50 wisefree OP @xiaoyaocmx 请问有 zmq 的学习资料推荐么? |
![]() | 51 est 2019-05-15 13:48:30 +08:00 ![]() > 使用海康威视摄像头,官方给了很全的代码范例,包括 C++、Java、C# 好奇这些语言最后也是通过网络协议和摄像头通信的吧?应该有人 hack 出来 py 版本的了。 |
![]() | 52 guiqiqi 2019-05-15 14:10:25 +08:00 via iPhone ![]() 楼主可以考虑用 Boost::Python 封装接口,工作量不很大,我最近的项目涉及到性能敏感的部分正在用 C++剥离,就用的这个方案 |
53 Raymon111111 2019-05-15 14:12:37 +08:00 ![]() 老老实实用 RPC 框架 比如 gRPC |
54 JerryV2 2019-05-15 15:11:52 +08:00 ![]() |
![]() | 55 YouXia 2019-05-15 15:13:26 +08:00 ![]() 管道、消息队列、信号量、共享内存等等,进程间通信方式那么多。。 |
![]() | 58 wisefree OP @Raymon111111 嗯嗯,正在找资料学习了解,请问有推荐的资料么? |
![]() | 61 zhuangzhuang1988 2019-05-15 16:50:59 +08:00 ![]() |
![]() | 62 RealMadrid 2019-05-15 17:15:22 +08:00 ![]() 可以试下用 c++写相机库,再用 swig 转换为 python 调用的库 |
![]() | 63 ysc3839 2019-05-15 19:10:50 +08:00 via Android ![]() 建议使用 pybind11 而不是 boost.python,前者更加容易配置编译。 |
![]() | 64 wisefree OP @zhuangzhuang1988 @ysc3839 谢谢,:) |
![]() | 65 wisefree OP @RealMadrid 谢谢提供思路 |
![]() | 66 helloworld000 2019-05-16 05:01:57 +08:00 ![]() 之前做过一个 protobuf + opencv + zeromq,这是 microservice 的思路,其实更符合互联网公司主流。 pybind11 这种弄成 library 给别人用也不是不可以,学院风更重一点 都不难 |
![]() | 67 wisefree OP @helloworld000 很 nice !谢谢啦 |
68 gaoyadianta 2019-05-16 13:01:05 +08:00 ![]() 你用的什么 rtps 实现方案,你列出来的方案中,哪个能有 rtps 快? 最便捷的:IPC (要速度快用共享内存) 其次 fast rtps ( 16k 字节延时在 u 级) 再次之才是什么网络通信,什么 rpc |
69 gaoyadianta 2019-05-16 13:02:25 +08:00 ![]() 对了 fastrtps 没有 python 实现,,,尴尬 序列化+共享内存爽的一批 |
![]() | 70 wisefree OP @gaoyadianta 海康威视官方的 rtps 网址,用 rtps 自带延时 3s 左右 |