Python实现图片和视频的相互转换

目录
  • 使用背景
  • 一、视频转图像
  • 二、图像转视频

使用背景

有时候我们需要把很多的图片合成视频,或者说自己写一个脚本去加快或者放慢视频;

也有时候需要把视频裁剪成图片,进行后续操作。

这里提供两种方法,一是视频转图像;二是图像转视频。 

一、视频转图像

有时候我们需要把文件夹中的视频按照一定的帧率截取图片,如一秒取三张,为了实现这一需求,我特地编写了代码实现,并且附上了十分详细的说明,为了方便大家改代码实现自己需求(主要为了照顾刚学python的或者只需要用这一需求的小伙伴),本博文的特点如下:

  • 直接改变输入文件夹和输出文件夹的位置,就可以实现功能
  • 输出的图片能按照一定格式命名,这里是以20210823_0001命名
  • 逐一遍历文件夹中视频,序号之间可以连续(也可不连续,需要改代码)
  • 利用双线性插值方法,就算图片变大了,也能保证分辨率(关于双线性,这里只是调用opencv方法实现,具体实现代码和原理可看我下一篇博文)
  • 代码解释十分详细,一看就懂

十分详细代码实现

首先先说明需要自己修改的参数,代码如下:

filepath = 'C:/Users/ZFG/Desktop/1111' #视频文件夹所在目录
data='20210823'   #要是储存的文件为20210823_0001格式,则为前半部分
save_filename='C:/Users/ZFG/Desktop/2222/'  #储存图片的文件夹的地址
timeF = 6   #根据一秒取多少帧设置,比如我的视频是24帧/秒,取6则一秒取三张
kernal=(700,700)  #设置输出的大小,根据自己需求设置

然后再设置一个方法,来储存截取后的图片:

def saveImage(image,SaveAddress,num):  #image为读取的图片,SaveAddress为需要存的地址,num为截取图片时候记录的序号
    address= SaveAddress+data+'_'+str(num).zfill(4)+'.jpg'   #这里设置输出格式
    cv2.imwrite(address,image) #这里为存图片

之后读取文件夹:

pathDir = os.listdir(filepath)
i=0
j=0
for allDir in pathDir:  #遍历文件夹中的每一个视频
    videopath =filepath+'/'+ allDir
    videoCapture=cv2.VideoCapture(videopath)  #输入绝对路径
    untill,picture=videoCapture.read()  #读取视频,视频读取完的时候,返回的untill为False,表示视频读取完毕
    while untill:
        i+=1
        if (i%timeF==0):    #根据原视频的帧率看截图图片的频率
            j+=1
            picture=cv2.resize(picture,kernal,cv2.INTER_LINEAR)  #这里调用了opencv中的双线性插值法,要是图片增加很快,保证了图片精度
            saveImage(picture,save_filename,j)  #调用我们之前描述的方法
            pass
        untill, picture = videoCapture.read()  #再次看视频是否结束,结束了则until为False

将上诉代码结合后,最终程序如下所示:

import cv2
import os

i = 0
j = 0
pathDir = os.listdir(filepath)
filepath = 'C:/Users/ZFG/Desktop/1111'
data='20210823'
save_filename='C:/Users/ZFG/Desktop/2222/'
timeF = 6
kernal=(700,700)
def saveImage(image,SaveAddress,num):
    address= SaveAddress+data+'_'+str(num).zfill(4)+'.jpg'
    cv2.imwrite(address,image)
for allDir in pathDir:
    videopath =filepath+'/'+ allDir
    videoCapture=cv2.VideoCapture(videopath)
    untill,picture=videoCapture.read()
    while untill:
        i+=1
        if (i%timeF==0):
            j+=1
            picture=cv2.resize(picture,kernal,cv2.INTER_LINEAR)
            saveImage(picture,save_filename,j)
            pass
        untill, picture = videoCapture.read()

最后看下效果吧:

第一张图是文件夹中的视频,帧率是24帧/秒,第二张图是一秒取三张图片后,图片储存在文件夹中的图。

二、图像转视频

有时候我们需要把很多的图片合成视频,或者说自己写一个脚本去加快或者放慢视频。我写这个的目的,是因为我有一个模型只能处理图片,但是我想看视频的处理效果,于是我先视频变成图片,然后处理好后把图片变成视频,这样就解决需求啦~

十分详细代码实现

首先先说明需要自己修改的参数,代码如下:

