さわっても熱くない花火

ちょっとした驚きを食べながら生きています

続・遠隔地に監視カメラを比較的安く設置する方法(自動録画+効率の良い運用)

前回の記事で無事設置できたネットワーク監視カメラ関連の話題です。
前回の記事ではカバーできてなかった「自動録画」を実現したので、そのメモです。

やりたいこと

  • 画面の変化を認識して自動録画
  • 画面の変化を認識した際に、あらかじめ設定しておいたメールアドレスに通知を送信

環境

  • CPB643W(監視カメラ)
  • Windows Server 2008 R2 x64がインストールされたファイルサーバー(常時付けっぱなし)
  • 100Mbpsな光ファイバーインターネット回線(多分実効速度が10Mbpsも出れば十分な気がします)
  • Ruby 2.0.0-p247 (x64) インストール済み

利用するソフト

何かいいソフトがないかなぁーと思って調べたところ、iSpyというソフトを見つけました。
iSpy: Open Source Camera Security Software
オープンソースらしいですし、複数のネットワークカメラに対応しているみたいなので良い感じです。
(余談だけど、iSpyなんて名前のくせにWindows版しか無くて、更に.NET Frameworkを利用して作られていました。超Windowsなソフトウェアなのに、どうして「i」を付けたんだろうねー)


iSpyの設定

録画先の設定

上のメニューの「Settings」をクリックして表示したダイアログの「Storage」タブの「Media Directory」より設定できます。
f:id:yanoshi:20130812233047p:plain


カメラの追加

左上にある「Add」ボタンをクリックし、「IP Camera With Wizard」をクリック。


f:id:yanoshi:20130812201136p:plain
リストの中にCPB643Wがなかったので、「Unlisted(scan)」を選択しました。(監視カメラのマニュアル曰く、どうやらこのカメラのシステムはWansview NC541と同じっぽいですが、まぁせっかくScan機能があるので、これを使いたいと思います。)


f:id:yanoshi:20130812201435p:plain
次の画面はユーザー名やチャンネル番号を指定するみたいです。Channelは1で良いみたいです。ユーザー名とパスワードは監視カメラに設定したのを入力します。



f:id:yanoshi:20130812202122p:plain
IPアドレスとポート番号を指定。


f:id:yanoshi:20130812230322p:plain
検索に結構時間が掛かっちゃいますが、「255 IPCam:ipcam:MJPEG http://ユーザー名:パスワード@IPアドレス:ポート番号/videostream.cgi」ってのを選択しました。asfをVLCで開くタイプの設定も一応動作しましたが、バッファリングがうまくいかず、カクカクだったのでMJPEGの方を選択しました。
(余談ですけど、どうやら、URLの総当たりでこのリストは生成している見たいです。力業ですね…)


f:id:yanoshi:20130812231545p:plain
これでウィザードは終了です。たぶんこんな感じで監視カメラの様子がプレビューできているのではないでしょうか?



録画設定(一定時間動きを検知すると、録画開始し、その旨をメールで通知する)

方針
  1. Motion Detectionでモーションを感知
    • 関知すると画像を撮影するように設定(録画漏れを防ぐためと、後述のメール送信のため)
  2. ある一定時間動きを感知し続けたらAlertsを発生させる(発火的な)
    • Rubyのスクリプトにより、指定したメールアドレスに、直近5分間に撮影された画像を添付してメールを送信
    • Alertsが発生すると同時に、発生10秒前から録画を開始し、最小60秒間録画し続ける。録画中に更にAlertsが発生したら録画時間を延長。最長900秒録画を行う
Ruby Scripts

Gemのmailをつかっているので、事前にインストールしておきましょう。

gem install mail

以下スクリプト(mailsend.rb)

require 'mail'
require "fileutils"

#添付対象のファイルリストを作成
filelists=[]
# H:/Datas/SecurityCamera/video/ZMNIO/grabs/ にキャプチャー画像が溜まっていたので、以下のように設定(環境に合わせて任意で変更)
files = Dir.glob("H:/Datas/SecurityCamera/video/ZMNIO/grabs/*").each{|f|
	#5分以内
	if Time.now-60*5 < File.mtime(f)
		filelists.push(f)
	end
}


mail = Mail.new do
	from     '送信元メールアドレス'
	to       '送信先メールアドレス(その1),送信先メールアドレス(その2),送信先メールアドレス(その3)'
	subject  "【監視カメラ】 #{Time.now.strftime('%Y/%m/%d %H:%M:%S')} (#{filelists.count}枚の写真)"
	body     '監視カメラが画面の変化を捉えました。5分以内に撮影された画像の一部を転送します。'

	filelists.each{|f|
		add_file f
	}
end

#Gmailをつかって送信した
mail.delivery_method :smtp, { 
	:address => "smtp.gmail.com",
	:port => 587,
	:domain => 'よく分からない。(localhostで良いんじゃないかな)',
	:user_name => 'Gmailのユーザーアカウント(@gmail.com込み)',
	:password => 'Gmailのパスワード',
	:authentication => 'plain',
	:enable_starttls_auto => true 
}
mail.deliver!

スクリプトファイルは「C:\Program Files\iSpy」に置いておいた。

設定内容

右クリックメニューの「View」より弄れる設定を次のようにしました。


f:id:yanoshi:20130812233344p:plain
Motion Detectionタブでは、動き感知の設定ができます。色々と吟味した結果このような数値となりました。
Detection Zonesを描き描きして、検知範囲の設定が可能です。


f:id:yanoshi:20130812234510p:plain
Alertsの設定。
注意すべき点:「Mode」のリストボックス横の「...」ボタンを押して秒数を指定しなくてはいけません。私の場合は1.5秒に設定しました。(1.5秒間動きを検知し続けるとAlertsを鳴らすという意味)
(Distinct Alert Intervalはもっと下げても良いかも)


動作内容

以下みたいなメールが届くようになります。
f:id:yanoshi:20130813001136p:plain

もちろん、録画もできてます。
素晴らしい。

終わりに

PCツケパじゃないと動作しないので一部の人向けかとは思いますが、安価にネットワークカメラサーバーもどきが立てれたので満足です。
ちなみに結構CPUリソースを食います。Celeron E3400だからかもしれませんが…常時CPU使用率が30%超えです。そろそろCPUを換えようかな…