動画保存時の画像エフェクト追加方法
概要
動画保存時の画像エフェクトを追加する機能は、リアルタイムの映像処理や分析において重要な役割を果たします。ここでは、エッジ検出が施された動画データを保存しています。エッジ検出は画像内の物体の境界線を見つけ出す技術で、物体認識やオブジェクト認識などのアプリケーションでよく使われています。
出力結果
プログラム全体
#解説1
import cv2
#解説2
# UVCカメラを開く
cap = cv2.VideoCapture(0)
#解説3
# フレームレートを取得
fps = 30
# ビデオライターを作成
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (640, 480))
#解説4
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
# 画像エフェクトを追加(ここではエッジ検出を行います)
edges = cv2.Canny(frame,100,200)
# エッジ画像をRGBに変換します
edges_colored = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)
out.write(edges_colored)
cv2.imshow('frame',edges_colored)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
#解説5
# カメラとビデオライターを解放します
cap.release()
out.release()
cv2.destroyAllWindows()
解説
解説1: ライブラリのインポート
import cv2
OpenCVは、画像処理やコンピュータビジョンのためのオープンソースライブラリです。これを使うことで、画像の読み込み、変換、保存等、画像処理に関連する多くの機能を利用することができます。
解説2: カメラの設定
# UVCカメラを開く
cap = cv2.VideoCapture(0)
ここでは、UVCカメラを開いて、その映像を取得するためのオブジェクトを作成しています。cv2.VideoCapture(0)
という関数は、引数にUVCカメラのIDを取り、そのカメラにアクセスするためのVideoCapture
オブジェクトを返しています。ここでの0
は、通常はシステムに接続されているデフォルトのカメラ(通常は内蔵カメラ)を指しますが、使用しているカメラによって割り振られる番号が異なりますのでご注意ください。
補足:OpenCVにおけるデバイスID
デバイスが複数接続された場合、このIDは、いつも同じとは限りません。デバイスの起動やシステムへの接続順によって変わることがほとんどです。 TheImagingSource社が提供しているSDK(ICImagingControl)ではカメラ本体にシリアル番号が割り振られており、カメラ毎に設定が容易にできます。詳細は下記をご覧ください。 https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/open-with-built-in-dialog.html
解説3: ビデオライターの設定
# フレームレートを取得
fps = 30
# ビデオライターを作成
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (640, 480), isColor=False)
この部分では、ビデオの保存設定を行っています。fps
はフレームレート(1秒あたりのフレーム数)を指定します。fourcc
はビデオコーデックを指定するためのもので、ここではmp4v
を指定しています。cv2.VideoWriter
はビデオを保存するためのオブジェクトを作成します。引数には保存するファイル名、コーデック、フレームレート、フレームサイズを指定します。ここで、isColor=False
と指定することで、グレースケール画像を保存する設定にすることができます。
多くのコーデックはカラー映像とグレースケール映像の両方をサポートしていますが特定のコーデックがグレースケール映像をサポートしているかどうかは、そのコーデックの仕様によります。したがって、特定のコーデックでグレースケール映像を保存する際に問題が発生する場合は、別のコーデックを試すか、映像をRGBカラー形式に変換してから保存することを検討してみてください。また、動画ファイルの互換性や再生性を確保するためには、一般的に広くサポートされているコーデック(例えばH.264('mp4v')やMJPEG('MJPG')など)を使用することが推奨されます。
解説4: フレームの読み込みとエフェクトの追加
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
# 画像エフェクトを追加(ここではエッジ検出を行います)
edges = cv2.Canny(frame,100,200)
out.write(edges)
cv2.imshow('frame',edges)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
ここでは、カメラからフレームを読み込み、エフェクトを追加して保存と表示を行っています。
cv2.Canny
はCannyエッジ検出を行う関数で、エッジ(物体の境界)を検出します。検出したエッジ画像はグレースケール画像なので、cv2.cvtColor
を使ってRGB画像に変換してから保存と表示を行っています。
まず、while(cap.isOpened()):
は、ビデオキャプチャが開いている間、ループを続けることを指定し、次にret, frame = cap.read()
でビデオキャプチャからフレームを読み込みます。
ret
はフレームの読み込みが成功したかどうかを示すブール値で、frameは読み込んだフレームの画像データで、if ret==True:
でret
を参照することでフレームの読み込みが成功した場合のみ、次の画像処理に進みます。
edges = cv2.Canny(frame,100,200)
では、Cannyエッジ検出を使用してフレームのエッジを検出します。100と200は閾値で、これらの値はエッジ検出の感度を調整します。
最後にout.write(edges)
で、エッジ検出が行われたフレームをビデオファイルに書き込み、cv2.imshow('frame',edges)
で、エッジ検出が行われたフレームを画面に表示します。
if cv2.waitKey(1) & 0xFF == ord('q'):
この行は、キーボードの'q'キーが押されたらループを抜けることを指定しています。
解説5: リソースの解放
# カメラとビデオライターを解放します
cap.release()
out.release()
cv2.destroyAllWindows()
最後に、カメラデバイスとビデオライターを解放し、OpenCVのウィンドウを閉じています。これらのリソースは、プログラムが終了するときに必ず解放する必要があります。これを怠ると、リソースが不足したり、次回プログラムを実行するときに問題が生じる可能性があります。