1 方法
想要调取摄像头画面有这么几个前提:
- 需要使用网络摄像头并且支持RTSP协议
- 摄像头要和你的电脑在同一个局域网下
- 需要知道摄像头的账号、密码、IP地址
RTSP协议是一种网络传输协议,不同的摄像头厂商可能都有各自的协议格式,但无论是哪种格式都一定会需要摄像头的账号、密码、IP地址
厂家 |
RTSP协议格式 |
海康威视老版本(2015) |
rtsp://用户名:密码@IP地址/h264/ch通道/main/av_stream |
海康威视新版本 |
rtsp://用户名:密码@IP地址//Streaming/Channels/通道 |
大华 |
rtsp://用户名:密码@IP地址/cam/realmonitor?channel=通道 &subtype=0 |
宇视 |
rtsp://用户名:密码@IP地址/video1 |
流程:
- 导入opencv库,需要注意的是导入的时候名字要写 import cv2
- 执行 cap = cv2.VideoCapture(RTSP协议) 连接指定的摄像头
- 执行 cap.isOpened() 判断摄像头是否连接成功,如果返回True则代表连接成功可以继续操作,如果返回False则代表连接失败,一般是因为RTSP协议有问题,可能是不同产家的摄像头协议不同或者输入的摄像头数据有误
- 如果想要截图则执行 cv2.imwrite(截图名字, cap.read()[1])
- 如果要实时显示画面则要先执行 cv2.namedWindow(窗口名字, flags=cv2.WINDOW_FREERATIO) 创建一个显示画面的窗口,然后执行 ***cv2.imshow(窗口名字, cap.read()[1])***显示实时画面
2 演示代码
import datetime
import os.path as osp
import multiprocessing as mp
import os
import cv2
def main():
# 摄像头信息
cameraInfs = [
{'user': "admin", 'pwd': "admin", 'ip': "192.168.1.63"},
{'user': "admin", 'pwd': "admin", 'ip': "192.168.1.62"},
{'user': "admin", 'pwd': "admin", 'ip': "192.168.1.65"},
{'user': "admin", 'pwd': "admin", 'ip': "192.168.1.64"},
]
processes = [] # 子进程列表
savePath = "./ImageDatas/" # 截图保存位置
num = 0 # 摄像头窗口名字
if not osp.exists(savePath): # 创建截取的摄像头图片的临时保存文件夹
os.makedirs(savePath)
# 创建子进程分别处理每一个摄像头
for cameraInf in cameraInfs:
processes.append(mp.Process(target=get_image,
args=(savePath, cameraInf['user'], cameraInf['pwd'],
cameraInf['ip'], num)))
num += 1
for process in processes:
process.daemon = True
process.start()
for process in processes:
process.join()
# 连接并获取摄像头数据
def get_image(savePath, user, pwd, ip, channel=1, window_name):
try:
# 海康威视打开摄像头
cap = cv2.VideoCapture("rtsp://%s:%s@%s//Streaming/Channels/%d" % (user, pwd, ip, channel))
if not cap.isOpened():
# 大华打开摄像头
cap = cv2.VideoCapture(
"rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % (user, pwd, ip, channel))
if not cap.isOpened():
# 宇视打开摄像头
cap = cv2.VideoCapture("rtsp://%s:%s@%s/video1" % (user, pwd, ip))
if cap.isOpened(): # 连接成功
cv2.namedWindow(window_name, flags=cv2.WINDOW_FREERATIO) # 创建一个用于显示画面的窗口
name = savePath + ip + ".jpg"
last_time = datetime.datetime.now() # 上一次的时间
while True:
cv2.imshow(window_name, frame)
cur_time = datetime.datetime.now() # 当前时间
if (cur_time - last_time).seconds >= 60: # 如果间隔超过一分钟就截图
cv2.imwrite(name, cap.read()[1]) # 截图
last_time = cur_time
print("保存成功")
except Exception as err:
print(err)
print("打开摄像头失败")
if __name__ == '__main__':
main()
3 总结
- 如果是要读取一个新的摄像头数据,首先要初始化摄像头,基本的流程就是用网线把摄像头、电脑相连,然后把电脑的IP地址改成和摄像头默认地址相同网段的地址,通过浏览器输入摄像头的默认地址就可以进入摄像头的控制界面,设置用户名和密码之后就能正常使用了。
- 通过这个程序我也意识到为什么家里的WIFI密码要设置复杂一点,如果很容易连上你家里的WIFI并且刚好家里有摄像头是很容易通过IP搜索工具找到摄像头的IP地址,这个时候如果有心怀不轨的人就可以不断尝试你的摄像头账户密码,如果刚好图方便设置的是默认账户密码或者很简单的就很容易被人破解,这样就能随时随地查看到你家里的监控画面。所以对于WIFI密码、摄像头账户密码还是要设置的复杂一些比较好,安全隐私是第一位!当然现在的摄像头都是有一个密码错误上限的,基本上输入密码连续错误四五次就会锁住要等一段时间才能尝试。