目的
使图像变得风格化,动态化,图像转换为视频。后续可通过视频发送至各个平台。
代码效果如下
代码解析
import cv2 as cv
import numpy as np
import os
import datetime
# 指定包含图片的文件夹路径
folder_path = 'E:\\Photo' # 请替换为实际文件夹路径
# 读取文件夹中的所有文件名
files = os.listdir(folder_path)
# 过滤出图片文件,假设图片文件是jpg或png格式
image_paths = [os.path.join(folder_path, f) for f in files if f.endswith('.jpg') or f.endswith('.png')]
# 确保至少有一个图片文件
if not image_paths:
print("没有找到图片文件")
exit()
# 创建视频窗口
cv.namedWindow('Video')
# 读取第一张图片以获取视频的统一尺寸
first_image = cv.imread(image_paths[0])
if first_image is None:
print(f"Error: 第一张图像 {image_paths[0]} 没有正确加载。")
exit()
# img = cv.imread('path_to_image.jpg') # 如果需要读取图片请取消注释
height, width, channels = first_image.shape
# 获取第一张图片的尺寸
height, width = first_image.shape[:2]
current_time = datetime.datetime.now()
timestamp = current_time.strftime("%Y%m%d_%H%M%S")
filename = f"output_{timestamp}.mp4"
# 创建视频编写器
fourcc = cv.VideoWriter_fourcc(*'mp4v')
out = cv.VideoWriter('E:\\Video\\' + filename, fourcc, 40.0, (width, height))
# 遍历所有的图片
for image_path in image_paths:
# 读取图像并转为灰度图像
img = cv.imread(image_path)
# 检查图像是否正确读取
if img is None:
print(f"Error: 图像 {image_path} 没有正确加载。")
continue
# 调整图像大小以匹配第一张图片的尺寸
img = cv.resize(img, (width, height))
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
gray_img_color = cv.cvtColor(gray_img, cv.COLOR_GRAY2BGR) # 将灰度图像转换为BGR格式
# 从黑到白
for i in range(256):
ret, threshold_img = cv.threshold(gray_img, i, 255, cv.THRESH_BINARY)
color_img = cv.cvtColor(threshold_img, cv.COLOR_GRAY2BGR)
cv.imshow('Video', color_img)
out.write(color_img)
if cv.waitKey(30) == 27:
break
# 创建一个与原图大小相同的全黑图像
black_img = np.zeros((height, width, channels), dtype=np.uint8)
# 逐步透露图片
for i in range(256):
# 计算当前应显示的图像
alpha = i / 255.0
revealed_img = cv.addWeighted(black_img, 1 - alpha, gray_img_color, alpha, 0)
# 显示图像
cv.imshow('Video', revealed_img)
# 写入视频帧
out.write(revealed_img)
# 按下 'Esc' 键退出循环
if cv.waitKey(30) == 27:
break
for i in range(256):
# 根据当前色值逐步补充彩色通道
colored_img = np.zeros_like(img)
colored_img[:, :, 0] = np.minimum(gray_img + i, 255)
colored_img[:, :, 1] = np.minimum(gray_img + i, 255)
colored_img[:, :, 2] = np.minimum(gray_img + i, 255)
# 显示图像
cv.imshow('Video', colored_img)
# 写入视频帧
out.write(colored_img)
# 按下 'Esc' 键退出循环
if cv.waitKey(30) == 27:
break
# 从黑白过渡到彩色原图
for i in range(1, 256):
alpha = i / 255.0
blended_img = cv.addWeighted(gray_img_color, 1 - alpha, img, alpha, 0)
cv.imshow('Video', blended_img)
out.write(blended_img)
if cv.waitKey(30) == 27:
break
# 创建一个与原图大小相同的全黑图像
black_img = np.ones((height, width, channels), dtype=np.uint8) * 255
# 逐步透露图片
for i in range(256):
# 计算当前应显示的图像
alpha = i / 255.0
revealed_img = cv.addWeighted(img, 1 - alpha, black_img, alpha, 0)
# 显示图像
cv.imshow('Video', revealed_img)
# 写入视频帧
out.write(revealed_img)
# 按下 'Esc' 键退出循环
if cv.waitKey(30) == 27:
break
# 释放视频编写器和窗口
out.release()
cv.destroyAllWindows()
解析
- 导入必要的库:
cv2
:OpenCV库,用于图像和视频处理。numpy
:用于数值计算。os
:用于文件和目录操作。datetime
:用于获取当前时间戳。
- 指定文件夹路径:
folder_path
:指定包含图片的文件夹路径。
- 读取文件夹中的所有文件名:
os.listdir(folder_path)
:获取文件夹中的所有文件名。
- 过滤出图片文件:
image_paths
:过滤出.jpg
和.png
格式的图片文件路径。
- 确保至少有一个图片文件:
- 如果没有找到图片文件,程序将退出。
- 创建视频窗口:
cv.namedWindow('Video')
:创建一个名为’Video’的窗口。
- 读取第一张图片以获取视频的统一尺寸:
first_image = cv.imread(image_paths[0])
:读取第一张图片。- 如果第一张图片没有正确加载,程序将退出。
- 获取第一张图片的尺寸:
height, width, channels = first_image.shape
:获取图片的高度、宽度和通道数。
- 创建视频编写器:
fourcc = cv.VideoWriter_fourcc(*'mp4v')
:定义视频编码器。out = cv.VideoWriter('E:\\Video\\' + filename, fourcc, 40.0, (width, height))
:创建视频编写器,指定输出路径、编码器、帧率和视频尺寸。
- 遍历所有的图片:
- 读取图像并转为灰度图像。
- 调整图像大小以匹配第一张图片的尺寸。
- 将灰度图像转换为BGR格式。
- 从黑到白逐步显示图像。
- 创建一个与原图大小相同的全黑图像。
- 逐步透露图片。
- 根据当前色值逐步补充彩色通道。
- 从黑白过渡到彩色原图。
- 创建一个与原图大小相同的全黑图像。
- 逐步透露图片。
- 释放视频编写器和窗口:
out.release()
:释放视频编写器。cv.destroyAllWindows()
:关闭所有OpenCV窗口。
API解析
- os.listdir(path):返回指定路径下的文件和文件夹列表。
- os.path.join(path, *paths):将多个路径组合后返回。
- cv.imread(filename[, flags]):读取图像文件。
- cv.namedWindow(winname[, flags]):创建一个窗口。
- cv.VideoWriter_fourcc(*fourcc):创建一个视频编码器。
- cv.VideoWriter(filename, fourcc, fps, frameSize[, isColor]):创建一个视频编写器。
- cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]):调整图像大小。
- cv.cvtColor(src, code[, dst[, dstCn]]):转换图像颜色空间。
- cv.threshold(src, thresh, maxval, type[, dst]):对图像进行阈值处理。
- cv.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]):计算两个图像的加权和。
- cv.imshow(winname, mat):在指定窗口中显示图像。
- cv.waitKey(delay):等待按键事件。
- cv.destroyAllWindows():关闭所有OpenCV窗口。
- cv.VideoWriter.write(image):将图像写入视频文件。
- cv.VideoWriter.release():释放视频编写器。