使用opencv-python 视频分解图片+图片合成视频

  1. 安装opencv
pip install opencv-python      
  1. 视频分解图片
import cv2
import numpy as np
import os
os.chdir('F:/opencv/test')

##读取视频,并逐帧分解成图片
cap = cv2.VideoCapture('1.mp4')  #打开一个视频
isOpened = cap.isOpened() #判断是否打开
print(isOpened)

#获取视频的相关信息,视频的每一帧图片的宽度都是一致的
fps = cap.get(cv2.CAP_PROP_FPS) #帧率,即每秒钟由多少张图片组成
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) #获取宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) #获取高度
print(fps,width,height)  #输出相关信息

i = 0  
while (isOpened):
    #读取视频的前两秒的图像,共计2*int(fps)张
    if i ==int(fps)*2 :  
        break
    else:
        i = i+1
    (flag,frame) = cap.read() #读取每一张 flag frame
    filename = 'image'+str(i)+'.jpg'
    #将读取的图片写入文件中,
    if flag == True:
        cv2.imwrite(filename,frame,[cv2.IMWRITE_JPEG_QUALITY,100])  #确定图片质量,100算是高的
print('end!')        
  1. 图片合成视频
##读取零散图片(上面分解的图片),并将其合成视频
img = cv2.imread('image1.jpg')
imginfo = img.shape
size = (imginfo[1],imginfo[0])  #与默认不同,opencv使用 height在前,width在后,所有需要自己重新排序
print(size)

#创建写入对象,包括 新建视频名称,每秒钟多少帧图片(10张) ,size大小
#一般人眼最低分辨率为19帧/秒
videoWrite = cv2.VideoWriter('2.mp4',-1,10,size) 

for i in range(1,40):
    filename = 'image'+str(i)+'.jpg'
    img = cv2.imread(filename,1)  #1 表示彩图,0表示灰度图  
    
    #直接写入图片对应的数据
    videoWrite.write(img)  

videoWrite.release() #关闭写入对象
print('end')

上述的离散再合成,会丢失视频的声音信息。

需要:

  • 通道顺序
    opencv读取的彩图的三个通道的顺序为:gbr ,与常规的rgb顺序相反。
  • 宽度 高度顺序
    一般 width,在height之前。但是 cv2读取进行的图片的Info中,先是 height,后是 width。这个需要注意。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章