Python实现图片转视频:基于PyQt5和OpenCV的可视化工具

发布于:2024-12-06 ⋅ 阅读:(31) ⋅ 点赞:(0)

最近发现有一个需求,就是将大量图片转化为视频MP4,然后动手写一个脚本完成这个需求,记录下。

我们需要创建一个可视化界面,允许用户选择文件夹,选择文件夹后获取其中的图片,并将这些图片转换为MP4格式的视频。最终生成的视频将保存到根目录下。

下面是一个完整的解决方案,使用PyQt5实现可视化界面,OpenCV库用于处理图像和视频转换。

import os
import cv2
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLineEdit, QFileDialog, QLabel
from PyQt5.QtCore import Qt

class ImageToVideoApp(QWidget):
    def __init__(self):
        super().__init__()
        
        # 初始化界面元素
        self.setWindowTitle('图片转视频工具')
        self.setGeometry(100, 100, 400, 200)
        
        self.layout = QVBoxLayout()

        # 创建选择文件夹按钮
        self.folder_button = QPushButton('选择文件夹', self)
        self.folder_button.clicked.connect(self.select_folder)

        # 创建显示选择的文件夹路径的框
        self.path_display = QLineEdit(self)
        self.path_display.setPlaceholderText('选择文件夹后显示路径...')
        self.path_display.setReadOnly(True)

        # 创建合成按钮
        self.combine_button = QPushButton('一键合成视频', self)
        self.combine_button.clicked.connect(self.combine_images_to_video)

        # 创建信息标签
        self.info_label = QLabel('', self)

        # 添加控件到布局
        self.layout.addWidget(self.folder_button)
        self.layout.addWidget(self.path_display)
        self.layout.addWidget(self.combine_button)
        self.layout.addWidget(self.info_label)

        # 设置布局
        self.setLayout(self.layout)

    def select_folder(self):
        folder = QFileDialog.getExistingDirectory(self, '选择文件夹')
        if folder:
            self.path_display.setText(folder)

    def combine_images_to_video(self):
        folder_path = self.path_display.text()
        if not folder_path or not os.path.isdir(folder_path):
            self.info_label.setText('请选择有效的文件夹!')
            return

        # 获取文件夹中的图片文件
        images = [f for f in os.listdir(folder_path) if f.lower().endswith(('png', 'jpg', 'jpeg', 'bmp', 'gif'))]
        images.sort()  # 排序,确保图片按顺序合成视频

        if not images:
            self.info_label.setText('该文件夹中没有图片!')
            return

        # 获取第一张图片的尺寸来设置视频的分辨率
        first_image = cv2.imread(os.path.join(folder_path, images[0]))
        height, width, _ = first_image.shape
        
        # 输出视频路径:将视频保存为同一文件夹中的 'output_video.mp4'
        video_path = os.path.join(folder_path, "output_video.mp4")

        # 使用OpenCV创建视频写入对象
        fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 编码方式
        video_writer = cv2.VideoWriter(video_path, fourcc, 1, (width, height))  # 每秒1帧

        # 将每张图片写入视频
        for image_file in images:
            image_path = os.path.join(folder_path, image_file)
            image = cv2.imread(image_path)
            video_writer.write(image)

        video_writer.release()  # 释放视频写入对象
        self.info_label.setText(f'视频已成功生成!保存路径: {video_path}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = ImageToVideoApp()
    window.show()
    sys.exit(app.exec_())

代码解析:

  1. 窗口界面:我们使用PyQt5创建了一个窗口。

  2. 选择文件夹:点击选择文件夹按钮时,打开文件夹选择对话框,选定文件夹后,路径显示框会显示选中的路径。

  3. 图片合成视频:点击一键合成按钮时,程序会:

    • 获取文件夹中的所有图片。
    • 使用OpenCV将这些图片按顺序合成一个视频,并将其保存在根目录下,命名为output_video.mp4
    • 视频使用MP4编码格式。
  4. 视频生成

    • cv2.VideoWriter用于创建一个视频文件,设置视频的编码格式、帧率和分辨率(根据第一张图片的尺寸)。
    • video_writer.write(image)用于将每一张图片写入视频。

依赖库安装:

需要安装PyQt5OpenCV,使用以下命令安装:

pip install pyqt5 opencv-python

 运行效果:

  1. 运行程序后,点击“选择文件夹”按钮,选择包含图片的文件夹。
  2. 点击“一键合成视频”按钮,程序会将文件夹中的图片合成视频,保存为MP4格式到用户根目录下。

小结下:

介绍了如何使用 Python 中的 PyQt5OpenCV 库,实现一个图形化界面工具,将文件夹中的图片转化为 MP4 格式的视频。

 


网站公告

今日签到

点亮在社区的每一天
去签到