代码在最后
所需库准备
- 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