見出し画像

OpenCVとPythonでUSBカメラの録画保存をしたところ、ごく微妙にはまった件

録画保存をしようとした経緯

一日、家を留守にすることとなり、ペットの様子や家の様子が気になったので。わざわざ専用の監視カメラを購入するほどでもなく、リアルタイムで見れなくても録画しておこうと思ったのがきっかけ。

参考サイト

コード全文

USBカメラを接続したうえで実行

import cv2
# 動画ファイルを取得
cap = cv2.VideoCapture(0)   

# FPSを取得
fps = int(cap.get(cv2.CAP_PROP_FPS)) 
  
# カメラの横幅を取得               
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) 
# カメラの縦幅を取得
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))        

# 動画保存時のfourcc設定(mp4用)
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') 

# 動画の仕様をまとめる(ファイル名、fourcc, FPS, サイズ)
writer = cv2.VideoWriter('video.m4v', fourcc, fps, (w, h))  
 
# 撮影=ループ中にフレームを1枚ずつ取得(qキーで撮影終了)
while True:
  #フレームをcapから取得
    ret, frame = cap.read()   
  # フレームを画面に表示    
    cv2.imshow('video', frame)
  # 動画を保存
    writer.write(frame)
    # キー操作があればwhileループを抜ける
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
# 撮影用オブジェクトとウィンドウの解放
writer.release()
cap.release()
cv2.destroyAllWindows()

ポイント①:動画のコーデック

# 動画保存時のfourcc設定(mp4用)
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') 

ちょっと引数の書き方が独特で一瞬「?」となりました。これはOpenCVのコーディング設定方法のようです。

上記の参考サイトによると、このようになるようです。

コーデック名 引数 拡張子
MP4S ('M', 'P', '4', 'S') .mp4
MP4V ('M', 'P', '4', 'V') .mp4
DIV3 ('D', 'I', 'V', '3') .avi
DIVX ('D', 'I', 'V', 'X') .avi
IYUV ('I', 'Y', 'U', 'V') .avi
MJPG ('M', 'J', 'P', 'G') .avi
XVID ('X', 'V', 'I', 'D') .avi
H263 ('H', '2', '6', '3') .wmv
mp4v ('m', 'p', '4', 'v') .mo

OpenCVの動画コーデック

ポイント②:動画の仕様

# 動画の仕様をまとめる(ファイル名、fourcc, FPS, サイズ)
writer = cv2.VideoWriter('video.mp4', fourcc, fps, (w, h)) 

ファイルに保存する際は、「ファイル名、コーデック, FPS, 画像サイズ」が必要となりますので、これらをVideoWriterの引数に渡す必要があります。この辺は静止画にない動きですね。

ポイント③:動画の保存で少しはまる

  # 動画を保存
    writer.write(frame)

で保存できるわけですが、試しに保存したmp4動画を確認したところ、


真っ暗でした・・・

いろいろ設定を見直したり、下記サイトにあるように、ffmpegの設定を見直したりと…

結論:writer.release()を忘れると映像は真っ黒になる

writer.release()で動画の保存形式もリリースする必要があることが抜けていました。

# 撮影用オブジェクトとウィンドウの解放
writer.release()
cap.release()
cv2.destroyAllWindows()

静止画ですと下二行だけで済んでしまうので…。

ffmpegなどもトラブルの原因として成り得るでしょうが、動画の保存形式をリリースすることも忘れないようにしましょうね。動画が真っ暗になったひとはぜひチェックを!

この記事が気に入ったらサポートをしてみませんか?