OpenCV调用海康威视等摄像头(处理rtsp视频流)方法以及,出现内存溢出(error while decoding)或者高延迟问题解决

在这里插入图片描述

博客已搬家,欢迎访问新居:http://lukeyalvin.site,主要涉及SLAM相关方向,目前知识积累尚浅,多多指教!

摄像头与电脑的连接

首先,你需要获得hikvision摄像头的密码以及用户名(不知道的可以去打客服电话进行咨询),这里不做介绍;

其次,将电脑的ip设置与hikvision同频段,一般来说,海康威视的ip为192.168.1.64,电脑设置如下:
在这里插入图片描述

最后,使用IE浏览器(其他可能不支持),输入ip:192.168.1.64并登陆
在这里插入图片描述

输入用户名和密码即可获取视频画面(可以观察到,视频有畸变)
在这里插入图片描述

使用python+openCV获取监控画面

在使用openCV获取监控画面,具体代码如下

url格式为:“rtsp://用户名(一般默认admin):密码@网络IP(海康威视一般为:192.168.1.64)/Streaming/Channels/1”

import cv2

url = "rtsp://admin:*******@192.168.1.64/Streaming/Channels/1"
cap = cv2.VideoCapture(url)
ret, frame = cap.read()
while ret:
	# 读取视频帧
    ret, frame = cap.read()
	# 显示视频帧
    cv2.imshow("frame", frame)
	#等候1ms,播放下一帧,或者按q键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

#释放视频流
cap.release()
#关闭所有窗口
cv2.destroyAllWindows()

输出画面默认是1080P的高清画面,我们可以写一个resize方法,等比例缩为720P的画面,代码实现如下:

def img_resize(image):
    height, width = image.shape[0], image.shape[1]
    # 设置新的图片分辨率框架 640x369 1280×720 1920×1080
    width_new = 1280
    height_new = 720
    # 判断图片的长宽比率
    if width / height >= width_new / height_new:
        img_new = cv2.
### 如何使用 OpenCV (cv2) 连接和调用海康威视摄像头 要通过 OpenCV 的 `cv2.VideoCapture` 方法连接并调用海康威视摄像头,通常可以通过其支持的 RTSP 协议实现。以下是具体的方法: #### 1. 使用 RTSP 地址连接海康威视摄像头 对于海康威视设备,RTSP 是一种常见的协议用于传输视频流。可以按照以下格式构建 RTSP URL 并传递给 `cv2.VideoCapture()` 函数。 ```python import cv2 # 构建 RTSP URL rtsp_url = 'rtsp://username:password@camera_ip_address:554/Streaming/Channels/1' # 创建 VideoCapture 对象 cap = cv2.VideoCapture(rtsp_url) if not cap.isOpened(): print("无法打开摄像头") else: while True: ret, frame = cap.read() if not ret: break # 显示帧图像 cv2.imshow('Video Stream', frame) # 按下 q 键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 清理资源 cap.release() cv2.destroyAllWindows() ``` 上述代码中的 RTSP URL 需要替换为实际的用户名 (`username`)、密码 (`password`) 和 IP 地址 (`camera_ip_address`)。默认情况下,海康威视摄像机的端口号为 `554`[^2]。 --- #### 2. 解决可能遇到的问题 ##### a. **内存溢出或解码错误** 如果在读取视频流时出现诸如 “error while decoding或者其他类似的错误提示,则可能是由于硬件性能不足或者数据包丢失引起的。建议尝试调整缓冲区大小或降低分辨率设置[^3]。 ##### b. **高延迟现象** 当发现播放存在明显滞后情况时,可考虑启用 FFmpeg 支持优化传输效率;另外也可以采用多线程技术分别独立抓取每一路信号源从而减少相互干扰影响同步效果[^4]。 --- #### 3. 实现多路并发访问以提高效率 为了防止因单一线程操作而导致各通道间产生时间差进而造成显示错乱等问题发生,在项目开发过程中推荐引入 Python 中 threading 库来进行管理控制各个子任务之间的执行顺序关系如下所示例子展示了基本框架结构仅供参考学习之用: ```python from threading import Thread import cv2 class CameraStream(Thread): def __init__(self, url): super().__init__() self.cap = cv2.VideoCapture(url) def run(self): while True: ret, frame = self.cap.read() if ret: cv2.imshow(f'Camera {id}', frame) key = cv2.waitKey(1) if key == ord('q'): break urls = [ 'rtsp://admin:passw0rd@192.168.x.y:554/h264/ch1/main/av_stream', 'rtsp://admin:passw0rd@192.168.a.b:554/h264/ch2/sub/av_stream' ] threads = [] for idx,url in enumerate(urls): thread = CameraStream(url=url) threads.append(thread) thread.start() for t in threads: t.join() print("All cameras stopped.") ``` 此脚本会针对每一个指定路径启动单独进程负责采集对应位置上的动态影像资料直至用户主动终止程序运行为止。 ---
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lukey Alvin

谢谢鼓励!越努力越幸运!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值