ZoneMinderと安価なスマートカメラで作る見守り/監視システム


はじめに

無線LANを用いたプロ顔負けの防犯カメラシステムが3000円~で作れるようになりました。監視カメラサーバのZoneMinderは、余っている昔のノートPCにUbuntu20.04を入れたものか、既存のLinuxサーバに追加導入することが可能です。

一昔前に防犯カメラを導入する際には、30万円~120万円/1台もする監視カメラ専用の録画機器と、定価で10万前後/1台のカメラが必要でした。個人で施工しようとしても、同軸ケーブルを用いていた為、業者発注せざるを得ず、工賃込みで300万(カメラ16台構成)が普通でした。(私も何度も受注を取り、システム構築して納品したことがあります)

しかし、スマートホームの普及とともに、LANケーブルや無線LANを使ったスマートカメラが1万円程度で登場してきました。しかも、最近では価格もこなれて性能が良く、壊れにくいカメラもで3000円~8000円/1台で購入できるようになってきました。

正直、ここまでシステム価格が下がり、個人でも構築可能となると、構築ノウハウを公開した方が、国内の防犯に役立つかと思い、当記事を書かせてもらいます。

監視システムの利用用途

監視システムを販売していると、以下のような要件での引き合いがあります。

  • 見守りカメラとして(赤ちゃん、子供、お年寄り、ペット)
  • 子供や高齢の方が勝手に出かけた場合の対策として(市町村で迷子の放送を流す際に、服装と、出かけた時刻・方向がわかるだけでも有難い)
  • 防犯用として(カメラが泥棒に対する威嚇となる)
  • 犯罪の証拠画像として(警察通報時にカメラ画像があると、立証能力が高いです)
  • 万引き犯逮捕の為の証拠画像として(エコバックに入れたものを万引きして、かごの中身だけ決済する人が増えたと相談されることがあります)
  • 器物損壊の立証に(カラオケ店等での悪酔いでの器物破壊の立証等)
  • 自宅前等での出会いがしらの事故の証拠画像として
  • 定点カメラとして(庭などに設置し、10年単位でタイムラプスのようにすると思い出が溢れ出てきます)

なお、自宅前を取った場合に、背景として道路等が映り込む程度では、文句を言われることはありません。交差点をカメラで撮っていた時には、警察から感謝されました。その際は後で文句を言われると嫌だったので「建物を取ったついでに交差点が入っている」ように設置しておきました。

見出し

  1. ZoneMinderのご紹介
  2. 推奨システム構成
  3. 構築済みシステムのご紹介
  4. 今後の発展性(AWSと連携した顔認証をつけたい)
  5. 利用可能なカメラ(当BLOGにて検証済み)
  6. サーバ構築
  7. ZoneMinderのインストール
  8. ZoneMinderパッチ適用(ONVIFカメラ検索時エラー対策)
  9. ZoneMinderの初期設定
  10. 監視カメラの登録
  11. 監視カメラの運用について
  12. FAQ

ZoneMinderのご紹介

Linux用の監視カメラサーバとしては「Motion」が有名なので聞いたことがあるかもしれません。ZoneMinderは、Motionに比べてセットアップの難易度が高いですが、本格的な防犯システムの構築に向いています。また、ZoneMinderの開発ベンダがスマホ向けに専用アプリをリリースしています。

推奨システム構成

録画サーバと、スマートカメラが必要ですが、tp-linkのカメラだけで運用する場合、スマホアプリだけでの運用も可能ですので、「まずはtp-linkのカメラ数台を購入して、後から録画サーバを作る」ことも可能です。

必要な機器名値段一例備考
サーバ0円~・ノートPC
・既存サーバ
・raspberry Pi
常時録画の為、2.5インチのHDDを推奨。お勧めは消費電力の低いSeagate製2.5inch HDDです。
スマートカメラ2,780円~事項「利用可能なカメラ」参照

構築に自信のない方は、セット品を購入することをお勧めします。値段見合いでA-ZONEのセット品などが良いかと思います。。

利用可能なカメラ(当BLOGにて検証済み)

室内(屋内)か、屋外かで購入する製品が変わります。雑な言い方をすると「屋内のカメラは安定していれば何でも良いです」。屋外の場合には、雨風にさらされますので、「IP66、ないしはIP67防水型」を選択すると、雨に濡れて壊れるトラブルを防止できます。IP66、IP67と数字があり、数字が大きいほど防水性能が良いですが、IP66以上であれば問題ありません。

設置場所ブランド製品名価格利点
室内tp-linktapo C1002,780~3,590円full HD画質
tp-linktapo C2003,390~5,500円full HD画質
首振り可能
屋外SV3CSV-B01W-1080P-HX4,980円full HD画質
IP66防水・防塵

