首页 > 编程语言 >python将图片添加到视频底层中(提高处理单个视频的效率)

python将图片添加到视频底层中(提高处理单个视频的效率)

时间:2024-04-28 17:00:57浏览次数:28  
标签:视频 python image cv2 video path folder frame 底层

代码:

 

import cv2
import numpy as np
import os
import random
from concurrent.futures import ThreadPoolExecutor

# 图片文件夹路径
image_folder_path = r'F:\jingguan\tu'
# 视频文件所在的文件夹路径
video_folder_path = r'F:\jingguan\yuan'
# 输出视频文件夹路径
output_folder_path = r'F:\jingguan\hou'

# 确保输出文件夹存在
os.makedirs(output_folder_path, exist_ok=True)

# 从图片文件夹中随机选择一张图片
image_files = [f for f in os.listdir(image_folder_path) if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
if not image_files:
    print("图片文件夹中未找到图片。")
    exit()

random_image_file = random.choice(image_files)
random_image_path = os.path.join(image_folder_path, random_image_file)
print(f"选定用于叠加的图片:{random_image_file}")

# 读取图片并进行预处理
image = cv2.imread(random_image_path, cv2.IMREAD_UNCHANGED)
if image is None:
    print(f"图片加载失败:{random_image_path}")
    exit()

# 确保图片以 np.uint8 类型读取
if image.dtype != np.uint8:
    image = image.astype(np.uint8)

# 将图片转换为与视频兼容的格式
image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGR).astype(np.uint8)

def process_frame(frame, image, alpha):
    # 确保 image 大小与 frame 一致
    image_resized = cv2.resize(image, (frame.shape[1], frame.shape[0]), interpolation=cv2.INTER_AREA)
    # 将图片以半透明的方式叠加到视频帧上
    return cv2.addWeighted(frame, 1, image_resized, alpha, 0)

def process_video(video_file, image, alpha):
    # 构建完整的视频路径
    video_path = os.path.join(video_folder_path, video_file)
    # 构建完整的输出视频路径
    output_video_path = os.path.join(output_folder_path, video_file)

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

    # 获取视频的帧率和尺寸
    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))

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

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

        # 使用多线程处理帧
        with ThreadPoolExecutor() as executor:
            future = executor.submit(process_frame, frame.copy(), image, alpha)
            processed_frame = future.result()

        out.write(processed_frame)

    # 释放资源
    cap.release()
    out.release()
    print(f"完成处理 {video_file}")

# 设置图片的透明度
alpha = 0.0  #0.0到1.0

# 遍历并处理视频文件夹中的所有视频文件
for video_file in os.listdir(video_folder_path):
    if video_file.lower().endswith(('.mp4', '.avi', '.mov', '.mkv')):
        process_video(video_file, image, alpha)

 

 

代码2

import cv2
import numpy as np
import os
import random

# 图片和视频文件夹路径
image_folder_path = r'F:\jingguan\tu'
video_folder_path = r'F:\jingguan\yuan'
output_folder_path = r'F:\jingguan\hou'

# 确保输出文件夹存在
os.makedirs(output_folder_path, exist_ok=True)

# 随机选择一张图片
image_files = [f for f in os.listdir(image_folder_path) if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
if not image_files:
    print("图片文件夹中未找到图片。")
    exit()

random_image_file = random.choice(image_files)
random_image_path = os.path.join(image_folder_path, random_image_file)
print(f"选定用于叠加的图片:{random_image_file}")

# 读取图片
image = cv2.imread(random_image_path, cv2.IMREAD_UNCHANGED)
if image is None:
    print(f"图片加载失败:{random_image_path}")
    exit()

# 将图片转换为与视频兼容的格式
image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGR).astype(np.uint8)

# 遍历并处理视频文件夹中的所有视频文件
for video_file in os.listdir(video_folder_path):
    if video_file.lower().endswith(('.mp4', '.avi', '.mov', '.mkv')):
        video_path = os.path.join(video_folder_path, video_file)
        output_video_path = os.path.join(output_folder_path, video_file)

        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))

        # 将图片缩放到视频帧的尺寸
        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
        while True:
            ret, frame = cap.read()
            if not ret:
                break

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

            out.write(frame)

        cap.release()
        out.release()
        print(f"完成处理 {video_file}")

 

