Open1
アノテーション動画作成用スクリプト
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("動画の作成が完了しました。")