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

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

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

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

python 复制代码
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,使用以下命令安装:

python 复制代码
pip install pyqt5 opencv-python

运行效果:

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

小结下:

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

相关推荐
用户83562907805112 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户83562907805112 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
你好潘先生20 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师20 小时前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码20 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf21 小时前
FastAPI 如何连接 MySQL
后端·python
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780511 天前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent2 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6252 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python