电影条形码(Movie Barcode)是一种将电影的各个帧缩减并排列在一起的艺术形式,可以将整个电影的颜色调和情绪压缩到一个简单的图片中。这种条形码样式的影片总结可以给人们一个快速而全面的印象,展示出电影的整体视觉美学和颜色调度。
例如:
创建电影条形码的过程通常包括以下步骤:
-
提取电影的每一帧。电影的每一帧都是一个静止的图像,通常每秒有24帧。
-
将每一帧缩减为一个垂直的线条。这个线条的颜色是这一帧的平均颜色。
-
将所有的线条按照它们在电影中出现的顺序放置在一起。结果就是一张像条形码一样的图片。
通过这个过程,你可以看到电影的色彩变化和主要的视觉元素。这对于理解电影的美学,特别是颜色和光线如何被使用,非常有用。它也可以让你快速地比较不同电影的视觉风格。
import cv2
import numpy as np
import matplotlib.pyplot as plt
def create_movie_barcode(video_path, output_path, input_number, progressbar):
# 读取视频文件
cap = cv2.VideoCapture(video_path)
# 获取视频的总帧数
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# 创建一个空的列表来存储每一帧的平均颜色
avg_colors = []
current_frame = 0
# 在这里设置进度条的最大值
progressbar["maximum"] = total_frames
while True:
# 读取一帧
ret, frame = cap.read()
# 如果帧没有正确读取,那么我们已经到了视频的结尾
if not ret:
break
# 计算这一帧的平均颜色
avg_color_per_row = np.average(frame, axis=0)
avg_color = np.average(avg_color_per_row, axis=0)
# 将平均颜色添加到列表中
avg_colors.append(avg_color)
# 打印进度
current_frame += 1
print(f'Processing frame {current_frame} of {total_frames} ({100.0 * current_frame / total_frames:.2f}%)')
# 更新进度条的值
progressbar["value"] = current_frame
# 更新GUI
root.update()
# 关闭视频文件
cap.release()
# 创建条形码
barcode = np.zeros((input_number, len(avg_colors), 3), dtype=np.uint8)
for i, color in enumerate(avg_colors):
barcode[:, i] = color
# 将条形码保存为图片文件
plt.imshow(cv2.cvtColor(barcode, cv2.COLOR_BGR2RGB))
plt.axis('off')
cv2.imwrite(output_path, barcode)
当然我还写了一个GUI界面,我已打包,可以直接运行。直接运行exe文件,读取视频,设置纵向像素宽度即可。