if __name__ == '__main__':
    im_dir = ' '  # 图片帧存放路径,这里写一个文件夹
    dir_list=os.listdir(im_dir)
    fps = 20  # 设置一个帧率,每秒钟帧数越多,视频就越快
    dir_video=' ' #合成后视频的存放视频
    video_dir = dir_video + '.avi'
    frame2video(im_dir, video_dir, fps)

然后再设置一个方法,来储存截取后的图片:

def frame2video(im_dir, video_dir, fps):
    im_list = os.listdir(im_dir)
    im_list.sort(key=lambda x: int(x.replace("frame", "").split('.')[0]))
    img = Image.open(os.path.join(im_dir, im_list[0]))
    img_size = img.size  # 获得图片分辨率,文件夹下的图片分辨率需要一致,要是不一致可以写一个if函数resize一下~
    fourcc = cv2.VideoWriter_fourcc(*'XVID')  # opencv版本是3
    videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
    for i in im_list:
        im_name = os.path.join(im_dir + i)
        frame = cv2.imdecode(np.fromfile(im_name, dtype=np.uint8), -1)
        videoWriter.write(frame)
    videoWriter.release()
    print('Done')

大功告成

import cv2
import os
import numpy as np
from PIL import Image

def frame2video(im_dir, video_dir, fps):
    im_list = os.listdir(im_dir)
    im_list.sort(key=lambda x: int(x.replace("frame", "").split('.')[0]))
    img = Image.open(os.path.join(im_dir, im_list[0]))
    img_size = img.size
    fourcc = cv2.VideoWriter_fourcc(*'XVID')  # opencv版本是3
    videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)

    for i in im_list:
        im_name = os.path.join(im_dir + i)
        frame = cv2.imdecode(np.fromfile(im_name, dtype=np.uint8), -1)
        videoWriter.write(frame)

    videoWriter.release()
    print('Done')

if __name__ == '__main__':
    im_dir = ' '
    dir_list=os.listdir(im_dir)
    fps = 20
    dir_video=' '
    video_dir = dir_video + '.avi'
    frame2video(im_dir, video_dir, fps) 

以上就是Python实现图片和视频的相互转换的详细内容,更多关于Python图片和视频相互转换的资料请关注我们其它相关文章!

(0)