推奨システム構成

ZoneMinderサーバ、無線LANルータ(APモードでも構いません)、各スマートカメラを以下のような形で導入します。スマートカメラについては、お好きなもの1台から始めても構いませんし、まとめて必要台数購入しても構いません。

下図は構築の一例となります。

無線LANルータ(AP含む)は機種ごとにサポートする子機の最大値が決まっており、その台数を超えると性能が落ちる事があります。

ですので、カメラ台数が多い場合には、無線LANルータを複数購入し、1台以外は全てAPモードとして、場所を離して設置し、無線LANルータ同士はLANケーブルで繋げると、性能が出ます。

なお、複数台の無線LANルータ(AP)を導入し、場所を離して設置する際には、すべてのAPでSSID、パスワードを同一にすることで、全機器が近場の電波を拾うようになります。

構築済みシステムのご紹介

私は既存のファイルサーバ(自作サーバにsambaを入れたもの)にZoneMinderをインストールしました。カメラは、tp-linkのtapo C100を2台、C200を3台、それと、SV3Cの屋外用カメラ(有線/POE無)を1台で運用しています。

今後の発展性(AWSと連携した顔認証をつけたい)

ZoneMinderは画像データを保存することが出来ます。その画像データをAWSのAmazon Rekognitionと連携できると楽しそうだと考えています。

もし連携が出来たらご紹介させていただきます。

サーバ構築

Ubuntu20.04を通常インストールしてください。Ubuntu20.04 Serverのインストール方法は「Ubuntu20.04 Serverのインストール」を参照。


ZoneMinderのインストール

# パッケージの最新化を行います
sudo apt update ; sudo apt upgrade
sudo reboot

# zoneminderと関連ソフトウェアのインストール
sudo apt install zoneminder mysql apache2 php php-mysql \
    libapache2-mod-php php-mbstring build-essential \
    libmysqlclient-dev libssl-dev libnumber-bytes-human-perl

# zoneminder用のDBの用意
sudo mysql -uroot < /usr/share/zoneminder/db/zm_create.sql


# ZoneMinderのconfファイルを編集。
# ZM_DB_PASSは適当なパスワードを指定していますので、適宜変更してください。
sudo cp /etc/zm/zm.conf /etc/zm/zm.conf.org
sudo sed -i "s/^[# ]*ZM_DB_PASS *=.*/ZM_DB_PASS=mkcxz0-9uiSD()sdpLAAasd/g" /etc/zm/zm.conf
sudo sed -i "s/^[# ]*ZM_DB_USER *=.*/ZM_DB_USER=zoneminder/g" /etc/zm/zm.conf
sudo diff /etc/zm/zm.conf /etc/zm/zm.conf.org
sudo chmod 740 /etc/zm/zm.conf
sudo chown root:www-data /etc/zm/zm.conf

# ZoneMinderのDBへ権限設定
CREATE USER 'zoneminder'@'localhost' IDENTIFIED BY 'mkcxz0-9uiSD()sdpLAAasd';
GRANT ALL ON zm.* TO 'zoneminder'@'localhost';
flush privileges;
exit;

# Apacheの設定
sudo a2enmod cgi
sudo a2enmod rewrite
sudo a2enconf zoneminder
sudo ln -s  /etc/apache2/conf-available/zoneminder.conf  /etc/apache2/conf-enabled/zoneminder.conf

# ZoneMinderの日本語対応
sudo cp /etc/php/7.4/cli/php.ini /etc/php/7.4/cli/php.ini.bak
sudo sed -i 's/;date.timezone =/date.timezone = "Asia\/Tokyo"/g' /etc/php/7.4/cli/php.ini
sudo diff /etc/php/7.4/cli/php.ini /etc/php/7.4/cli/php.ini.bak

sudo cp /usr/share/zoneminder/www/lang/ja_jp.php /usr/share/zoneminder/www/lang/ja_jp.php.bak
sudo sed -i 's/Shift_JIS/UTF-8/g' /usr/share/zoneminder/www/lang/ja_jp.php

# 関係サービスの起動と登録
sudo systemctl restart apache2.service
sudo systemctl enable zoneminder
sudo systemctl start zoneminder


ZoneMinderパッチ適用(ONVIFカメラ検索時エラー対策)

ONVIFカメラ検索時エラー対策

ZoneMinderでONVIFカメラを検索すると、エラーが出てしまうバグがあったため、/usr/share/perl5/ZoneMinder/ONVIF.pmを以下のように修正してください。

sudo vi /usr/share/perl5/ZoneMinder/ONVIF.pm

