美文网首页
OpenCV学习笔记(2):间隔截取视频帧

OpenCV学习笔记(2):间隔截取视频帧

作者: 逍遥_yjz | 来源:发表于2021-09-06 15:08 被阅读0次

    1. 帧率

    帧率(FPS):每秒钟播放的帧数

    两种方法,上代码

    rtsp = 'videoData/test_video.flv'
    # 初始化摄像头
    cap = cv2.VideoCapture(rtsp)
    
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    fps = cap.get(5)  # 这个是获取视频帧率
    print(fps)  # 25.0
    print(cap.get(cv2.CAP_PROP_FPS))  # 25.0
    

    2. 计算视频时长

    # 2. 计算视频时长
    def get_video_duration(filename):
      cap = cv2.VideoCapture(filename)
      if cap.isOpened():
        rate = cap.get(5)
        frame_num =cap.get(7)
        duration = frame_num/rate
        return duration
      return -1
    
    fileName = "videoData/test_video.flv" 
    duration = get_video_duration(fileName)
    print(duration) # 89.68 秒
    

    1. 通过帧数间隔截取视频帧

    1.如果你想直接**通过帧数间隔截取**视频帧,那直接使用可以使用下面的代码:**

    # 3. 通过帧数间隔截取视频帧
    def capturePictureOnFrames(fileName):
        c = 1
        frameRate = 100  # 帧数截取间隔(每隔100帧截取一帧)
        cap = cv2.VideoCapture(fileName)
        print(cap.isOpened())
        while (True):
            ret, frame = cap.read()
            if ret:
                if (c % frameRate == 0):
                    print("开始截取视频第:" + str(c) + " 帧")
                    # 这里就可以做一些操作了:显示截取的帧图片、保存截取帧到本地
                    cv2.imwrite("./capture_image/" + str(c) + '.jpg', frame)  # 这里是将截取的图像保存在本地
                c += 1
                cv2.waitKey(0)
            else:
                print("所有帧都已经保存完成")
                break
               
    capturePictureOnFrames(fileName)
    
    image-20210906145253247

    2. 通过时间间隔截取

    1. 如果你想**通过时间间隔截取**视频帧,可以做一个时间到帧数的变换:**

    假如你想每隔10秒截取一帧,那么就相当于你要每隔( FPS * 10 )帧截取一帧图像!

    # 4. 通过时间间隔截取
    def capturePictureOnTimes(fileName):
        cap = cv2.VideoCapture(fileName)
        c = 1
        timeRate = 10  # 截取视频帧的时间间隔(这里是每隔10秒截取一帧)
        FPS = cap.get(5)
        while (True):
            ret, frame = cap.read()
            if ret:
                frameRate = int(FPS) * timeRate  # 因为cap.get(5)获取的帧数不是整数,所以需要取整一下(向下取整用int,四舍五入用round,向上取整需要用math模块的ceil()方法)
                if (c % frameRate == 0):
                    print("开始截取视频第:" + str(c) + " 帧")
                    # 这里就可以做一些操作了:显示截取的帧图片、保存截取帧到本地
                    cv2.imwrite("./capture_image/" + str(c) + '.jpg', frame)  # 这里是将截取的图像保存在本地
                c += 1
                cv2.waitKey(0)
            else:
                print("所有帧都已经保存完成")
                break
        cap.release()
    
    image

    3. 生成连续视频文件

    直接上代码

    # coding: utf-8
    import datetime
    import cv2
    import os
    
    #rtsp = 'rtsp://admin:admin@191.164.3.160:554/1/1'
    rtsp = 'videoData/test_video.flv'
    # 初始化摄像头
    cap = cv2.VideoCapture(rtsp)
    
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    fps = cap.get(5)  # 这个是获取视频帧率
    frame_count = 0
    count = 0
    while cap.isOpened():
        isSuccess, frame = cap.read()
        if isSuccess:
            if frame_count % 120 == 0 or frame_count == 0:
                frame_count = 0
                count += 1
                i = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
                filename = 'continuityVideo/'+str(i) + '-' + str(count) + '.avi'
                print(filename)
                video_writer = cv2.VideoWriter(filename, fourcc, fps, size)
    
        video_writer.write(frame)
        frame_count = frame_count + 1
        print(frame_count)
        if isSuccess:
            cv2.imshow('show', frame)
        else:
            video_writer.release()
            portion = os.path.splitext(filename)
            newname = portion[0] + '.mp4'
            os.rename(filename, newname)
            break
        if frame_count % 120 == 0:
            video_writer.release()
            portion = os.path.splitext(filename)
            newname = portion[0] + '.mp4'
            os.rename(filename, newname)
    
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()
    

    输出结果:

    image-20210906150238808

    相关文章

      网友评论

          本文标题:OpenCV学习笔记(2):间隔截取视频帧

          本文链接:https://www.haomeiwen.com/subject/eagewltx.html