python 横切或竖切视频画面

通过代码把视频画面水平横切或垂直竖切。

参数

在脚本中,split_mode 参数用来指定视频是如何被切分的:

‘horizontal’: 表示视频将被水平切分。这意味着每个视频帧被分割成上下两部分。通常,这适用于需要分析视频的上半部或下半部的场景,比如在监控摄像头录像中只关注地面或天空的部分。

‘vertical’: 表示视频将被竖直切分。这意味着每个视频帧被分割成左右两部分。这种切分方式适用于视频内容在左右两侧差异较大时,例如在某些体育赛事中,你可能只需要关注场地的一半。

安装库

pip install opencv-python
pip install tqdm

运行代码

import cv2
import os
from glob import glob
from tqdm import tqdm
 
def process_videos(video_dir, split_mode='horizontal'):
    video_files = glob(os.path.join(video_dir, '*.mp4'))  # 获取所有mp4视频文件
 
    for video_file in tqdm(video_files, desc="Processing Videos"):
        cap = cv2.VideoCapture(video_file)
        if not cap.isOpened():
            print(f"Error: Could not open video {video_file}.")
            continue
 
        frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 获取视频帧总数
        fps = int(cap.get(cv2.CAP_PROP_FPS))
        width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
        height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
        
        if split_mode == 'horizontal':
            mid_point = height // 2
            out1 = cv2.VideoWriter(video_file.replace('.mp4', '_top.mp4'), cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, mid_point))
            out2 = cv2.VideoWriter(video_file.replace('.mp4', '_bottom.mp4'), cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, mid_point))
        else:
            mid_point = width // 2
            out1 = cv2.VideoWriter(video_file.replace('.mp4', '_left.mp4'), cv2.VideoWriter_fourcc(*'mp4v'), fps, (mid_point, height))
            out2 = cv2.VideoWriter(video_file.replace('.mp4', '_right.mp4'), cv2.VideoWriter_fourcc(*'mp4v'), fps, (mid_point, height))
 
        frame_update_interval = 10  # 设置进度条更新频率
        frame_counter = 0  # 帧计数器
 
        # 使用 tqdm 来更新进度条
        with tqdm(total=frame_count, desc=f"Processing {os.path.basename(video_file)}", leave=False) as pbar:
            while True:
                ret, frame = cap.read()
                if not ret:
                    break
 
                if split_mode == 'horizontal':
                    out1.write(frame[:mid_point, :])
                    out2.write(frame[mid_point:, :])
                else:
                    out1.write(frame[:, :mid_point])
                    out2.write(frame[:, mid_point:])
                
                frame_counter += 1
                if frame_counter % frame_update_interval == 0 or frame_counter == frame_count:
                    pbar.update(frame_update_interval if frame_counter % frame_update_interval == 0 else frame_counter % frame_update_interval)
 
        cap.release()
        out1.release()
        out2.release()
 
if __name__ == "__main__":
    video_dir = r'F:\mp4'
    process_videos(video_dir, split_mode='vertical')  # 'horizontal' 或 'vertical'