Zoneminderからスナップショットを取得して保存(Linuxで動作する監視カメラシステム)

スポンサーリンク

Zoneminderのイベント画像ディレクトリ

Zoneminderで検知したイベント画像はデフォルトだと以下のディレクトリにあります。

/var/lib/zoneminder/events

FTPクライアントで接続して中を覗いてみると以下のような階層になっていますね。

「events」の直下は数字の「モニターID」のディレクトリがあります(上記の例では1)

モニターIDはZoneminderのWebコンソールから確認すると「Id」の列にある数字です。

その直下には「日付」のディレクトリがあります(yyyy-mm-dd形式)

さらにその下には数字だけのディレクトリがありますが、これは「イベントID」のディレクトリです。

「イベントID」は全モニターで同じカウンタを使っており、例えばモニター3でイベント001が発生し、次にモニター5でイベントが発生するとイベントIDが002になります。

Webコンソールからは以下の箇所で確認できます。

このディレクトリに保存されているのはイベントの画像のため、最新スナップショットではありませんが、「alarm.jpg」という画像はアラームの発生した時点の画像なので直近の動きがあった画像として使えそうですね。

alarm.jpg

今回は使いませんが、カレントディレクトリ以下から最新の「alarm.jpg」を探す場合は以下のようにします。

find . -name alarm.jpg -type f | xargs ls -l --time-style=long-iso | sort -k 6,7 | tail -1

モニターIDが「8」の最新の「alarm.jpg」を「/home/sakue/tmp/test1.jpg」へコピーする例です。

find /var/lib/zoneminder/events/8 -name alarm.jpg -type f | xargs ls -l --time-style=long-iso | sort -k 6,7 | tail -1 | gawk '{print $8}' | xargs -i cp '{}' /home/sakue/tmp/test1.jpg

「events」ディレクトリは膨大な数の画像が保存されているため、日付ディレクトリくらいから検索しないと相当な時間がかかり、上記の例だと10秒ほど待たされます。

以下のように日付フォルダ(2021-02-18)まで指定すると一瞬で抽出とコピーが完了するので、やるなら以下のような感じにすると良いです。

find /var/lib/zoneminder/events/8/2021-02-18 -name alarm.jpg -type f | xargs ls -l --time-style=long-iso | sort -k 6,7 | tail -1 | gawk '{print $8}' | xargs -i cp '{}' /home/sakue/tmp/test1.jpg

Zoneminderから最新スナップショットを取得して保存する

実際に使っている例です。

wgetで取得している事から分かるように、設定次第で外部からZoneminderへ直接アクセスすることもできますが、外部からは最新スナップショットだけ確認できれば良いので別途jpgで保存しています。

スナップショットの保存パスや、[Zoneminderのユーザー名]などの箇所は実際のものに修正します。

#!/bin/sh

func_saveSnapshot(){

  # スナップショットの保存パスを定義
  local SNAPSHOTJPG1="/var/www/html/web/SnapShot/Camera01/auto.jpg"

  # 一時ファイルのパス定義
  local SNAPSHOTTMP1="/var/www/html/web/SnapShot/Camera01/tmp.jpg"

  # 一時ファイルのパス定義(720p)
  local SNAPSHOTTMP2="/var/www/html/web/SnapShot/Camera01/tmp.jpg"

  # zoneminderからスナップショットを取得して保存
  wget --no-check-certificate "https://localhost/cgi-bin/zm/nph-zms?mode=single&monitor=2&scale=100&maxfps=1&buffer=1000&user=[Zoneminderのユーザー名]&pass=[Zoneminderのパスワード]" -O $SNAPSHOTTMP1 2>/dev/null &
  wait

  # 1080pは大きすぎるので720pへ変換(ImageMagick)
  convert -geometry 1280x720 -quality 70 $SNAPSHOTTMP1 $SNAPSHOTTMP2

  # 置換
  mv -f $SNAPSHOTTMP2 $SNAPSHOTJPG1

  # 所有者変更
  chown sakue:sakue $SNAPSHOTJPG1

  # パーミッション変更
  chmod 0777 $SNAPSHOTJPG1

}

func_saveSnapshot

exit

wgetの以下の箇所はSSLを無視してダウンロードするオプションです。

--no-check-certificate

ダウンロード完了前に次に進んでしまう事があったためwgetの後に次の処理に進むためwaitを入れています。

wget --no-check-certificate "https://localhost/cgi-bin/zm/nph-zms?mode=single&monitor=2&scale=100&maxfps=1&buffer=1000&user=[Zoneminderのユーザー名]&pass=[Zoneminderのパスワード]" -O $SNAPSHOTTMP1 2>/dev/null &
wait

wgetのURLのうち、[Zoneminderのユーザー名] と [Zoneminderのパスワード] は実際のZoneminderのものに修正します。

あと、同じURL内に以下の「monitor=2」という箇所がありますが、これも取得したいモニターIDに修正します。

monitor=2

モニターIDはZoneminderのWebコンソールから確認すると「Id」の列にある数字です。

以下の箇所で1280x720pxに縮小しています。

外からスマホで確認するだけならこれくらいのサイズで良いかなと思います。

convert -geometry 1280x720 -quality 70 $SNAPSHOTTMP1 $SNAPSHOTTMP2

あと、一時ファイルに保存してから最後に置き換えをしていますが、ダウンロードなど処理中にアクセスされると壊れたjpgになるためです。

ロックファイルなどを使用した方が確実ですが、mvコマンドは一瞬で終わるので上記で問題ありませんでした。

 

おしまいです。

その他

よくあるトラブルと解決方法は以下にまとめました。

ZoneMinderのよくあるトラブルと解決方法(監視カメラシステム)
ZoneMinderはオープンソースの高機能な監視カメラソフトです。動画の記録はNVRへ、ZoneMinderは別途動体検知とスマホなどから画像として確認するために使用していますが、色々とトラブルがあったので解決方法をメモしておきま...

コメント

タイトルとURLをコピーしました