File size: 4,364 Bytes
3ee66e9
e93626d
3ee66e9
e93626d
3ee66e9
e93626d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ee66e9
e93626d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import os
import subprocess
import shutil
import pickle
import cv2
import re

# 设置提示词并获取坐标
def set_prompt_and_get_coordinates(output_video, texts=['men', 'the table']):
    if isinstance(texts, str):
        texts = texts.split(',')
        texts = [text.strip() for text in texts]
        print(texts)
    with open('/kaggle/texts.pkl', 'wb') as file:
        pickle.dump(texts, file)
    with open('/kaggle/output_video2.pkl', 'wb') as file:
        pickle.dump(output_video, file)
    command = ['python', '/kaggle/florence-sam-kaggle/kaggle_florence_gpu_2.py']
    all_ok_bboxes = subprocess.run(command, capture_output=True, text=True)
    return all_ok_bboxes

# 运行 sam2 处理
def run_sam2(output_video):
    script_path = '/kaggle/florence-sam-kaggle/kaggle_sam2_gpu_2.py'
    command = ['python3', script_path]
    sam2_output = subprocess.run(command, capture_output=True, text=True)
    print(sam2_output)
    return sam2_output

# 生成带有音频的视频
def create_video_with_audio(image_folder, input_video_path):
    image_files = [f for f in os.listdir(image_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]

    def natural_sort_key(s, _nsre=re.compile('([0-9]+)')):
        return [int(text) if text.isdigit() else text.lower() for text in re.split(_nsre, s)]

    image_files.sort(key=natural_sort_key)

    if image_files:
        first_image = cv2.imread(os.path.join(image_folder, image_files[0]))
        height, width, layers = first_image.shape
    else:
        raise ValueError("No valid images found in the folder after skipping the first one.")

    cap = cv2.VideoCapture(input_video_path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    cap.release()

    if fps <= 0:
        fps = 24  # 默认帧率

    output_video_path = os.path.join('/kaggle/working/sam2_videos/', os.path.basename(input_video_path))
    os.makedirs(os.path.dirname(output_video_path), exist_ok=True)

    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    video_writer = cv2.VideoWriter('/kaggle/image_sequence_video2.mp4', fourcc, fps, (width, height))

    for image_file in image_files:
        image_path = os.path.join(image_folder, image_file)
        frame = cv2.imread(image_path)
        video_writer.write(frame)

    video_writer.release()

    temp_video_path = '/kaggle/image_sequence_video2.mp4'
    command = [
        'ffmpeg',
        '-y',  # 覆盖输出文件
        '-i', temp_video_path,
        '-i', input_video_path,
        '-c:v', 'copy',
        '-c:a', 'copy',
        '-shortest',
        output_video_path
    ]

    try:
        subprocess.run(command, check=True)
    except subprocess.CalledProcessError as e:
        print(f"Error running ffmpeg: {e}")
        print(f"Command: {' '.join(command)}")
        raise

    print(f"Video created successfully: {output_video_path}")
    return output_video_path

import os
import re

def natural_sort_key(s):
    """生成一个用于自然排序的键"""
    return [int(text) if text.isdigit() else text.lower() for text in re.split('([0-9]+)', s)]


# 处理所有视频文件
def process_all_videos(source_dir, target_dir, image_folder):
    os.makedirs(target_dir, exist_ok=True)
    video_files = [f for f in os.listdir(source_dir) if f.endswith(('.mp4', '.avi', '.mov'))]
    video_files.sort(key=natural_sort_key)
    # 反转列表
    video_files.reverse()
    print(video_files)
    for video_file in video_files:
        video_path = os.path.join(source_dir, video_file)
        print(f"Processing video: {video_path}")

        # 设置提示词并获取坐标
        result = set_prompt_and_get_coordinates(video_path, texts="men, the table")
        print(result)

        # 运行 sam2 处理
        result = run_sam2(video_path)
        print(result.stdout)

        # 生成带有音频的视频
        output_video_path = create_video_with_audio(image_folder, video_path)
        print(f"Output video: {output_video_path}")

        # 移动处理后的视频到目标目录
        target_video_path = os.path.join(target_dir, os.path.basename(output_video_path))
        shutil.move(video_path, target_video_path)
        print(f"Moved processed video to: {target_video_path}")

# 示例调用
source_dir = '/kaggle/o_videos'
target_dir = '/kaggle'
image_folder = '/kaggle/output2'

process_all_videos(source_dir, target_dir, image_folder)