この記事ではOpenCVというライブラリを使用して、動画にタイマーを追加する方法をご紹介します。
コピペだけで以下のように簡単にタイマーを動画に入れることが可能です。
この記事で分かる事
- 動画にタイマーを組み込む方法がわかります。
- コピペするだけで、簡単におしゃれなタイマーを作ることができます。
また本記事ではスクリプトの各部分も詳しく説明し、各行のコードが何をしているのか、なぜそれが必要なのかを初心者にもわかりやすく解説します。
最後には、スクリプトをカスタマイズして、自分のニーズに合わせて動画にタイマーを追加できるようになりますのぜ是非参考にしてください。
OpenCVは、”Open Source Computer Vision Library”の略で、動画に関するタスクを行うためのオープンソースのライブラリです。
Pythonで動画にカウントダウンタイマーを追加する方法
とりあえずタイマーを動画に組み込みたい方は以下のコードで実行できます!
1つ1つの箇所に説明もいれていますので、参考に数字なども変えることで設定を変更できます。
import cv2 #cv2というライブラリを読み込みます。
import numpy as np
def add_timer_to_video(video_path, output_path):
# ビデオを読み込む
cap = cv2.VideoCapture(video_path)
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))
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
total_seconds = 25*60
font = cv2.FONT_HERSHEY_COMPLEX # フォントをおしゃれに
font_scale = 6 # フォントサイズを大きくする
font_thickness = 3
color = (255, 255, 255) # Red
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# タイマーをテキストとして生成
mins, secs = divmod(total_seconds, 60)
secs = int(secs)
timer_text = "{:02d}:{:02d}".format(int(mins), secs)
# テキストのサイズを取得
(text_width, text_height), _ = cv2.getTextSize(timer_text, font, font_scale, font_thickness)
# テキストをフレームの右下に書き込む
#x = width - text_width - 60 # 10pxのマージンを右に追加
#y = height - 110 # 10pxのマージンを下に追加
#cv2.putText(frame, timer_text, (x, y), font, font_scale, color, font_thickness, lineType=cv2.LINE_AA)
# テキストをフレームの中心に配置
x = (width - text_width) // 2
y = (height + text_height) // 2
cv2.putText(frame, timer_text, (x, y), font, font_scale, color, font_thickness, lineType=cv2.LINE_AA)
# 更新後のフレームを保存
out.write(frame)
# 次の秒に進む
total_seconds -= 1/fps
cap.release()
out.release()
cv2.destroyAllWindows()
video_path = "C:/Users/obata/downloads/a.mp4"
output_path = "C:/Users/obata/デスクトップ/p2.mp4"
add_timer_to_video(video_path, output_path)
コードの解説
add_timer_to_videoという関数を使って、入力動画に25分間のカウントダウンタイマーを追加し、新しい動画として保存します。
インポート
import cv2
import numpy as np
OpenCV(cv2)とnumpyをインポートしています。
numpyはPythonのライブラリで、大量の数値データを効率的に扱ったり、数学的な計算を高速で行うための機能を提供しています。特に、ベクトルや行列などの配列計算に優れています。
関数定義
def add_timer_to_video(video_path, output_path):
add_timer_to_videoという関数を定義しています。この関数は2つの引数を持っています。
・video_path: 入力動画のパス
・output_path: タイマー付きの動画を保存するパス
動画の読み込みと基本情報の取得
cap = cv2.VideoCapture(video_path)
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))
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
ここでは入力動画を読み込み、基本情報(FPS、幅、高さ)を取得しています。また、出力動画の設定も行っています。
タイマーの設定
total_seconds = 25*60
font = cv2.FONT_HERSHEY_COMPLEX
font_scale = 6
font_thickness = 3
color = (255, 255, 255)
この部分で、タイマーとして表示するテキストの設定をしています。合計時間は25分(1500秒)です。
動画のフレームごとの処理
while cap.isOpened():
このループで、入力動画の各フレームを処理しています。
タイマーのテキストを生成
mins, secs = divmod(total_seconds, 60)
secs = int(secs)
timer_text = "{:02d}:{:02d}".format(int(mins), secs)
タイマーとして表示するテキストを生成しています。
テキストのサイズを取得
(text_width, text_height), _ = cv2.getTextSize(timer_text, font, font_scale, font_thickness)
テキストのサイズを取得しています。
テキストをフレームの中心に配置
x = (width - text_width) // 2
y = (height + text_height) // 2
cv2.putText(frame, timer_text, (x, y), font, font_scale, color, font_thickness, lineType=cv2.LINE_AA)
テキストを画像の中心に追加しています。
この数字の”2″を変えることで、タイマーを移動させることができます。
更新後のフレームを保存
out.write(frame)
更新後のフレームを出力動画に書き込んでいます。
次の秒に進む
total_seconds -= 1/fps
total_seconds -= 1/fps
リソースの解放
cap.release()
out.release()
cv2.destroyAllWindows()
動画の読み書きに使用したリソースを解放しています。
使用方法
video_path = "C:/Users/obata/downloads/a.mp4"
output_path = "C:/Users/obata/デスクトップ/p2.mp4"
add_timer_to_video(video_path, output_path)
この部分では、指定された入力動画に25分間のカウントダウンタイマーを追加し、新しい動画として保存しています。
コメント