OpenCVで動画を生成する

OpenCVで動画を生成できる。 動画を左右反転させて、新たな動画を作成してみた。

コード

# coding: utf-8
import sys
import cv2

class VideoMaker:
    def __init__(self):
        pass


    def main(self):
        # Set video names.
        input_video = sys.argv[1]
        output_video = input_video.replace('.MOV', '_flip.avi')

        # Get input video information.
        cap = cv2.VideoCapture(input_video)
        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))

        # Set output video infomation.
        fourcc = cv2.VideoWriter_fourcc(*'XVID')
        vw = cv2.VideoWriter(output_video, fourcc, fps, (width, height))  # Set the above information.

        # Make the output video.
        print('Making a video...')
        while(True):
            ret, img = cap.read()
            if ret == True:
                img_flip = cv2.flip(img, 1)  # Flip horizontal
                vw.write(img_flip)  # Add frame
            else:
                break

        # Post processing.
        cap.release()
        cv2.destroyAllWindows()


if __name__ == "__main__":
    VideoMaker().main()

解説

処理の大まかな流れは以下の通り。

  1. 入力動画の情報をゲット
  2. 出力動画の情報をセット
  3. 出力動画の生成・保存

FPSや画素数などを入出力で一致させている。 参考文献によると、コーデックはXVIDがおすすめとのこと。 MJPGX264も指定できるが、サイズが大きすぎたり小さすぎたりするらしい。 試してないけど。 vw.write(img_flip)で処理した画像を追加すれば、動画の生成と保存を同時に行ってくれる。 特に保存の必要はない。

使い方

video_maker.pyにコードを記載している。 コードと同じ場所に保存している動画(MOVファイル)を引数に指定すると、左右反転させた動画が生成される。

> python video_maker.py 2018_spring.MOV
Making a video...
>

参考文献