少废话,终极解决方案:
import requests
from requests.auth import HTTPDigestAuth
url = "http://{}:{}@172.18.45.18/ISAPI/Streaming/channels/33/picture".format("admin", "asdf1234")
resp = requests.get(url, auth=HTTPDigestAuth('admin', 'asdf1234'))
aa = 1
with open("a.jpg", "wb") as f:
f.write(resp.content)
用http的方式获取摄像头图片
curl --insecure --anyauth -u admin:asdf1234 -X GET http://admin:asdf1234@172.18.45.18/ISAPI/Streaming/channels/33/picture >b.jpeg
这样也是可以的
import datetime
import os
username = "admin"
password = "asdf1234"
return_code = os.system(
'curl --insecure --anyauth -u {}:{} -X GET http://{}:{}@172.18.45.18/ISAPI/Streaming/channels/33/picture >2.jpg'.format(
username, password, username, password))
print("return code:", return_code, datetime.datetime.now())
用一种方式读取视频流并截图:
import sys
import uuid
import cv2
import os, time
import datetime
from multiprocessing import Process
sys.path.append(os.path.abspath(os.path.join(__file__, "..", "..")))
import feishu
folder_name = "/data/camera/shapan_own"
log_path = "/data/camera/shapan_own/xferlog"
os.makedirs(folder_name, exist_ok=True)
timeF = 75 # 视频帧计数间隔频率, 这样就是1秒抽取1帧率
# Wed Jul 20 15:51:29 2022 1 172.18.45.18 334718 /172.18.45.18/172.18.45.18_01_20220720155203988_TIMING.jpg b _ i g test ftp 0 * c
def save_img(video_path=r"rtsp://admin:123456@172.18.45.15:554/h264/ch1/main/av_stream"):
ip = video_path.split("@")[1][0:12]
vc = cv2.VideoCapture(video_path) # 读入视频文件
c = 1
if vc.isOpened(): # 判断是否正常打开
pass
else:
error_msg = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " can not open:" + video_path
feishu.Feishu()(file=__file__, line_no=sys._getframe().f_lineno, msg=error_msg)
raise Exception(error_msg)
pic_path = folder_name + '/' + ip
if not os.path.exists(pic_path):
oldmask = os.umask(000)
os.makedirs(pic_path, exist_ok=True)
os.umask(oldmask)
while True: # 循环读取视频帧
rval = vc.grab()
if rval:
if (c % timeF == 0): # 每隔timeF帧进行存储操作
t = time.localtime()
ret, frame = vc.retrieve()
pic_name = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S") + "_" + uuid.uuid4().hex + ".jpg"
full_path_name = os.path.join(pic_path, pic_name)
#cv2.imwrite("./pic/" + pic_name, frame)
cv2.imwrite(full_path_name, frame) # 存储为图像,保存名为 文件夹名_数字(第几个文件).jpg
print(full_path_name)
log_path_pic_name = "/" + ip + "/" + pic_name
line = f"{time.asctime(t)} 0 {ip} {frame.size} {log_path_pic_name} a _ i r test ftp 0 * c{os.linesep}"
with open(log_path, "a") as f:
f.write(line)
c = c + 1
cv2.waitKey(1)
vc.release()
if __name__ == '__main__':
stream_list = [
"rtsp://admin:123456@172.18.45.14:554/h264/ch1/main/av_stream", # 展厅西南角
"rtsp://admin:123456@172.18.45.15:554/h264/ch1/main/av_stream", # 展厅西北角--反光衣
"rtsp://admin:123456@172.18.45.16:554/h264/ch1/main/av_stream", # 展厅东北角
"rtsp://admin:123456@172.18.45.17:554/h264/ch1/main/av_stream", # 展厅东南角--keypoint
"rtsp://admin:asdf1234@172.18.45.18:554/h264/ch1/main/av_stream", # 展厅球机 -- 抽烟识别
]
debug_flag = True
if not debug_flag:
p_list = []
for stream in stream_list:
p = Process(target=save_img, args=(stream,))
p_list.append(p)
for p in p_list:
p.start()
for p in p_list:
p.join()
else:
save_img()
用另一种方式读取图片并截图:
import sys
import uuid
import cv2
import os, time
import datetime
from multiprocessing import Process
sys.path.append(os.path.abspath(os.path.join(__file__, "..", "..")))
import feishu
folder_name = "/data/camera/shapan_own"
log_path = "/data/camera/shapan_own/xferlog"
os.makedirs(folder_name, exist_ok=True)
timeF = 25 # 视频帧计数间隔频率, 这样就是1秒抽取1帧率
def save_img(video_path=r"rtsp://admin:123456@172.18.45.15:554/h264/ch1/main/av_stream", v_ip=""):
ip = video_path.split("@")[1][0:12]
vc = cv2.VideoCapture(video_path) # 读入视频文件
c = 1
if vc.isOpened(): # 判断是否正常打开
rval, frame = vc.read()
else:
error_msg = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " can not open:" + video_path
feishu.Feishu()(file=__file__, line_no=sys._getframe().f_lineno, msg=error_msg)
raise Exception(error_msg)
while rval: # 循环读取视频帧
rval, frame = vc.read()
pic_path = folder_name + '/' + v_ip
if not os.path.exists(pic_path):
os.makedirs(pic_path, exist_ok=True)
if (c % timeF == 0): # 每隔timeF帧进行存储操作
t = time.localtime()
pic_name = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S") + "_" + uuid.uuid4().hex + ".jpg"
full_path_name = os.path.join(pic_path, pic_name)
cv2.imwrite(full_path_name, frame) # 存储为图像,保存名为 文件夹名_数字(第几个文件).jpg
print(full_path_name)
log_path_pic_name = "/" + ip + "/" + pic_name
line = f"{time.asctime(t)} 0 {ip} {frame.size} {log_path_pic_name} a _ i r test ftp 0 * c{os.linesep}"
with open(log_path, "a") as f:
f.write(line)
c = c + 1
cv2.waitKey(1)
vc.release()
if __name__ == '__main__':
save_img("rtsp://admin:abc123456@172.18.45.29:554/Streaming/Channels/1001", '172.18.200.1001')