監視カメラの時系列JPEG画像をmp4動画にする方法。写真の確認作業を効率的に!
こんにちは!
しずかなかずしです。
設置した監視カメラ。画像の確認してますか?
何の目的も持たずに監視カメラを設置することってないですよね?
大抵は、自分がその場にいなかった時に起こる「何か」を知りたくて設置するものです。
そんな監視カメラの仕組みで便利なのが「動き検出機能」です。
動きがあった時だけ、パシャリ、と撮ってくれる便利な機能です。
しかし、撮られた写真の数が多くなって来ると見るのが大変。静止画を便利に見るにはサムネイル一覧などで効率よくチェックする手もあります。
でも、考えて見てください。
定点で撮った写真100枚のサムネイルを並べたところで、ほぼ同じような画像が並びます。
変化があって撮られた画像でも、場合によっては、ほとんど変化がわからない。そんなサムネイルが一覧になってしまいます。結果、自分が見つけたいものがなかなか見つからないのです。
また、長期間の変化は事象が起こった時系列でみたいものです。たとえ動きがあった時だけの写真の一覧でも、見比べたときに、何が変わったのか気づきにくいものです。
と言うことで、動き検出で撮った写真を並べて動画にしてしまいます。
静止画を動画にする方法
PythonのOpenCVというLibraryを使うと割と簡単にjpegファイルを動画(mp4)に変換してくれます。
OpenCVでは、動画のフレームレートも指定できます。今回の用途からするとあまり高いフレームレートは必要ないですが、Libraryから指定できるのはありがたいです。
一つのフォルダにファイルが規則的に並んで保存されていれば、数行プログラムを書けば、目的を達成することができます。
まずは、OpenCVのインストールです。Pythonのpipコマンドで以下のようにインストールすることができます。簡単です。
$ pip install opencv-python
続いて、最短の、JPEG静止画を動画にするプログラムです。
一つのフォルダにJPEGファイルのみ、時間を含んだファイル名で撮影順番に保存されている事を想定しています。JPEGファイルの表示サイズ(ピルセル数)は全てのファイルで共通。少し特殊ケースですが、ちゃんと動きます。
import cv2
import os
directory_name = "/home/xxxx/Camera_blog/20190601/images"
width = 1280
height = 720
fps = 20.0
frames_per_image= 7
# create videWriter
fourcc = cv2.VideoWriter_fourcc('m','p','4', 'v')
video = cv2.VideoWriter("out.mp4", fourcc, fps, (width, height))
# get 'date' directories
date_directories = os.listdir(directory_name)
for dir in sorted(date_directories):
filename = os.path.join(directory_name, dir)
print(filename)
img = cv2.imread(filename)
for i in range(frames_per_image):
video.write(img)
video.release()
directory_nameのフォルダには以下のように1280×720ピクセルのJPEGファイルだけが含まれることを想定しています。
$ ls
A19060112075410.jpg A19060112100810.jpg A19060113052210.jpg
A19060112075511.jpg A19060112100911.jpg A19060113052411.jpg
A19060112075712.jpg A19060112101012.jpg A19060113052512.jpg
監視カメラのフォルダ構成に合せて処理する
これだけだと、実用には少し足りません。カメラが日付毎にフォルダを分けて保存するので、それに合せて処理をさせたいのです。
具体的には、いつからいつまで、を日付指定して、この期間のカメラ画像(静止画)を並べた動画を作ることです。
Webカメラの仕様
その為には、監視カメラとして使用するWebカメラがどのように画像を保存するかを理解する必要が。ありますね。
私が設置したカメラは、いわゆるWebカメラで、お買い得な商品、SV3Cというメーカーの SV-B06W-720P-HXです。Amazonで5,000円くらいで購入可能です。
設置の方法、システム構成は以下の投稿を是非ご覧ください。
さて、このWebカメラは画像をftpサーバーに転送する機能があります。カメラの映像に変化かがあったときのみ撮影する「動き検出機能」と組み合わせ、何かが起こった時の写真3枚がftpサーバーに保存されます。
私は、ブログでエックスサーバーを利用しています。レンタルサーバーです。
ここに、監視カメラの画像をネット経由でアップロードしています。
SV-B06W-720P-HXカメラは、ftpでサーバーに保存する時に日付でフォルダを作成し、その中にimageというと名前のサブフォルダを作成。その中に、時間も含んだファイル名でJPEGファイルを保存していきます。
下のような感じのフォルダ構成になります。
$ tree
.
├── 20190601
│ └── images
│ ├── A19060112075410.jpg
│ ├── A19060112075511.jpg
│ ├── A19060112075712.jpg
│ ├── A19060112100810.jpg
│ ├── A19060112100911.jpg
│ ├── A19060112101012.jpg
│ ├── A19060113052210.jpg
│ ├── A19060113052411.jpg
│ └── A19060113052512.jpg
└── 20190602
└── images
├── A19060200350110.jpg
├── A19060200350211.jpg
├── A19060200350312.jpg
├── A19060200370510.jpg
├── A19060200370611.jpg
├── A19060200370712.jpg
└── A19060202391510.jpg
4 directories, 16 files
実用的なプログラム
実際に複数フォルダに別れたファイルを全てまとめて動画にするプログラムはこちらです。
create_video_from_camerajpg.zip
使い方は、カメラの画像を保存するトップのフォルダと、出力する動画のファイル名を指定します。こんな感じで使います。
$ python create_video_from_camerajpg.py ~/Desktop/Camera/
or
$ python create_video_from_camerajpg.py ~/Desktop/Camera/ -s 20190601
or
$ python create_video_from_camerajpg.py ~/Desktop/Camera/ -s 20190601 -e 20190601
オプションで、開始日時、終了日時を指定します。どちらか、または、両方がない場合は、見つけたフォルダ全てのJPEGで動画を作ります。
作った動画は以下のようなものです。
エックスサーバーで使う場合の注意
エックスサーバーでPythonとOpenCVを使うには少しコツがあります。
仮想環境を作ってそこにOpenCVのLibraryをインストールする際に少しハマりました。
その解決作は、こちらに記載していますので、ご覧下さい。
まとめ
Webカメラの「動き検出機能」。保存したJPEGファイルを一覧で確認するのは、なかなか面倒です。
そんな時、時系列の動画にするとかなり便利。
PythonでOpenCVという画像処理Libraryを使えば短いプログラムで簡単に、JPEGからmp4動画を作れます。
これで何日間にも渡る監視カメラ画像のチェックが効率よくなりますよ!
Auto Amazon Links: プロダクトが見つかりません。 http_request_failed: 有効な URL ではありません。 URL: https://ws-fe.amazon-adsystem.com/widgets/q?SearchIndex=All&multipageStart=0&multipageCount=20&Operation=GetResults&Keywords=B07DL2GY5B|B0773BMQY9|B07HSTYB3Q&InstanceId=0&TemplateId=MobileSearchResults&ServiceVersion=20070822&MarketPlace=JP Cache: AAL_1bdd9d358a5266ccca3ac816566472ed