视频mp4垂直拼接 水平拼接

news/2025/2/22 21:19:30

视频mp4垂直拼接 水平拼接

pinjie_v.py

python">import imageio
import numpy as np
import os
import cv2

def pinjie_v(dir1,dir2,out_dir):

    os.makedirs(out_dir, exist_ok=True)
    # 获取目录下的所有视频文件
    video_files_1 = [f for f in os.listdir(dir1) if f.endswith('.mp4')]
    video_files_2 = [f for f in os.listdir(dir2) if f.endswith('.mp4')]

    # 确保两个目录下的视频文件是同名的
    common_files = set(video_files_1).intersection(video_files_2)

    # 如果没有同名视频,退出
    if not common_files:
        print("没有同名的视频文件。")
        exit()

    for video_name in common_files:
        print(f"处理视频: {video_name}")

        # if "user-4fd103ee-38d4-43c5-bb2a-f496d2fe065e" not in video_name:
        #     continue
        # 打开视频文件
        video_path_1 = os.path.join(dir1, video_name)
        video_path_2 = os.path.join(dir2, video_name)

        reader1 = imageio.get_reader(video_path_1)
        reader2 = imageio.get_reader(video_path_2)

        # 获取视频信息(假设两个视频有相同帧数)
        fps = reader1.get_meta_data()['fps']
        num_frames = min(reader1.count_frames(), reader2.count_frames())

        # 创建输出文件
        output_path = os.path.join(out_dir, f"v_{video_name}")
        # writer = imageio.get_writer(output_path, fps=fps)
        if os.path.exists(output_path):
            continue
        outs = []
        # 逐帧处理
        for i in range(num_frames):
            frame1 = reader1.get_data(i)
            frame2 = reader2.get_data(i)

            # 获取帧的高度和宽度
            height1, width1, _ = frame1.shape
            height2, width2, _ = frame2.shape
            if height1 > width1:
                if height1 != height2:
                    y_scale = height1 / height2
                    frame2 = cv2.resize(frame2, (int(width2 * y_scale), height1), interpolation=cv2.INTER_AREA)
            elif height1 <= width1:
                if width1 != width2:
                    x_scale = width1 / width2
                    frame2 = cv2.resize(frame2, (width1, int(height2 * x_scale)), interpolation=cv2.INTER_AREA)

            if height1 > width1:
                frame = np.hstack([frame1, frame2])
            else:
                frame = np.vstack([frame1, frame2])

            outs.append(frame)
        try:
            imageio.mimsave(f'{output_path}', outs, fps=fps, macro_block_size=None)
        except Exception as e:
            print(e)
        # writer.close()
        print(f"视频 {video_name} 拼接完成,保存在 {output_path}")

if __name__ == '__main__':

    # 设置目录路径
    dir1 = r'E:\project\smpl\render_blender\linux\hmr_res'
    dir2 = r'E:\project\smpl\render_blender\linux\hmr2_res'

    dir1 = r'E:\project\smpl\render_blender\linux\val_out_depth_any_color'
    dir2 = r'E:\project\smpl\render_blender\linux\val_out_video'

    dir1 = r'E:\project\smpl\render_blender\linux\val_out_depth_any_color'
    dir2 = r'E:\project\smpl\render_blender\linux\val_out_video'

    dir1=r'E:\project\smpl\render_blender\linux\test_lbg_o'
    dir2 =r'E:\project\smpl\render_blender\linux\test_lbg6'

    out_dir = 'track_diff'
    pinjie_v(dir1,dir2,out_dir)


http://www.niftyadmin.cn/n/5862770.html

相关文章

react+typescript,初始化与项目配置

1&#xff0c;创建项目 npx create-react-app music --template typescript 2&#xff0c;配置项目别名 npm install craco/cracoalpha -D 1&#xff0c;最外层与src平级创建 craco.config.jsconst path require(path)const resolve (dir) > path.resolve(__dirname, d…

css特异性,继承性

html <div class"introduce"><div class"title">介绍</div><div class"card-box"><div class"card"><div class"title">管理</div></div></div> </div> scs…

腿足机器人之十- SLAM地图如何用于运动控制

腿足机器人之十- SLAM地图如何用于运动控制 腿足机器人SLAM地图的表示与处理全局路径规划&#xff1a;地形感知的路径搜索基于A*的三维路径规划基于RRT*的可行步态序列生成 局部运动规划&#xff1a;实时步态调整与避障动态窗口法的腿足适配模型预测控制&#xff08;MPC&#x…

CSS基础(浮动、相对定位、绝对定位、固定定位、粘性定位、版心、重置默认样式)

文章目录 1. 浮动&#xff08;float&#xff09;1.1 简介1.2 元素浮动后的特点1.3 脱离文档流示例图1.4 浮动产生的影响1.4.1 积极影响1.4.2 消极影响 1.5 解决浮动产生的影响1.5.1 清除浮动&#xff08;Clearfix&#xff09;1.5.2 创建新的块格式化上下文&#xff08;BFC&…

Blender小技巧和注意事项

1.雕刻模式如果没反应,需要将模式转换成编辑模式 2. 鼠标移到大纲 点击 小键盘的. / 大键盘句号 , 在大纲视图快速找到选中物体 3.打包图像等数据进Blender文件中,可以防止丢失

nginx配置:nginx.conf配置文件

nginx.conf配置文件说明 基本结构 全局块&#xff1a;位于最外层&#xff0c;定义影响整个Nginx服务器的设置。事件块&#xff1a;配置网络连接相关的设置。HTTP块&#xff1a;定义HTTP服务器以及反向代理、负载均衡等特性。Server块&#xff1a;定义虚拟主机&#xff0c;即响…

LeetCode 2595.奇偶位数:位运算

【LetMeFly】2595.奇偶位数&#xff1a;位运算 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-even-and-odd-bits/ 给你一个 正 整数 n 。 用 even 表示在 n 的二进制形式&#xff08;下标从 0 开始&#xff09;中值为 1 的偶数下标的个数。 用 odd 表示…

Lua C API:深入理解 lua_pushnumber 函数 — 将数字压入 Lua 栈中

在使用 Lua 与 C 进行交互时&#xff0c;Lua 提供了一套强大的 C API 来管理 Lua 状态机、操作栈上的数据。lua_pushnumber 是其中一个非常常用的函数&#xff0c;用于将一个数字值从 C 推送到 Lua 栈上。接下来&#xff0c;我们将详细讲解这个函数的用法&#xff0c;原理&…