利用python open-cv aimageio完成avi png mp4 gif间的转换

实现时段截取、矩形窗截取、帧等间隔采样,帧图片缩放。

文章目录

  • 参考
  • 一、avi转png
  • 二、png转mp4
  • 三、png转gif
  • 四、avi转gif


参考

Python图片转视频和视频转图片以及视频转GIF

csdn


一、avi转png

import cv2
import math

file_path=r'C:\Users\li\AppData\Local\ttt\file_example_AVI_480_750kB.avi'
cap = cv2.VideoCapture(file_path)  # 加载视频文件
 
#播放视频,esc建退出:
while cap.isOpened():
    ret, frame = cap.read() 
    if ret:
        #frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        #frame_RGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) #open-cv颜色通道BGR,与图片RGB不一样?
        cv2.imshow('frame', frame)
    else:
        print('视频播放完成!')
        break
    key=cv2.waitKey(10)
    if key==27: #按键esc
        break 
 
#视频转图片: 
cap_num = cap.get(7)                             # 获取视频总帧数
cap_width = math.ceil(cap.get(3))                # 获取视频帧宽度(横)
cap_height = math.ceil(cap.get(4))               # 获取视频帧高度(竖)
cap_fps = math.ceil(cap.get(5))                  # 获取视频帧率

# 得到视频总帧数的位数,比如198帧(三位数),得到3;1989帧(4位数),得到4:
cap_count = 0
while cap_num:
    cap_count = cap_count+1
    cap_num = math.floor(cap_num/10) 
fix = '%0'+str(cap_count)+'d'     # 得到图片保存的前缀,比如001.png,0001.png
cap_cnt = 1 
ret, frame = cap.read()          # 读取图片
while ret:           
    file_pic_path =  'c:/Users/li/AppData/Local/ttt/pics/'+str(fix%cap_cnt)+'.png'    # 图片保存目录
    #frame_RGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) #open-cv颜色通道BGR,与图片RGB不一样??
    cv2.imwrite(file_pic_path,frame)
    cap_cnt = cap_cnt+1
    ret, frame = cap.read()

    key=cv2.waitKey(10)
    if key==27: #按键esc
        break 

#释放资源: 
cap.release()
cv2.destroyAllWindows()

二、png转mp4

######## 保存为avi视频格式,超占内存,每张图片4M,1000张,完完整整的3.5G #########
 
import cv2
import os
 
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')        # 设置输出视频为mp4格式
# fourcc = cv2.VideoWriter_fourcc('I','4','2','0')      # 设置输出视频为avi格式,很占内存
 
# cap_fps是帧率,可以根据随意设置;size要和图片的size一样,但是通过img.shape得到图像的参数是
#(height,width,channel),但是此处的size要传的是(width,height),这里一定要注意注意,
# 不然结果会打不开,提示“无法解码多工传送的流”等.比如通过img.shape得到常用的图片尺寸
#(480,270,3),则size设为(480,270)
cap_fps = 30
size = (480, 270)   
    
# 设置输出视频的参数,如果是灰度图,可以加上 isColor = 0 这个参数
#video = cv2.VideoWriter('results/result.avi',fourcc, cap_fps, size, isColor=0)
video = cv2.VideoWriter('result.mp4',fourcc, cap_fps, size)
 
# 这里直接读取py文件所在目录下的pics目录所有图片。
path = './pics/'
file_lst = os.listdir(path)
for filename in file_lst:
		img = cv2.imread(path + filename)
		video.write(img)
video.release()

三、png转gif

### ======================= 使用imageio包将图片转GIF ======================== ###
import os
import imageio
 
# 需要转GIF的图片路径
path = './pics/'
img_lst = os.listdir(path)
frames = []
for img in img_lst:
	frames.append(imageio.imread(path + img))
# duration是保存一帧图片的时间,其实就是相当于帧率。使用imageio方法来resize图像还没找到
imageio.mimsave("result.gif", frames, 'GIF', duration=0.033)

四、avi转gif

实现时段截取、矩形窗截取、帧等间隔采样,帧图片缩放。

 

import cv2
import imageio

cap = cv2.VideoCapture(r'C:\Users\li\AppData\Local\ttt\file_example_AVI_480_750kB.avi')
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))
start_time = 20*fps
end_time = 25*fps
image_lst = []
i = 0
GAP=5 #采样间隔每3帧取一个

while True:
    ret, frame = cap.read()
    if frame is None:
        break
    if ret == False:
        break
    if (i>=start_time and i<=end_time and i%GAP==0): 
        frame=frame[10:height-10,100:width-100] #取矩形窗口的图像
        frame = cv2.resize(frame, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA) #图片缩小一倍
        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) #等同frame_rgb = frame[:,:,(2,1,0)]
        image_lst.append(frame_rgb) 
        cv2.imshow('a', frame)
        key = cv2.waitKey(1)
        if key == ord('q'):
            break
    i +=1
 
cap.release()
cv2.destroyAllWindows()
 
# Convert to gif using the imageio.mimsave method
imageio.mimsave(r'C:\Users\li\AppData\Local\ttt\result_fromavi.gif', image_lst, fps=fps/GAP)

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值