Python-OpenCV는 비디오 프레임을 읽고 그림으로 저장합니다.

cv2.VideoCapture()는 비디오 프레임을 읽습니다.

import cv2  # 代入OpenCV模块
VIDEO_PATH = 'video.mp4'  # 视频地址
video = cv2.VideoCapture(video_path)  # 实例化视频对象
retval, frame = video.read()  # 逐帧读取
  • 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은 각 프레임의 이미지로 3차원 행렬입니다.

 

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

 

참조

opencv: 비디오에서 프레임 사진을 추출하고 저장(cv2.VideoCapture)

python-opencv를 사용하여 비디오 읽기, 총 비디오 프레임 수 및 FPS 구현 계산

OpenCV는 fps(초당 프레임 수)를 계산합니다.

추천

출처blog.csdn.net/weixin_43799388/article/details/123958639