标签:视频,python,image,cv2,video,path,folder,frame,底层
From: https://www.cnblogs.com/jingzaixin/p/18164051

相关文章

  • 支持向量机的算法原理与Python实现
    支持向量机(SupportVectorMachine,SVM)是一种强大的监督学习算法,用于分类和回归任务。其核心思想是在高维空间中找到一个最优的超平面,将不同类别的数据分开。SVM的关键在于找到支持向量,即离超平面最近的数据点,这些支持向量决定了超平面的位置和方向。SVM通过最大化支持向量与超平面......
  • Python工具箱系列(五十二)
    haod使用EXIF信息对相片进行定位打开华为手机的图库,你会发现已经自动进行人脸识别,相片的归类与聚合等工作,甚至于还可以进行一步根据场景来搜索。当然这些肯定是在用户同意的前提下,对图片进行了操作与计算。事实上,当拿出手机进行拍照的这一刻,很多信息已经记录在案,这就是EXIF信息。......
  • 自动驾驶半实物仿真平台设计方案:827-8路GMSL视频注入回灌的自动驾驶半实物仿真平台
    8路GMSL视频注入回灌的自动驾驶半实物仿真平台一、平台介绍   产品基于8路GMSL视频注入回灌的自动驾驶半实物仿真平台旨在提高实验室及研究生院师生在基础软件层开发、计算机视觉和深度学习方面的专业知识学习和实践能力,为师生提供一个稳定软件开发和多精度框......
  • day26-python操作MySQL和实战
    1.事务innodb引擎中支持事务,myisam不支持。CREATETABLE`users`(`id`int(11)NOTNULLAUTO_INCREMENTPRIMARYKEY,`name`varchar(32)DEFAULTNULL,`amount`int(11)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8;例如:李杰给武沛齐转账100,那就会......
  • python修改pip的cache默认文件夹
    之前一直没管,默认会在c盘,越来越大修改pip.ini之前写过一篇关于pip.ini的文章https://www.cnblogs.com/qcy-blog/p/17789058.htmlcache文件夹要存在[global]cache-dir=D:\pip\cache查看是否更改成功pipcachedir......
  • Python操作SAP时候遇到的一些常见问题
    1,每次使用程序去操作SAP时候,都会提示有脚本在AttachSAPGUI窗口A:可以修改在SAPGUIConfiguration中的设置,取消该提示 2,使用程序去操作SAP的时候,SAP无法找到Edit窗口,不会输入SAP系统A:可能是误点了下图的CommentField,这样会出现下面的Comment窗口。但是这个和填写S......
  • Python高阶--装饰器
    importtimedeftimer(func):defgf():start_time=time.time()func()end_time=time.time()print('func运行的时间为:',end_time-start_time)returngfdeffoo():time.sleep(3)print('infoo')foo=timer(foo)foo()以上等价于importtimedef......
  • python爬取指定网址图片代码
    代码importosimportrequestsfrombs4importBeautifulSoup#指定要爬取的网址url='https://www.baidu.com/'#请求网页内容response=requests.get(url)response.raise_for_status()#如果请求失败,将抛出异常#使用BeautifulSoup解析网页内容soup=Beautif......
  • python将图片添加到视频底层中
    代码:importcv2importnumpyasnpimportosimportrandom#图片文件夹路径image_folder_path='path_to_your_images_folder'#视频文件所在的文件夹路径video_folder_path='path_to_your_videos_folder'#输出视频文件夹路径(如果不存在则创建)output_folder_pat......
  • python篇--创建桌面快捷方式
    创建快捷方式import osfrom win32com.client import Dispatchdef create_shortcut(target_path, shorcut_path):    shell = Dispatch('WScript.Shell')    shortcut = shell.CreateShortcut(shorcut_path)    shortcut.TargetPath = target_path    ......