【python】OpenCV—Video to Imag / Image to Video

【python】OpenCV—Video to Imag / Image to Video_第1张图片


文章目录

  • 0 一些知识
  • 1 计算总帧数
  • 2 计算 Frames per second(FPS)
  • 3 Video to Image
  • 4 Image to Video


0 一些知识

视频的基础参数:分辨率,帧率、码率、比特率、采样率。

视频的帧率是可以是恒定的(cfr, Const Frame-Rate),也可以是变化的(vfr, Variable Frame-Rate)

1 计算总帧数

import cv2

video_cap = cv2.VideoCapture('/home/Downloads/2.mp4')

frame_count = 0
while (True):
    ret, frame = video_cap.read()
    if ret is False:
        break
    frame_count = frame_count + 1
    
print(frame_count)

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

2 计算 Frames per second(FPS)

下面的实现要求 opencv 3 以上的版本

import cv2
video = cv2.VideoCapture('/home/Downloads/2.mp4') # 23.97602537435857
fps = video.get(cv2.CAP_PROP_FPS)
print("Frames per second using video.get(cv2.CAP_PROP_FPS) : {0}".format(fps))
video.release()

低版本的实现可以参考 使用 python-opencv 读取视频,计算视频总帧数及 FPS 的实现

3 Video to Image

参考:Python基于OpenCV将视频逐帧保存为图片

视频路径:/home/Downloads/2.mp4

保存图片的路径:/home/Downloads/2/

# coding=utf-8

import cv2

interval = 1 # 保存时的帧数间隔
frame_count = 0 # 保存帧的索引
frame_index = 0 # 原视频的帧索引,与 interval*frame_count = frame_index 

cap = cv2.VideoCapture('/home/Downloads/2.mp4')

if cap.isOpened():
    success = True
else:
    success = False
    print("读取失败!")

while(success):
    success, frame = cap.read()
    if success is False:
        print("---> 第%d帧读取失败:" % frame_index)
        break
        
    print("---> 正在读取第%d帧:" % frame_index, success)
    
	if frame_index % interval == 0:
		cv2.imwrite("/home/Downloads/2/%d.jpg" % frame_count, frame)
		frame_count += 1
	frame_index += 1

多个视频的转化参考:Python基于OpenCV将视频逐帧保存为图片

4 Image to Video

图片的路径:/home/Downloads/2/

新视频的路径:/home/Downloads/new_2.mp4

来自:python将多帧图片组合成视频

import cv2
import os
import random

img = cv2.imread('/home/Downloads/2/0.jpg')  # 读取保存的任意一张图片
fps = 23.97602537435857 # 根据第二节介绍的方法获取视频的 fps
size = (img.shape[1],img.shape[0])  #获取视频中图片宽高度信息
print(size)
fourcc = cv2.VideoWriter_fourcc(*"XVID") # 视频编码格式
videoWrite = cv2.VideoWriter('/home/Downloads/new_2.avi',fourcc,fps,size)# 根据图片的大小,创建写入对象 (文件名,支持的编码器,帧率,视频大小(图片大小))

files = os.listdir('/home/Downloads/2/')
out_num = len(files)
for i in range(0, out_num):
    fileName = "/home/Downloads/2/"+str(i)+'.jpg'    #循环读取所有的图片,假设以数字顺序命名
    img = cv2.imread(fileName)
    videoWrite.write(img)# 将图片写入所创建的视频对象
videoWrite.release() # 释放了才能完成写入,连续写多个视频的时候这句话非常关键

下面列举写其他的视频编码格式,以及对应的保存格式,eg XVID 保存为 avi

在这里插入图片描述

PS:上述操作保存后的视频会比原视频大小大很多,可以配合视频转换工具进一步压缩!

你可能感兴趣的:(Python,计算机视觉,图片转视频,视频转图片)