使用 Python 对相机画面二次开发遇到的问题

2023-12-19 09:58:46 +08:00
 GoworkShisi

小弟我实现了一个基于 opencv 通过对画面帧判断进行特定画面筛选的一个算法,之前是通过 opencv 读取视频实现的,现在需要在获取到相机流后实时判断。问题是:

  1. 相机画面通过大华的 sdk 手册能够加载到指定控件上被预览,但是应该怎么获取视频帧呢? 通过 sdk 抓图是可以获取到,但是抓图的函数手册中说是最快 1s 调用一次,最好 3s 调用一次。这个时间太久了,测试算法时是按照视频 25 帧/秒获取的。

  2. 通过 opencv 的 cap 能够获取到 rtsp 流的帧,但是 rtsp 流较 sdk 的流慢了 3-4s ,没发满足现场实时性的要求

各位有没有什么好建议

1492 次点击
所在节点    Python
11 条回复
LLaMA2
2023-12-19 10:03:22 +08:00
列出你所有的设备,你是如何使用大华摄像头的。方便大家给你参考
GoworkShisi
2023-12-19 10:12:45 +08:00
@ye4tar 开发平台是 Windows ,相机设备就是普通的大华摄像头,使用参考大华官网下载的 NetSDK_Python 编程指导手册_V1.0.2 (不知道为啥图片上传不上来)😂
tangtang369
2023-12-19 10:34:20 +08:00
直接用 rtsp 流就行 慢 3-4s 你就没有考虑过是你的算法太耗时了吗
以一秒 25 帧的摄像头来算,每帧出来的间隔是 40ms ,你这种阻塞的算法最好不要超过 20ms ,实在不行就抽帧吧
paopjian
2023-12-19 10:57:14 +08:00
感觉是你用的摄像头接口不对,没有 USB 啥的直连摄像头吗,用 SDK 就是走的网络推流传输了吧
GoworkShisi
2023-12-19 11:26:10 +08:00
@tangtang369 倒不是算法慢,相机回传的画面就是这样延迟的因为相机本身对流的编码解码导致的延迟,sdk 快是因为编解码是在电脑上用 sdk 内置算法实现的所以没有这个延迟。 我的算法肯定是用另外的线程去写的。
GoworkShisi
2023-12-19 11:30:48 +08:00
@paopjian 现场设备就是用这种网络型摄像头的物理客观条件就是这样,sdk 能够看到画面,python 的话是将控件句柄传给 sdk 内置函数,应该是在这个控件上建了一个播放窗口来放实时的流画面。C++代码这一步是要我们自己实现的,所以能获取到每帧的回调数据,但是 python 拿不到这个
LLaMA2
2023-12-19 11:48:55 +08:00
简化一下。
你确认下你的 opencv 的画面筛选的一个算法,几乎可以确认的是它会接受 RGB 的数据用作后续算法的工作。

那么只要在渲染的时候拿到 canvas 的 RGB 数据传给算法就可以了。

不用在意摄像头怎么工作的,只要能拿到摄像头的 RGB 画面数据即可。
GoworkShisi
2023-12-19 13:22:12 +08:00
@ye4tar #7 是这样的,问题是大华给的 python demo ,它实时显示的方式是你向他的 sdk 提供的函数中输入句柄(比如如果是 python-opencv 的话就是 QLabel 的句柄),我尝试了在画面播放时获取这个控件上的颜色,还是只有一片空白。我猜测它的实现方式是在 sdk 中将画面生成到了一个新的控件上,然后将控件缩放到我们提供的 QLabel 大小和位置一样的地方覆盖到这个控件上而不是用 QPainter 在这个控件上面绘制帧,所以没发得到这个 RGB 数据
ktyang
2023-12-19 19:04:25 +08:00
我印象中设置关键帧会有帮助,但是这个延迟我之前是做不到完全消除的。。。只能说好转。。。另外,顺便请教一下大佬们,我有个 usb 摄像头,用相机测试软件就 4k30hz 完全没问题,但是用 opencv 去读,4k 就只有 5hz ,win 、linux 下都是这也,有没有知道怎么解决的呀
matchalatte
2023-12-19 22:29:17 +08:00
没有了解过大华的 SDK 形式,不过我查到一个帖子,不知道有没有帮助?
[知乎] 读取多个(海康\大华)网络摄像头的视频流 (使用 opencv-python),解决实时读取延迟问题
https://zhuanlan.zhihu.com/p/38136322
darcyC
2023-12-20 23:08:30 +08:00
建议你再仔细看看它的 demo ,你的问题显然在获得流上,而不是后续的 opencv 处理。
你提到了这是一个 Python 的 demo ,并且你说到所谓的控件( QLabel ),我又简单看了下你提到的 Demo 仓库,我没有仔细看,但是可以给你一点线索哦,对于这种 Qt 的项目,为了显示出一个图片如果用的是 QLabel ,它是把图片通过 QLabel 显示的,对应的图片保存在 QLabel 下的 pixmap ,类是 QPixmap ,你可以 Ctrl+F 关键字去搜下你所在的 demo 代码里类似的字样,为了在窗口中显示出图片,它一定会经过 QPixmap 。希望对你有启发。同时,我想对你的提问作一定优化,虽然说你提到了你在 Python 中二次开发,但你提到了控件,那你一定要多提一句你所在的框架。尽量避免 X-Y 问题。

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

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

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

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

© 2021 V2EX