#126行目あたりを以下のように修正

      my $xaddr;
      my $probeMatch = $result ? $result->get_ProbeMatch() : undef;
      my $addrs = $probeMatch ? $probeMatch->get_XAddrs() : '';
      foreach my $l_xaddr (split ' ', $addrs) {

      # コメントアウトした元々のコード
      #foreach my $l_xaddr (split ' ', $result->get_ProbeMatch()->get_XAddrs()) {

ちなみに、エラー画面は以下です。

動作モード変更エラー対策

MySQLの8.xでは、Functionが予約語となったため、Functionを列名に使っているZoneMinderでは以下のエラーが出るようになりました。バッククォート「`」で対象列をくくることで、予約語を用いた列名に対して処理が可能になるので修正します(MySQL側の設定を探しましたが、良い対処が無かったのでZoneMinder側のソースコードを修正します。「オープンソースは自分で修正できるのがいいよね!!」って、最近聞かなくなりましたね)。

SQL-ERR ‘SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘Function=?, Enabled=? WHERE Id=?’ at line 1′, statement was ‘UPDATE Monitors SET Function=?, Enabled=? WHERE Id=?’ params:Record,1,3 /usr/share/zoneminder/www/includes/database.php

修正対象は/usr/share/zoneminder/www/include/actions.phpです。viで開いて以下の通り修正します。

sudo vi /usr/share/zoneminder/www/include/actions.php

# 334行目 
#dbQuery('UPDATE Monitors SET Function=?, Enabled=? WHERE Id=?',
dbQuery('UPDATE Monitors SET `Function`=?, Enabled=? WHERE Id=?',

# 987行目
#$sql = 'SELECT Id,Function,Enabled FROM Monitors ORDER BY Id';
$sql = 'SELECT Id,`Function`,Enabled FROM Monitors ORDER BY Id';

perl -wTオプションの修正

sudo sed -i "s/perl -wT/perl -w/g" /usr/bin/zm*.pl

ZoneMinderの初期設定

初期設定

ZoneMinderサーバへアクセスできるようになったら、初期設定を行います。まずは、ZoneMinderをセットアップしたサーバに以下のようにアクセスしてください。

http://ZoneMinderのサーバ/zm

アクセスすると以下のような画面になりますので、画面左下のAcceptを選んでAPPLYを押下します。

ZoneMinderへ初回アクセスした場合には、まだカメラを登録していない為、以下のような画面となります。まずは、日本語化したいため、「Options」を選択します。

「Options」>「System」より、「LANG_DEGAULT」に「ja_JP」を選択し、画面一番下までスクロールして「SAVE」を押下し、日本語化します。

ZoneMinderのインストール中に/usr/share/zoneminder/www/lang/ja_jp.phpの文字コードをshift_jisからUTF-8に変更しているので、文字化けせず日本語が表示されます。ただ、日本語化していない箇所がかなり多い為、「en_us」のままでも構いません。

ビデオ保存先の登録

「Options」>「Storage」>「Default」がデフォルトのビデオ保存先なので、「Default」を選択して、デフォルトの保存先を変更します。

ポップアップ表示された画面で、お好きなパスを入力します。なお、このパスは変更せずに、デフォルトのままでも構いません。

上記保存先は、SSDやMicro SDでも問題ありません。しかし、それらメディアには書き換え上限がありますので、録画データを保存するために、新規にHDDを購入することをお勧めします。私のお勧めは、消費電力が小さく、殆ど音の出ないノートPC用の2.5inch HDDです。防犯カメラ用のHDDとして「WD Purple」等のブランドもありますが、通常のノートPC用の2.5inch HDDで全く問題ありません。

兎に角、長期間の録画をしたいのであれば、8TB程度の3.5inch HDDでも問題ありません。SMR(瓦HDD)でも私の環境では問題は出ていません。しかし、カメラ台数が2桁以上となる場合には、防犯カメラ専用のHDD「WD Purple」等を購入することをお勧めします。

監視カメラの登録

ZoneMinderの初期設定が完了したら、監視カメラを登録します。・・・が、少し待ってください。カメラを登録する前に実施すべき大事な作業があります。それは、カメラのIPを固定IPにすることです。

カメラのIPを固定にする

カメラのIPがDHCPで設定されている場合、カメラが再起動したタイミングでIPが変わってしまうことがあります。その場合ZoneMinderの対象カメラを選択し、「EDIT」を押して、カメラのIPを変更しないと、カメラを見失ったままになってしまいます。

上記問題点を解決するためには、下表のとおり、ルータ側で対処する方法と、カメラ側で対処する方法があります。スマートカメラに分類される製品は、固定IPを設定できないものもある為、常にルータ側で対処するようにすれば、設定箇所を一元化できるため、ルータ側での対処をお勧めします。

対処箇所対処内容実例
ルータDHCPで特定のMACアドレス向けに払い出すIPを指定する。
※tp-linkのtapoはこちらを推奨
tp-linkのwifiルータの手順
カメラ側カメラ側の設定で、IPアドレスを固定IPとして指定する。
※tp-linkのtapoは固定IPの設定が出来ませんでした。

ONVIF対応のスマートカメラを登録する

実は、ここまで解説しませんでしたが、ネットワーク型の監視カメラには共通規格があり、その規格名を「ONVIF」と言います。ここで行う登録作業は、正確には「ONVIF対応カメラをZoneMinderに登録する」行為となります。では、「Console」>「Add」を選択してください。

カメラの追加画面(Monitor画面<画面名がピンときませんよね)で、右上にある「ONVIF」リンクをクリックしてください。

ポップアップ画面で、以下のように、対象カメラを選択します。ONVIFには、バージョン1.0、1.1、1.2、1.3があり、複数バージョンに対応しているカメラの場合には、同じIPでも「using version1.1」、「using version1.2」等、複数表示されることがあります。新しいバージョンを選択してください。ユーザー名、パスワードはカメラ毎に設定したものを指定します。「tp-linkのtapo C200の場合には、こちらに手順を記載しておきます」。

必要項目を入力したら、「NEXT」を押下します。

次の画面では、対象のカメラがサポートしている解像度が表示されます。HDDや無線LANの帯域幅によるところはありますが、ここでは、1920×1080を選択して、「SAVE」を押下します。

以下の画面に戻ってきますので、各入力項目をざっと見ます。「Name」は変更してもいいですが、ここではデフォルトで入力された名前を利用します。

次に「Source」タブを確認すると「Source Path」に先ほど選択したカメラの情報が載っています。ちなみに、このパスをVLC Media Playerで開くと、カメラの画像が見れます。

最後に、「Storage」タブで、「SAVE JPEGs」に「Frames + Analysis Images」を選択して「SAVE」を押下します。

上記まででカメラの登録が完了しました。カメラを登録すると、ZoneMinderインストール直後は何も表示されていなかった「Console」タブに、登録したカメラが表示されます。

複数個カメラを購入した場合には、上記作業を繰り返し、カメラを登録しきってください。

カメラ毎の録画設定

上記設定まででは、まだカメラは録画できていません。「Console」タブの「Function」列の下図の赤枠部分(「Monitor」等と表示されているかもしれません)をクリックしてください。

次に、ポップアップで表示された画面で、「下表の何れか」を選択して「SAVE」を押下します。監視カメラ用途の場合には「Record」か「Mocord」で良いと思います。なお、他の設定項目の意味は下表のとおりです。

Function意味
Noneモニターは現在無効になっています。ストリームを表示したり、イベントを生成したりすることはできません。何も記録されません。
Monitorモニターはライブストリーミングでのみ使用できます。画像分析は行われないため、アラームやイベントは生成されず、何も記録されません。
ModectMOtion DEteCTtionの略。キャプチャされたすべての画像が分析され、モーションが検出された録画ビデオでイベントが生成されます。
Recordモニターは継続的に記録されます。固定長のイベントは、従来のタイムラプスビデオレコーダーと同様に、モーションに関係なく生成されます。このモードでは、動きの検出は行われません。
Mocordモニターは継続的に記録され、それらのイベント内でモーションが強調表示されます。
NodecNo DEteCTtioの略。外部トリガーで使用するように設計された特別なモードです。 Nodectではモーション検出は行われませんが、外部トリガーで必要な場合はイベントが記録されます。

監視カメラの運用について

ZoneMinderの各メニューの説明

日本人の意見なのかもしれませんが、ZoneMinderのメニューは慣れるまで使いにくいです。ただし、普段使うコンソールがわかってしまえば、別に悩むこともないので、簡単です。

なお、英語版のマニュアルはここです。

メニュー説明
Consoleコンソール画面。各カメラのサマリを表示
Options設定画面
Logログ
Groupsカメラのグループ化ですが、台数が多くないと使わないかと思います。
FiltersZoneMinderで関連するアクションを使用して複雑な条件を定義できます。
Cycleカメラを全画面表示したうえで、順番に表示(顧客向けに監視画像を表示する際に有用かと)
Montageリアルタイムなカメラ画像表示(録画モードで表示するとブラウザが半部アップすることがあります。録画モードでは、「Montage Review」を使った方がいいです)
Montage Review録画画像の表示(デフォルトではリアルタイムに最新画像を表示)
Audit Events Reportフィルターされたイベントのリストから、イベントをクリックして詳細を表示


FAQ

質問があった場合には、FAQとしてまとめさせていただきます。

タグ , . ブックマークする パーマリンク.

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください