播放一段视频并显示
import cv2
if __name__ == '__main__':
input_video_file_1 = 'smoking_20191011_154214.mp4'
# set video capture
video_capture_1 = cv2.VideoCapture(input_video_file_1)
video_capture_1.set(3, 1280) # camera width
video_capture_1.set(4, 720) # camera height
ret1, frame1 = video_capture_1.read()
name_windows_1 = "object detect_1"
cv2.namedWindow(name_windows_1, cv2.WINDOW_NORMAL)
while True:
ret1, img_raw = video_capture_1.read()
cv2.imshow(name_windows_1, img_raw)
if cv2.waitKey(30) & 0xFF == ord('q'): #如果没有这个,就报错,原因是什么不知道
break
video_capture_1.release()
cv2.destroyAllWindows()
存储一段视频到本地
fourcc = cv2.VideoWriter_fourcc(*'XVID')#或(*'MJPG')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
第一句表示使用XVID或'MJPG'编码器
第二句参数分别表示:输出视频名称,编码器,帧率,帧宽和高
import cv2
def main():
video_path= 'test_video/test_1.mp4'
cap = cv2.VideoCapture(video_path)
cap.set(cv2.CAP_PROP_FPS, 30)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 调用VideoWrite()函数
# videoWrite = cv2.VideoWriter('MySaveVideo.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), 30, size)
videoWrite = cv2.VideoWriter('MySaveVideo.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, size)#若上面的方式保存的视频出现打不开的情况,可用这个命令
while cap.isOpened():
ret, image = cap.read()
if not ret:
break
cv2.imshow("car detect", image)
videoWrite.write(image)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
保存一段视频同时保存每桢时间
import cv2
import time
def main():
# video_path= 'test_video/test_1.mp4'
time_txt = open('save_time.txt', 'w')
video_path = '0'
cap = cv2.VideoCapture(video_path)
cap.set(cv2.CAP_PROP_FPS, 30)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 调用VideoWrite()函数
# videoWrite = cv2.VideoWriter('MySaveVideo.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), 30, size)
videoWrite = cv2.VideoWriter('MySaveVideo.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, size)#若上面的方式保存的视频出现打不开的情况,可用这个命令
while cap.isOpened():
ret, image = cap.read()
if not ret:
break
cv2.imshow("car detect", image)
save_time=time.time()
videoWrite.write(image)
time_txt.write(" %s \n" % save_time)#保存时间
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
若发现原来的视频画面颠倒了,可以旋转两次,重新保存
import cv2
def RotateClockWise90(img):# 顺时针旋转90度
trans_img = cv2.transpose( img )
new_img = cv2.flip(trans_img, 1)
return new_img
if __name__ == '__main__':
input_video_file_1 = '/home/jerry/shared/data/videos/smoking/VID_20191209_105350.mp4'
# set video capture
video_capture_1 = cv2.VideoCapture(input_video_file_1)
video_capture_1.set(3, 1280) # camera width
video_capture_1.set(4, 720) # camera height
ret1, frame1 = video_capture_1.read()
name_windows_1 = "object detect_1"
cv2.namedWindow(name_windows_1, cv2.WINDOW_NORMAL)
cap = cv2.VideoCapture(input_video_file_1)
cap.set(cv2.CAP_PROP_FPS, 30)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
video_name=input_video_file_1.split('/')[-1].split('.')[0]
video_name='/home/jerry/shared/data/videos/smoking/'+str(video_name)+'.avi'
videoWrite = cv2.VideoWriter(video_name, cv2.VideoWriter_fourcc('I', '4', '2', '0'), 30, size)
while True:
ret1, img_raw = video_capture_1.read()
img_raw=RotateClockWise90(img_raw)
img_raw = RotateClockWise90(img_raw)
videoWrite.write(img_raw)
time_write_frame = time.time()
cv2.imshow(name_windows_1, img_raw)
if cv2.waitKey(30) & 0xFF == ord('q'): #如果没有这个,就报错,原因是什么不知道
break
video_capture_1.release()
cv2.destroyAllWindows()
网络摄像头测试,av,ffmpeg
安装av
pip install av
import av
import cv2
#video = av.open('rtsp://admin:ts123456@10.21.38.241:554', 'r')
# video = av.open('http://10.11.20.104:8554/48/64', 'r')
video=av.open('rtsp://admin:**123456@192.168.117.210:554','r')
print("format:" + video.dumps_format())
print('after open')
index = 0
try:
for frame in video.decode():
# Do something with `frame`
index += 1
print("frame:{}".format(index))
img =frame.to_ndarray(format='bgr24')
cv2.imshow("Test", img)
# cv2.imwrite("Test{}.jpg".format(index), img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
except Exception as e:
print('fate erro:{}'.format(e))
cv2.destroyAllWindows()
多路网络摄像头测试
# coding: utf-8
import threading
import queue
import av
import cv2
def get_frame(video,FRAME_QUEUES):
try:
for frame in video.decode():
frame_1 =frame.to_ndarray(format='bgr24')
FRAME_QUEUES.put(frame_1, block=True, timeout=None) # 将摄像头读取的每一帧图像放入对应队列
except Exception as e:
print('fate erro:{}'.format(e))
def main():
input_videos = ['rtsp://admin:dy123456@192.168.117.210:554',
'rtsp://admin:dy123456@192.168.117.210:554',
'rtsp://admin:dy123456@192.168.117.210:554',
'rtsp://admin:dy123456@192.168.117.210:554',
'rtsp://admin:dy123456@192.168.117.210:554',
'rtsp://admin:dy123456@192.168.117.210:554',
] #需要测试的视频地址放在这里就可以了,可写网络摄像头地址
video_nums = len(input_videos)
name_windows = [] # 界面显示名字,待优化,应该显示在一个画面中,
global FRAME_QUEUES
max_queue = 800 / len(input_videos) # 每个队列中存放的最大长度,防止机器内存爆掉卡死,现在先假设所有队列总共800列
videos,FRAME_QUEUES=[],[]
for i in range(video_nums):
video = av.open(input_videos[i], 'r')#打开每路视频
videos.append(video)
name_window = "object detect_" + str(i)
name_windows.append(name_window)
cv2.namedWindow(name_window, cv2.WINDOW_NORMAL)
FRAME_QUEUES.append(queue.Queue(maxsize=max_queue)) # maxsize=0,说明队列大小没有限制,这里限制下队列长度
for i in range(video_nums):#多线程读取视频帧
thread=threading.Thread(target=get_frame,
args=(videos[i],
FRAME_QUEUES[i])
)
thread.start() # 启动刚刚创建的线程 thread_1
while True:
for i in range(video_nums):
image =FRAME_QUEUES[i].get(block=True, timeout=None)
if image is not None:
cv2.imshow(name_windows[i],image)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
if __name__ == "__main__":
main()