【OpenCV-python&实现多进程两个摄像头同时录入视频并保存】
文前白话
最近做的一个项目需要用到两个摄像头同时读取视频录入本地,进行解帧处理,网上搜索的代码在自己的笔记本上不能稳定的录入两个摄像头的视频,几分钟就会报错中断(详见文末参考),经过调试实现了多进程同时录入视频,测试可以稳定的读取和保存两个摄像头读取到的视频。
(两个海康威视摄像头,亲测稳定分流无中断)并保存读取的视频到本地
提示:笔记本读取的摄像头网络IP地址需要自己调试好
代码实现
# 代码描述:利用多进程方法,利用两个海康威视摄像头,同时录取视频并保存本地
#
# 创建时间: 2020-09-26
# 创建人: Wupke
# 修改时间:
# 版本:
import cv2
import time
import multiprocessing as mp
# 抓取图片,确认视频流的读入
def image_put(q, name, pwd, ip, channel=101):
cap = cv2.VideoCapture("rtsp://%s:%s@%s//Streaming/Channels/%d" \
% (name, pwd, ip, channel))
# 获取视频帧率
fps = cap.get(cv2.CAP_PROP_FPS)
print('fps: ', fps)
if cap.isOpened():
print('HIKVISION1')
else:
cap = cv2.VideoCapture("rtsp://%s:%s@%s//Streaming/Channels/%d" \
% (name, pwd, ip, channel))
fps = cap.get(cv2.CAP_PROP_FPS)
print('fps: ', fps)
print('HIKVISION2')
while cap.isOpened():
# print('cap.read()[0]:', cap.read()[0])
ret, frame = cap.read()
print('ret:', ret)
frame = cv2.resize(frame, (1920, 1080))
# 抓取图片不成功再重新抓取
if not ret:
cap = cv2.VideoCapture("rtsp://%s:%s@%s//Streaming/Channels/%d" \
% (name, pwd, ip, channel))
print('HIKVISION2'
)
ret, frame = cap.read()
frame = cv2.resize(frame, (1920,1080))
q.put(frame)
# print('q.qsize():', q.qsize())
q.get() if q.qsize() > 1 else time.sleep(0.01)
# 获得视频流帧数图片,保存读入的视频
def image_get(q, window_name):
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 视频保存路径
path = "D:/test/" + window_name + ".avi"
out = cv2.VideoWriter(path, fourcc, 20.0, (1920, 1080), True)
while True:
frame = q.get()
out.write(frame)
cv2.imshow(window_name, frame)
cv2.waitKey(1)
# 解决进程问题
def run_multi_camera():
# user_name, user_pwd = "admin", "password"
user_name, user_pwd = "admin", "zhangxiang714"
# 摄像头的账户密码改成自己摄像头注册的信息
camera_ip_l = [
"192.168.1.67", # ipv4
"192.168.1.64",
# 把你的摄像头的地址放到这里,如果是ipv6,那么需要加一个中括号
]
mp.set_start_method(method='spawn') # init
queues = [mp.Queue(maxsize=2) for _ in camera_ip_l]
processes = []
for queue, camera_ip in zip(queues, camera_ip_l):
processes.append(mp.Process(target=image_put, args=(queue, user_name, user_pwd, camera_ip)))
processes.append(mp.Process(target=image_get, args=(queue, camera_ip)))
for process in processes:
process.daemon = True
process.start()
for process in processes:
process.join()
if __name__ == '__main__':
run_multi_camera() # 调用主函数
Refference
https://blog.csdn.net/ljx1400052550/article/details/106987943