#はじめに
唐突に画像と動画を加工してみたくなり、VisualStudio2017でPython3/OpenCVを使ってみました。
この記事の続きです。
VisualStudio2017で、Python3/OpenCVを使って画像を表示する
#実装
##やったこと
###実装した処理
・動画を読み込む
・縦100px, 横200px を切り取る
・動画を表示
・動画を保存
※gif形式では動画の入出力ができなかったので、手動でavi形式とgif形式の変換を行いました。
##サンプルソース
import numpy as np
import cv2
#任意のパスを指定
clip = cv2.VideoCapture("sample\path\sample_clip.avi")
#読み込んだ動画の情報を取得
clipFps = clip.get(cv2.CAP_PROP_FPS)
clipHeight = clip.get(cv2.CAP_PROP_FRAME_HEIGHT)
clipWidth = clip.get(cv2.CAP_PROP_FRAME_WIDTH)
#対応してないコーデックを指定すると、上手く動画が出力されない
codec = cv2.VideoWriter_fourcc(*'DIVX')
#出力する動画の情報を指定
editedClipHeight = 100
editedClipWidth = 200
#出力先の任意のパスを指定
outputPathAndFilename = 'sample\path\output.avi'
#出力する動画の解像度と指定した解像度がずれると、上手く動画が出力されない
clipWriter = cv2.VideoWriter(outputPathAndFilename, codec, clipFps, (editedClipWidth, editedClipHeight))
while(clip.isOpened()):
ret, frame = clip.read()
if ret == True:
#左上を起点に、[縦100px, 横200px]を切り出す
editedClip = frame[0:editedClipHeight,0:editedClipWidth]
clipWriter.write(editedClip)
cv2.imshow('SampleClip', editedClip)
#[ q ]を押すと表示が終了する
if cv2.waitKey(25) & 0xFF == ord('q'):
break
clip.release()
clipWriter.release()
cv2.destroyAllWindows()
##はまったポイント
何も考えずに下記のソースをコピペしたら、動画が上手く保存できなかったので備忘。
動画を保存する — 動画を扱う — OpenCV-Python Tutorials 1 documentation
下記の現象が発生していましたが、設定しなおすことで解決しました。
ファイルは出力される。
しかし、再生しようとしても動画が流れない。
ファイルプロパティを確認すると、サイズが小さい。
他の解決策をご存知の方がいれば、教えていただきたいです。
###1. 対応していないコーデックを指定している
#対応してないコーデックを指定すると、上手く動画が出力されない
codec = cv2.VideoWriter_fourcc(*'DIVX')
環境によって利用可能なコーデックが異なるようです。
###2. 出力する動画の解像度と、VideoWriterで指定した解像度が違う
#出力する動画の解像度と指定した解像度がずれると、上手く動画が出力されない
clipWriter = cv2.VideoWriter(outputPathAndFilename, codec, clipFps, (editedClipWidth, editedClipHeight))