Open1

アノテーション動画作成用スクリプト

PINTOPINTO
rebder.py
import cv2
import numpy as np
from moviepy.editor import ImageSequenceClip

# 視認性の高い色のリスト (RGB形式)
colors = [
    (31, 119, 180), (255, 127, 14), (44, 160, 44), (214, 39, 40), (148, 103, 189),
    (140, 86, 75), (227, 119, 194), (127, 127, 127), (188, 189, 34), (23, 190, 207),
    (174, 199, 232), (255, 187, 120), (152, 223, 138), (255, 152, 150), (197, 176, 213),
    (196, 156, 148), (247, 182, 210), (199, 199, 199), (219, 219, 141), (158, 218, 229),
    (57, 59, 121), (82, 84, 163), (107, 110, 207), (156, 158, 222), (255, 127, 14)
]

# ファイルの読み込み
image_path = '000000000544.jpg'
label_path = '000000000544.txt'

# 画像を読み込む
image = cv2.imread(image_path)
image = cv2.resize(image, dsize=None, fx=2.0, fy=2.0)
height, width, _ = image.shape

# ラベルを読み込む
with open(label_path, 'r') as file:
    labels = [line.strip().split() for line in file.readlines()]

# クラスIDでソート
labels = sorted(labels, key=lambda x: int(x[0]))

# フレーム作成用リスト
frames = []

# 元の画像をコピー
base_image = image.copy()

# 前のクラスIDを追跡
previous_class_id = -1

# 各ラベルを描画してフレームを作成
for label in labels:
    class_id, x_center, y_center, bbox_width, bbox_height = map(float, label)
    class_id = int(class_id)

    # クラスIDが変更されたときにテキストを表示
    if class_id != previous_class_id:
        text_frame = base_image.copy()
        cv2.putText(text_frame, f'ClassID = {class_id}', (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 255), 3, cv2.LINE_AA)
        cv2.putText(text_frame, f'ClassID = {class_id}', (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 2, cv2.LINE_AA)

        # 3秒間のフレームを追加 (fps=30なら3秒は90フレーム)
        for _ in range(30):
            frames.append(cv2.cvtColor(text_frame, cv2.COLOR_BGR2RGB))

        previous_class_id = class_id

    # YOLOフォーマットから座標変換
    x_center *= width
    y_center *= height
    bbox_width *= width
    bbox_height *= height

    x1 = int(x_center - bbox_width / 2)
    y1 = int(y_center - bbox_height / 2)
    x2 = int(x_center + bbox_width / 2)
    y2 = int(y_center + bbox_height / 2)

    # ラベルを描画
    color = colors[class_id % len(colors)]  # 配色をループする
    cv2.rectangle(base_image, (x1, y1), (x2, y2), color, 1)

    # フレームリストに追加
    frames.append(cv2.cvtColor(base_image.copy(), cv2.COLOR_BGR2RGB))

# 最後にテキストなしの静止フレームを5秒間追加 (fps=30なら5秒は150フレーム)
final_frame = base_image.copy()
for _ in range(300):
    frames.append(cv2.cvtColor(final_frame, cv2.COLOR_BGR2RGB))

# 動画の作成
clip = ImageSequenceClip(frames, fps=60)
output_path = 'output.mp4'
clip.write_videofile(output_path, codec='libx264')

print("動画の作成が完了しました。")