OpenCVを使ったPythonの画像処理について、VideoWriter()を使ってコーデックをVideoWriter_fourcc()で指定してwebカメラで撮影した動画ファイルを作成する処理を前回の投稿で扱いました。
ここでは、前回の投稿で保存された動画ファイルを、OpenCVを使って再生する処理を扱ってみます。
OpenCVで動画を再生する
動画ファイルを読み込んで再生するコードをエディタで書いて行きましょう。(最後にもコードをまとめておきます)
import cv2
cap = cv2.VideoCapture('images/capture.mp4')
OpenCVのライブラリをインポートして、VideoCapture()を使って、動画ファイルを読み込みます。0を指定するとwebカメラを読み込みますが、ここでは前回の投稿で保存した動画ファイルを指定しています。
if cap.isOpened()== False:
print("Error!")
isOpened()を使って初期化の確認を行います。ここではif文を使って、Falseであった時に、print()を使ってエラー表示のメッセージを出力させています。ここでのメッセージは本来ならエラー可能性のある状況を説明する方がいいですね。(ファイルが破損、ファイルパスが違うetc)
while cap.isOpened():
ret, frame = cap.read()
if ret == True:
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
whileを使って、isOpened()が成立しているとき、つまり動画ファイルが読み込めた時の処理を書いていきます。read()を使ってファイルのデータを読み込みます。読み込みが成功しているならTrueを返しますので、このretがTrueの時、imshow()で動画ファイルを表示します。if文でcv2.waitKey(1) & 0xFF == ord(‘q’)の時、breakしますが、これは前回の処理でも扱った[q]キーを押すことでの処理の終了コードです。
これまでと違って、elseでbreakするコードがあります。これは動画の再生が終了した時に自動で終わるようにするコードです。
cap.release()
cv2.destroyAllWindows()
最後に、動画ファイルを解放し、全てのフレーム閉じて終了させています。
全体のコードを表すと、次のようになります。
import cv2
cap = cv2.VideoCapture('images/capture.mp4')
if cap.isOpened()== False:
print("Error!")
while cap.isOpened():
ret, frame = cap.read()
if ret == True:
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
これを、pythonファイル形式で保存し、ターミナルから実行してみましょう。
作成した保存した動画が再生されるのがわかります。
ただし、再生された動画を見ればわかるのですが、ちょっと動きが早く再生されるのではないでしょうか。ここを次で調整します。
再生スピードの調整を行う
動画の再生スピードがこのままだと微妙に早く再生されて実態に合いません。これはコンピューターの処理するタイミングの速度が早い為に起こることのようです。
ここを調整する必要があります。それには上のコードを次のように修正することで可能になります。
import cv2
import time
cap = cv2.VideoCapture('images/capture.mp4')
fps = 25
if cap.isOpened()== False:
print("Error!")
while cap.isOpened():
ret, frame = cap.read()
if ret == True:
time.sleep(1/fps)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
コードはほとんど変わりません。違うところだけ確認しておきましょう。
時間の処理を行うのでtimeモジュールをインポートしています。
動画を読み込んだ後に変数fpsを設けて25を指定しています。これは動画を保存した時にフレームレートを25に設定したことの合わせています。
あとは、imshow()で動画を再生する前に、time.sleep()を使って処理を中断する間隔を指定します。これによって、通常より早く再生されてしまう動画を調整するわけです。その間隔をfpsの間隔で行えば調整できるので「1/fps」としています。
他の処理は同じです。
これをPythonファイルで保存してターミナルで実行すると、正常な速度で動画が再生されます。
最後に
ここでは、OpenCVを使ったPythonの画像処理について、webカメラで撮影して保存された動画ファイルを再生する処理を行いました。
webカメラを使う処理とぼぼ同じ扱いで処理できます。videoCapture()でwebカメラを指定する代わりに動画ファイルを指定し、ファイルを開くことができたかどうかをisOpened()でチェックするくらいです。
ただし、そのままだと動画が少し早く再生されるので、timeモジュールをインポートして、time.sleep()で動画ファイルのフレームレートにあった処理間隔を指定することで調整します。