相关推荐

  • python实现视频读取和转化图片

    1)视频读取 import cv2 cap = cv2.VideoCapture('E:\\Video\\20000105_224116.dav') #地址 while(True): ret,frame = cap.read() if(ret): # gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) cv2.imshow('input',frame) else: break if cv2.waitKey(1)==27: break cap.release

  • Python实现图片与视频互转代码实战(亲测有效)

    一. 图片转视频 任务需求背景 在标注数据的过程中,需要[反复]浏览大量图片(万张以上的数量级),确认图片中的目标类别以及室内户型布局.但是,在电脑上浏览图片有很大的不足:(a)需要持续点击鼠标或者键盘:(b)图片加载跟不上点击速度. 值得注意的是:网上有很多代码(图片转视频),但是真正能用的几乎很少,本博文的代码经过测试,可以成功生成视频. 代码依赖库 opencv-python==4.5.2 numpy==1.19.2 glob(python自带模块) 代码实战 基本步骤如下: a. 使用g

  • Python+Opencv实现把图片、视频互转的示例

    1. 安装Opencv包 pip install opvencv-python 2.实现代码: 视频转为图片: import cv2 cap=cv2.VideoCapture('E:/video/video-02.mp4') # 获取一个视频打开cap isOpened=cap.isOpened # 判断是否打开 print(isOpened) fps=cap.get(cv2.CAP_PROP_FPS) print(fps) # 获取宽度 width=int(cap.get(cv2.CAP_PR

  • python 视频逐帧保存为图片的完整实例

    我就废话不多说了,直接上代码吧! import cv2 import os def save_img(): video_path = r'F:\test\video1/' videos = os.listdir(video_path) for video_name in videos: file_name = video_name.split('.')[0] folder_name = video_path + file_name os.makedirs(folder_name,exist_ok

  • OpenCV+python3实现视频分解成图片

    OpenCV+python3将视频分解成图片,供大家参考,具体内容如下 我们在工作或学习时,偶尔需要将视频分解成图片,只取其中一段的图片就行了,而在网上下载转换工具又3比较麻烦,现在我们用python实现视频分解成图片的功能. 原视频截图如下: 代码如下: """ ------------------------------------------------- File Name: 01-video2jpg.py Description : Author : 小恋莫小哀 E

  • Python将视频或者动态图gif逐帧保存为图片的方法

    本文是基于opencv将视频和动态图gif保存为图像帧.可以根据输入视频格式的不同,修改第21行. 对动图的处理不同于视频,PIL库包含对图像序列的基本支持.当打开gif图像时,自动加载第一帧.当图像读取完成时,抛出EOFError异常.我们可以使用seek()与tell()函数完成图像帧的读取. 本代码的前部分是对文件的读取.数据集文件结构如下: |--datasets |--action1 action1_1.gif action1_2.gif ...... |--action2 actio

  • Opencv python 图片生成视频的方法示例

    本文主要介绍了Opencv图片生成视频,分享给大家,具体如下: 生成视频 import random as rd import cv2 as cv import numpy as np # 保存视频 class RecordMovie(object): def __init__(self, img_width, img_height): self.video_writer = None # 视频对象 self.is_end = False # 结束保存视频 self.img_width = im

  • Python实现图片和视频的相互转换

    目录 使用背景 一.视频转图像 二.图像转视频 使用背景 有时候我们需要把很多的图片合成视频,或者说自己写一个脚本去加快或者放慢视频: 也有时候需要把视频裁剪成图片,进行后续操作. 这里提供两种方法,一是视频转图像:二是图像转视频.  一.视频转图像 有时候我们需要把文件夹中的视频按照一定的帧率截取图片,如一秒取三张,为了实现这一需求,我特地编写了代码实现,并且附上了十分详细的说明,为了方便大家改代码实现自己需求(主要为了照顾刚学python的或者只需要用这一需求的小伙伴),本博文的特点如下:

  • python实现图片,视频人脸识别(dlib版)

    图片人脸检测 #coding=utf-8 import cv2 import dlib path = "img/meinv.png" img = cv2.imread(path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #人脸分类器 detector = dlib.get_frontal_face_detector() # 获取人脸检测器 predictor = dlib.shape_predictor( "C:\\Pytho

  • python实现图片,视频人脸识别(opencv版)

    图片人脸识别 import cv2 filepath = "img/xingye-1.png" img = cv2.imread(filepath) # 读取图片 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换灰色 # OpenCV人脸识别分类器 classifier = cv2.CascadeClassifier( "C:\Python36\Lib\site-packages\opencv-master\data\haar

  • 对Python+opencv将图片生成视频的实例详解

    如下所示: import cv2 fps = 16 size = (width,height) videowriter = cv2.VideoWriter("a.avi",cv2.VideoWriter_fourcc('M','J','P','G'),fps,size) for i in range(1,200): img = cv2.imread('%d'.jpg % i) videowriter.write(img) 以上这篇对Python+opencv将图片生成视频的实例详解就是

  • python 使用opencv 把视频分割成图片示例

    我就废话不多说了,直接上代码吧! #--coding:utf-8-- import cv2 #图像路径名字错误不提示 im=cv2.imread("timg.jpg",cv2.IMREAD_GRAYSCALE) cv2.imwrite('res.jpg',im) ''' cap=cv2.VideoCapture("1EF5013E37956E7EF2D5F935B6107F34.mp4") while True: ret,im=cap.read() cv2.imsh

  • 如何用python反转图片,视频

    利用python反转图片/视频 准备:一张图片/一段视频 python库:Pillow,moviepy 安装库 pip install Pillow -i https://mirrors.aliyun.com/pypi/simple pip install moviepy -i https://mirrors.aliyun.com/pypi/simple 默认官方镜像源,我这里尝试的时候没有任何进度.切换到国内的源,比如阿里镜像,清华镜像即可.第一次使用国内源,简直是神速! 反转效果 反转后 实

  • Python+OpenCV实现图片及视频中选定区域颜色识别

    近期,需要实现检测摄像头中指定坐标区域内的主体颜色,通过查阅大量相关的内容,最终实现代码及效果如下,具体的实现步骤在代码中都详细注释,代码还可以进一步优化,但提升有限. 主要实现过程:按不同颜色的取值范围,对图像进行循环遍历,转换为灰度图,将本次遍历的颜色像素转换为白色,对白色部分进行膨胀处理,使其更加连续,计算白色部分外轮廓包围的面积累加求和,比较每种颜色围起来面积,保存最大值及其颜色,所有颜色遍历完后,返回最大值对应的颜色,显示在图像上 如果有类似的颜色识别的任务,可参考以下代码修改后实现具

随机推荐