python将一张图片转换为视频

代码在最后

所需库准备

  • cv2
  • os
  • numpy

核心— —cv2库安装

cmd安装

pip install opencv-contrib-python

国外服务器下载速度可能较慢,在后面加国内镜像下载地址:

pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple

更多地址可看 Python库国内镜像下载地址

注意:

安装时可选择 opencv-python 或 opencv-contrib-python
opencv-python 只包含主要模块
opencv-contrib-python 包含了主要模块以及扩展模块(扩展模块主要是包含了一些带专利的收费算法和一些在测试的新算法)
可以理解为前者为基础版,后者为终极版
这里我安装了终极版(可以不用,但不能没有),但其实基础版已经能满足日常使用了

重点函数及用法

1. imread(filename[, flags])

返回值,Mat 类型, 即返回读取的图像,读取图像失败时返回一个空的矩阵对象(Mat::data == NULL)

  • 参数1 filename, 读取的完整图片文件名(带文件扩展名),可以使用相对路径或者绝对路径。
  • 参数2 flags, 一个读取标记,用于选择读取图片的方式,默认值为IMREAD_COLOR,flag值的设定与用什么颜色格式读取图片有关
注意:

使用imread读取时,发现如果路径具有中文字符时,将读取不到图片,返回空值,导致后续获取图片信息时shape = img.shape出现错误

AttributeError: 'NoneType' object has no attribute 'shape'

支持的图片格式:

Windows bitmaps - *.bmp, *.dib (always supported)
JPEG files - *.jpeg, *.jpg, *.jpe (see the Note section)
JPEG 2000 files - *.jp2 (see the Note section)
Portable Network Graphics - *.png (see the Note section)
WebP - *.webp (see the Note section)
Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
PFM files - *.pfm (see the Note section)
Sun rasters - *.sr, *.ras (always supported)
TIFF files - *.tiff, *.tif (see the Note section)
OpenEXR Image files - *.exr (see the Note section)
Radiance HDR - *.hdr, *.pic (always supported)
Raster and Vector geospatial data supported by GDAL (see the Note section) Note

flags 参数详解

参数说明
cv.IMREAD_UNCHANGED如果设置,则按原样返回加载的图像(使用Alpha通道,否则会被裁剪)
cv.IMREAD_COLOR如果设置,请始终将图像转换为3通道BGR彩色图像。
cv.IMREAD_ANYDEPTH如果设置,则在输入具有相应深度时返回16位/ 32位图像,否则将其转换为8位。
cv.IMREAD_ANYCOLOR如果设置,则以任何可能的颜色格式读取图像。
cv.IMREAD_LOAD_GDAL如果设置,使用gdal驱动程序加载图像
cv.IMREAD_REDUCED_GRAYSCALE_2如果设置,则始终将图像转换为单通道灰度图像,图像尺寸减小1/2。
cv.IMREAD_REDUCED_COLOR_2如果设置,则始终将图像转换为3通道BGR彩色图像,图像尺寸减小1/2。
cv.IMREAD_REDUCED_GRAYSCALE_4如果设置,则始终将图像转换为单通道灰度图像,图像尺寸减小1/4
cv.IMREAD_REDUCED_COLOR_4如果设置,则始终将图像转换为3通道BGR彩色图像,图像尺寸减小1/4
cv.IMREAD_REDUCED_GRAYSCALE_8如果设置,则始终将图像转换为单通道灰度图像,图像尺寸减小1/8。
cv.IMREAD_REDUCED_COLOR_8如果设置,则始终将图像转换为3通道BGR彩色图像,图像尺寸减小1/8。
cv.IMREAD_IGNORE_ORIENTATION如果设置,请不要根据EXIF的方向标志旋转图像。
img = cv2.imread(path + filename)

2. shape()

在一副图像中使用shape得到一个具有三个该图片的属性(高,宽, 图像通道数量)的列表

shape = img.shape

shape[0] 是 图片的高
shape[1] 是 图片的宽
shape[2] 是 图片的图像通道数量

3. VideoWriter(filename, fourcc, fps, frameSize[, isColor])

  • filename 参数是要保存的文件的路径
  • fourcc 指定编码器
    fourcc 是用 4 个字母表示采用的编码器。 常用的有 “XVID”、“DIVX"、”MJPG"、“X264"。可用的列表在这里。通常使用 ”XVID"。
    如果使用 -1,系统可能会弹出一个对话框让你选择。
	fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')  # 设置输出视频为mp4格式
  • fps 要保存的视频的帧率
    0.1 就是10s放完一张图片
    5 就是一秒放5张图片
cap_fps = 1
  • frameSize 要保存的文件的画面尺寸
    一个元组(width,height)
    第一位放宽
    第二位放高
size = (720, 1280)
  • isColor 指示是黑白画面还是彩色的画面
    默认为 1 彩色图
    加上 isColor = 0 灰度图
video = cv2.VideoWriter(final_path + '\\' + name + '.mp4', fourcc, cap_fps, size)

4. imdecode()

img = cv2.imdecode(np.fromfile(regional_path + '\\' + filename, dtype=np.uint8), -1)
    # imdecode读取的是rgb,如果后续需要opencv处理的话,需要转换成bgr,转换后图片颜色会变化
    # img=cv2.cvtColor(img,cv2.COLOR_RGB2BGR)

代码:

import numpy as np
import cv2
import os


regional_path = 'picture'
up_path = os.getcwd()  # 获取所在目录
final_path = up_path + r'\video'  # 保存转换后的视频
if not os.path.exists(final_path):  # 没有目录就创建
    os.mkdir(final_path)
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')  # 设置输出视频为mp4格式
cap_fps = 1    # 设置帧率
file_lst = os.listdir(regional_path)   # 获取待转换图片文件名列表
movie_lst = os.listdir(final_path)   # 获取已经转换的视频文件名列表
movie_lst_name = [x.split('.')[0] for x in movie_lst]  # 去掉视频后缀名

for filename in file_lst:
    name = filename.split('.')[0]  # 去掉图片后缀名
    print(name)
    if name in movie_lst_name:  # 已经转换过就跳过
        print(name, "已存在")
        continue
    img = cv2.imdecode(np.fromfile(regional_path + '\\' + filename, dtype=np.uint8), -1) #解决中文名路径错误
    shape = img.shape  # 获取图片属性
    size = (shape[1], shape[0])
    video = cv2.VideoWriter(final_path + '\\' + name + '.mp4', fourcc, cap_fps, size)
    print("正在生成 {} 文件".format(name))
    for x in range(10):
        video.write(img)
    print(" {} 文件完成".format(name))

运行结果:

图片: ['1.jpg', '2.jpg', '3.jpg', '啊啊.jpg']
视频: ['1', '啊啊']
1 已存在
正在生成2文件
2文件完成
正在生成3文件
3文件完成
啊啊 已存在

进程已结束,退出代码为 0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值