播放和保存视频,图像倒置纠正到本地文件夹(含ffmpeg ,pyav多线程读取多路网络摄像头)

 播放一段视频并显示

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()

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值