🐸
OpenCVを使ったクロマキー処理と透過動画の保存
はじめに
動画編集の際に「グリーンバック」を使ったクロマキー処理は広く利用されています。一般的にはffmpeg
だけを使って処理することが可能ですが、今回はPythonのOpenCVを使って、クロマキー処理をより柔軟に行う方法を紹介します。
ffmpegだけでクロマキー処理を行う方法
ffmpeg
は、透過背景付き動画を処理するために強力なツールです。例えば、ffmpeg
コマンドを使って単純にグリーンバックを除去し、透明な動画を作成する場合、次のようなコマンドがよく使用されます。
ffmpeg -i input.mp4 -vf "chromakey=0x00FF00:0.1:0.2" -c:v qtrle output.mov
上記のコマンドは、chromakey
フィルタを使用してグリーン(0x00FF00
)を指定し、透明化を行っています。しかし、この方法は柔軟性が少なく、特に背景の色が不均一な場合や、エッジの処理に細かい調整が必要な場合に難しい点があります。
OpenCVを使うメリット
PythonとOpenCVを使用すると、クロマキー処理をより細かく制御できます。例えば、以下のような利点があります。
-
高度なエッジ処理:
cv2.erode
やcv2.dilate
を使用することで、マスクのエッジを滑らかにし、不要なノイズを取り除くことができます。 - カスタマイズ性: OpenCVを使うことで、任意の条件に応じてマスクを動的に生成し、必要に応じて他の画像処理テクニックを組み合わせることが可能です。
- スピル除去: 被写体に反射したグリーン色(スピル)を取り除く処理が容易に行え、より自然な映像を得ることができます。
これにより、OpenCVは高度なクロマキー処理において非常に強力なツールとなります。
コードサンプル
次に、OpenCVを使用してグリーンバックを除去し、透過背景の動画を作成する具体的なコードを紹介します。
import cv2
import numpy as np
cap = cv2.VideoCapture('green_background_video.mp4')
kernel = np.ones((3, 3), np.uint8)
frame_number = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# グリーンの範囲指定とマスク
lower_green = np.array([34, 100, 20])
upper_green = np.array([85, 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
# マスクのエッジ処理とぼかし
mask_eroded = cv2.erode(mask, kernel, iterations=1)
mask_dilated = cv2.dilate(mask_eroded, kernel, iterations=1)
mask_blurred = cv2.GaussianBlur(mask_dilated, (5, 5), 0)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA)
# スピル除去
frame[:, :, 1] = cv2.subtract(frame[:, :, 1], mask_blurred // 2)
# グリーンを除去し、背景を透明に設定
frame[mask_blurred != 0] = [0, 0, 0, 0]
cv2.imwrite(f'frame_{frame_number:04d}.png', frame)
frame_number += 1
cap.release()
cv2.destroyAllWindows()
動画のエクスポート
保存されたPNGフレームをffmpeg
でMOV形式に変換する方法です。
ffmpeg -r 30 -i frame_%04d.png -vcodec prores_ks -pix_fmt yuva444p10le output_video.mov
これで、グリーンバックの透過動画を簡単に作成することができます。
結論
OpenCVを使うことで、動画のクロマキー処理がより柔軟かつ高度に行えることがわかります。ffmpeg
のみでの処理に比べ、ノイズ除去やエッジ処理、さらにはスピル除去といったカスタマイズが可能です。
Discussion