GCaptainNemo / RTSP-camera-display-realtime

Grab Hikvision network camera and display it in pyqt control in real time.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

RTSP网络相机实时显示

一、介绍

  • 平台 Ubuntu / windows

  • 依赖 opencv-python, PyQt5

需要对海康网络相机(rtsp协议)1080P相机拉流,低延迟地显示在QT客户端界面中,尝试了如下三种方案:

1.1、基于ROS节点通信(延迟高)

由于python3中CVBRIDGE使用具有问题,因此使用额外的ROS转换节进行数据格式sensor_msgs::Image到自定义msg格式转换[1],再在客户端进行自定义msg格式解码,显示在客户端中。该方法信息经过若干节点传递,延迟较高。

1.2、单线程cv2.VideoCapture(延迟高)

使用timer作为触发信号,利用QT的信号-槽机制让控件更新图像。可以通过控制timer触发信号发送与否,随时开始,停止接收视频流,该方法对传输像素较小的视频流延迟较小,但对1080P图像仍延迟较高。

1.3、多线程cv2.VideoCapture(基本满足实时需求)

线程A从通过RTSP协议从视频流中读取出每一帧,并放入队列中,线程B从队列中将图片取出,处理后进行显示[2]。线程A如果发现队列里有两张图片(证明线程B的读取速度跟不上线程A),那么线程A主动将队列里面的旧图片删掉,换上新图片,通过多线程的方法:

  1. 线程A的读取速度始终不收线程B的影响,防止网络摄像头的缓存区爆满
  2. 线程A更新了队列中的图片,使线程B始终读取到最新的画面,降低了延迟

备注:目前没找到让python线程停止(挂起)、再启动方法<[3]线程只能调用start函数一次。采取先kill掉线程,再构造新的线程对象重新start来实现拉流停止、重启的效果。

二、demo

  • 单线程(1.2)

./single_thread.py

  • 多线程(1.3)

./multi_thread.py

三、效果

多线程方法显示延迟

四、参考资料

[1] 用自定义数据类型解决cv_bridge问题

[2] 多线程RTSP网络相机实时显示

[3] python threading中的thread开始和停止

About

Grab Hikvision network camera and display it in pyqt control in real time.


Languages

Language:Python 100.0%