随笔 - 633,  文章 - 0,  评论 - 13,  阅读 - 48万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

代码:

 

复制代码
import cv2
import numpy as np
import os
import random
from tqdm import tqdm

# 图片文件夹路径
image_folder_path = r'F:\jingguan\tu'

# 视频文件所在的文件夹路径
video_folder_path = r'F:\jingguan\yuan'

# 输出视频文件夹路径(如果不存在则创建)
output_folder_path = r'F:\jingguan\hou'
if not os.path.exists(output_folder_path):
    os.makedirs(output_folder_path)

# 确保图片文件夹路径存在
if not os.path.exists(image_folder_path):
    print("图片文件夹路径不存在。")
else:
    # 获取图片文件夹中所有图片文件的列表
    image_files = [f for f in os.listdir(image_folder_path) if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
    if not image_files:
        print("图片文件夹中未找到图片。")
    else:
        # 随机选择一张图片
        random_image_file = random.choice(image_files)
        random_image_path = os.path.join(image_folder_path, random_image_file)
        print(f"选定用于叠加的图片:{random_image_file}")

# 确保视频文件夹路径存在
if not os.path.exists(video_folder_path):
    print("视频文件夹路径不存在。")
else:
    # 遍历视频文件夹中的所有视频文件
    for video_file in tqdm(os.listdir(video_folder_path), desc="Processing Videos", unit="video"):
        if video_file.lower().endswith(('.mp4', '.avi', '.mov', '.mkv')):
            print(f"正在处理视频:{video_file}")

            # 视频文件的完整路径
            video_path = os.path.join(video_folder_path, video_file)

            # 输出视频文件的完整路径,保存到新的输出文件夹中
            output_video_path = os.path.join(output_folder_path, video_file)

            # 打印视频路径信息
            print(f"视频文件路径:{video_path}")
            print(f"输出视频路径:{output_video_path}")

            # 尝试读取随机选择的图片
            image = cv2.imread(random_image_path)
            if image is None:
                print(f"图片加载失败:{random_image_path}")
                continue

            # 尝试打开视频文件
            cap = cv2.VideoCapture(video_path)
            if not cap.isOpened():
                print(f"视频打开失败:{video_path}")
                continue

            # 获取视频的帧率和尺寸
            fps = cap.get(cv2.CAP_PROP_FPS)
            frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
            frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
            total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 获取总帧数

            # 将图片缩放到视频帧的尺寸
            image = cv2.resize(image, (frame_width, frame_height), interpolation=cv2.INTER_AREA)

            # 创建视频写入对象
            fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 视频编解码器
            out = cv2.VideoWriter(output_video_path, fourcc, fps, (frame_width, frame_height), isColor=True)

            # 设置图片的透明度
            alpha = 0.0  # 可以调整这个值 范围在0.0到1.0之间

            # 初始化已处理帧数的计数器
            processed_frames = 0

            # 处理视频的每一帧
            while True:
                ret, frame = cap.read()
                if not ret:
                    break

                # 将图片以半透明的方式叠加到视频帧上
                frame = cv2.addWeighted(frame, 1, image, alpha, 0)

                # 将处理后的帧写入输出视频
                out.write(frame)
                processed_frames += 1  # 增加已处理帧数的计数

                # 打印处理进度
                print(f"\r处理帧 {processed_frames}/{total_frames}", end='')

            # 释放视频读取和写入对象
            cap.release()
            out.release()

            # 打印完成信息
            print(f"\n完成处理 {video_file}")

        else:
            print(f"跳过文件:{video_file}(不支持的格式)")
复制代码

 

posted on   大话人生  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2022-04-28 人脸训练
2020-04-28 Vue -路由(Vue -Router)
2020-04-28 Vue常用的UI组件-Elment(PC端Vue组件库)(饿了么组件)(推荐)
2020-04-28 Vue常用的UI组件-ant-design-vue
2020-04-28 Vue常用的UI组件-Mint UI(移动端Vue组件库)(饿了么组件)
2020-04-28 Vue常用的UI组件-vant(轻量、可靠的移动端Vue组件库)(推荐)
点击右上角即可分享
微信分享提示