当前位置:   article > 正文

【Python】OpenCV读取视频帧并保存为图片_读帧保存

读帧保存

cv2.VideoCapture()读取视频帧

import cv2  # 代入OpenCV模块
VIDEO_PATH = 'video.mp4'  # 视频地址
video = cv2.VideoCapture(video_path)  # 实例化视频对象
retval, frame = video.read()  # 逐帧读取
  • 1
  • 2
  • 3
  • 4
  • vid = cv2.VideoCapture(0)

    • VideoCapture()中参数是0,表示打开笔记本的内置摄像头
    • 参数是视频文件路径则打开视频,如vid= cv2.VideoCapture('video.mp4')
  • retval, frame = vid.read()

    • vid.read()按帧读取视频
    • retval, frame是获vic.read()方法的两个返回值。其中retval是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False;frame就是每一帧的图像,是个三维矩阵

 

计算FPS的两种方法

FPS: Frame Per Second 每秒传输帧数

通俗来讲就是指动画或视频的画面数,每秒钟帧数越多,所显示的动作就会越流畅

  • video.get(cv2.CAP_PROP_FPS)video.get(cv2.cv.CAP_PROP_FPS)
    • 对于本地视频文件来讲,可以直接从get(CAP_PROP_FPS)get(CV_CAP_PROP_FPS)获取每秒的帧数
  • 手动计算:总帧数 / 总时间
    • 对于网络摄像头和许多其他连接摄像头,必须手动计算每秒的帧数,也就是可以从视频中读取一定数量的帧,并查看计算这些帧需要花费多少时间

 

读取视频帧并保存为图片

# coding=utf-8
# 使用OpenCV视频中提取帧图片并保存(cv2.VideoCapture)
import os
import cv2
import shutil
import time

# 全局变量
VIDEO_PATH = 'videos/test_video3.mp4'  # 视频地址
EXTRACT_FOLDER = 'test'  # 存放帧图片的位置
EXTRACT_FREQUENCY = 10  # 帧提取频率


# 主操作
def extract_frames(video_path, dst_folder, index):
    # 实例化视频对象
    video = cv2.VideoCapture(video_path)
    frame_count = 0

    # 循环遍历视频中的所有帧
    while True:
        # 逐帧读取
        _, frame = video.read()
        if frame is None:
            break
        # 按照设置的频率保存图片
        if frame_count % EXTRACT_FREQUENCY == 0:
            # 设置保存文件名
            save_path = "{}/{:>03d}.jpg".format(dst_folder, index)
            # 保存图片
            cv2.imwrite(save_path, frame)
            index += 1  # 保存图片数+1
        frame_count += 1  # 读取视频帧数+1

    # 视频总帧数
    print(f'the number of frames: {frame_count}')
    # 打印出所提取图片的总数
    print("Totally save {:d} imgs".format(index - 1))

    # 计算FPS 方法一 get()
    (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')  # Find OpenCV version
    # (major_ver, minor_ver, subminor_ver) = (4, 5, 4)
    if int(major_ver) < 3:
        fps = video.get(cv2.cv.CV_CAP_PROP_FPS)  # 获取当前版本opencv的FPS
        print("Frames per second using video.get(cv2.cv.CV_CAP_PROP_FPS): {0}".format(fps))
    else:
        fps = video.get(cv2.CAP_PROP_FPS)  # 获取当前版本opencv的FPS
        print("Frames per second using video.get(cv2.CAP_PROP_FPS) : {0}".format(fps))

    # 计算FPS 方法二 手动计算 总帧数 / 总时间
    # new_vid = cv2.VideoCapture(video_path)
    # start = time.time()  # 开始时间
    # c = 0
    # while True:
    #     _, frames = new_vid.read()
    #     if frames is None:
    #         break
    #     c += 1
    # end = time.time()  # 结束时间
    # fps2 = c / (end - start)  # 总帧数 / 总时间
    # print(f'frames:{c}')
    # print(f'seconds:{end - start}')
    # print("Frames per second using frames / seconds : {0}".format(fps2))
    # new_vid.release()

    # 最后释放掉实例化的视频
    video.release()


def main():
    # 递归删除之前存放帧图片的文件夹,并新建一个
    try:
        shutil.rmtree(EXTRACT_FOLDER)
    except OSError:
        pass
    os.mkdir(EXTRACT_FOLDER)
    # 抽取帧图片,并保存到指定路径
    extract_frames(VIDEO_PATH, EXTRACT_FOLDER, 1)


if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

 

Reference

opencv: 视频中提取帧图片并保存(cv2.VideoCapture)

使用python-opencv读取视频,计算视频总帧数及FPS的实现

OpenCV 计算fps(frames per second-fps)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/649203
推荐阅读
相关标签
  

闽ICP备14008679号