🦔

cv2.VideoCaptureでJupyter Notebook上に動画を1フレームずつ表示をする

2023/02/17に公開

はじめに

こんにちは!すだです!
私は普段はメーカーで画像認識 AI の研究開発を行うエンジニアをしつつ、空き時間にはプログラミングのメンターとして、画像認識 AI を中心に Deep Learning を教えています。

普段の業務では、動画をcv2.VideoCaptureなどで 1 フレームずつ読み込んで、画像処理をして、その結果を動画として保存することも多いのですが、Jupyter Notebook 上で、

  1. 動画ファイルを作成
  2. 動画ビューワで結果を確認

という流れがとても面倒です。
特に画像処理結果を可視化する時にデザインを細かく調整したいときなんかは、結構な苦痛になります。

今回は Jupyter Notebook 上で 1 フレームずつ結果を表示したい際に、便利な方法をお伝えします!

方法

import time
import cv2
from IPython.display import display, Image, clear_output

def imshow(img):
    _, buf = cv2.imencode(".jpg", img)
    display(Image(data=buf.tobytes()))
    clear_output(wait=True)

reader = cv2.VideoCapture('video
.mp4')
fps = reader.get(cv2.CAP_PROP_FPS)

while True:
    try:
        st = time.time()

        # フレームの読み込み
        ret, frame = reader.read()
        if not ret:
            break

        # frameに何らかの処理(例, ガウシアンブラー)
        frame = cv2.GaussianBlur(frame, (5, 5), 3)

        # 表示
        imshow(frame)

        elapsed_time = time.time() - st

        # 入力動画のFPSに合わせて表示間隔を調整する
        if elapsed_time < 1 / fps:
            time.sleep(1 /fps - elapsed_time)

    # ■interupt the kernelが押されたらbreakしてreader.release()を実行
    except KeyboardInterrupt:
        break

reader.release()

imshow()はここに僕が書いた記事をご参照ください。

https://zenn.dev/jizai_labo/articles/230214_imshow

結果

こんな感じになります。
video_show_result

まとめ

cv2.VideoCapture などでなどで読み込んだ動画を Jupyter Nootebook 上で 1 フレームずつ表示する方法を解説しました。
デモ動画作りの際などにご活用ください!

Discussion