人が通ったらシャッターを切る防犯カメラ

こんにちは。前回カメラストリーミングをやったのですが、ぶっちゃけずっと動画データをインターネットに流し続けるのもなんか無駄な感じがします。そこで今回は以前に作ったカメラストリーミングを応用して人が通ったときだけシャッターを切るカメラを作ってみたいと思います。

目的

人が通ったときだけシャッターを切るカメラを作ります。
防犯や入退室チェック、ペットや野生動物の観察にも使えて割と応用がききます。
切るタイミングも変えれば一定間隔で撮影してタイムラプス動画みたいなのも作れます。

準備するもの

fswebcamのインストール

カメラキャプチャにはfswebcamというソフトを使いましょう。いつもどおり次のコマンドでインストールします。

sudo apt-get install fswebcam

webカメラをラズパイに接続したら、撮影できるかどうかテストしてみましょう。ターミナルに次のコマンドを打つだけです。

fswebcam image.jpg
ppdr@raspberrypi:~ $ fswebcam image.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'image.jpg'.

勝手にカメラが認識されてとっても簡単です。image.jpgというファイルに画像が出力されていると思います。

ちなみに、よく使いそうなパラメータはこんな感じです。

-qメッセージを表示せずに実行
-l [seconds][seconds]秒ごとに撮影。タイムラプス撮影できそう。
-d [device]デバイス名を指定
-D [number][number]秒待ったあと撮影。起動直後だとうまく撮影できないときに。
-r [size]動画サイズを指定
–greyscale白黒で撮影
–no-banner画像に表示される時間などの文字を無くす
–overlaypngファイルを画像に重ねる。一部だけ隠したい時とかに便利??
–jpeg ,–pngファイル名を指定してjpg,pngで保存する。省略することもできます。

人感センサ

最も有名で作例も多いこちらの人感センサを使います。パーツ屋さんで500円くらいで買いました。

モジュールになっていて便利

このセンサ、両端の端子を5VとGNDにつなぐだけで真ん中の端子から出力を出してくれるスグレモノです。人などの熱源の動きを感知すると出力は3Vになり、動きがなくなると0Vになります。
ブレッドボードに次のように配線しました。

赤をラズパイの5V、黒をGND、オレンジを17番ピン、青を24番ピンに接続しています。ちなみに赤色LEDは確認用です。
さて、センサをテストしてみましょう。プログラミングは僕の愛用のpythonを使います。(コンパイルしなくても動く便利)

 

SENSOR_pin = 17
LED_pin = 24

import wiringpi as wp
import time

wp.wiringPiSetupGpio()
wp.pinMode(SENSOR_pin,0)
wp.pinMode(LED_pin,1)

state = 0
prev_state = 0
wp.digitalWrite(LED_pin,0)

try:
  while 1:
    state = wp.digitalRead(SENSOR_pin)

    if (state != prev_state):
      if state > prev_state:
        wp.digitalWrite(LED_pin,1)
      else:
        wp.digitalWrite(LED_pin,0)

    prev_state = state

    time.sleep(0.1)

except KeyboardInterrupt:
  wp.digitalWrite(LED_pin,0)
  print "KeyboardInterrupt"

今の出力の値(state)を読み込み、前回の値から立ち上がっていればLEDをオンに、立ち下がっていればオフにします。

ラズパイで防犯カメラを作る!(PHPで外部から起動)

前回の記事で自宅カメラの動画をストリーミング再生できるようになりました。しかし、前回のままだとmjpg-streamerをずっと起動しておく必要があるので、セキュリティ的にも不安です。外出先から見たいときだけ起動して終わったら消せるようになると便利なので、今回はそれに挑戦します。

目的

  • WEBページ上に自宅カメラの動画を埋め込む
  • 読み込んだときに起動・ボタンで終了できるようにする(phpを使用)

準備

前回の記事のセットアップでmjpg-streamerが起動できるようになっていることが前提です。
WEBページでPHPを動かすので、サーバの設定とポート開放をしておきましょう。

方法

こんな感じでcamera.phpをサーバのCGIが動くディレクトリに作成します。

<html>
<head>
<title>Camera Streaming</title>
</head>
<body>
camera streaming.<br>
<?php 
 $output = shell_exec('/home/ppdr/mjpg-streamer/mjpg_streamer -b -i "/home/ppdr/mjpg-streamer/input_uvc.so -f 10 -r 320x240 -d /dev/video0 -y -n" -o "/home/ppdr/mjpg-streamer/output_http.so -w /usr/local/www -p 5555 -c ppdr:password"');
 ?>
 
 <iframe width="320" height="240" src="http://192.168.0.24:5555/stream_simple.html" scrolling="no" frameborder="0"></iframe>

<?php 
 if(isset($_POST['stop'])){
 $output = shell_exec('kill -9 `pidof mjpg_streamer`');
 }
 ?>
 <form action="cam.php" method="post">
 <input type="submit" name="stop" value="stop" style="width:50%; height:10%" />
 </form>
</body>
</html>

一つ目の<?phpで始まる部分でシェルスクリプトを動かし、前回と同じコマンドでカメラを起動しています。

パラメータに-bでバックグラウンドで実行、-pでポート番号を指定、-cでパスワードを設定しています。
サーバから起動するなら実行ユーザはwww-data等になります。そのままでは権限が無いのでカメラが起動できませんので、/dev/vido0の「その他のユーザ」の権限を追加しておきましょう。

sudo chmod o+rw /dev/video0

<iframe>は他のページを埋め込むタグです。アドレスとポート番号を指定し、stream_simple.htmlを指定します。
これはmjpg-streamerの動画だけのページです。

2つめの<?phpでボタンを押したときのコマンドを指定しています。mjpg-streamerの公式ドキュメントにあるコマンドそのままです。

こんな感じで見れました。

ラズパイとWEBカメラで動画ストリーム配信ができる!

こんにちは。最近パソコン周りを整理していたらWEBカメラを見つけました。前からラズパイを使って防犯カメラ的なものを作れたらいいなーと思ってましたので、今回はWEBカメラでストリーミングしてみようと思います。

目的

・WEBカメラをラズパイに接続する
・動画をストリーミング配信する

今回使うカメラはこちらです。たまたま家にあっただけで、USB接続のカメラならもっと安いのでもいいと思います。

ELECOM PCカメラ 200万画素 筒型 UCAM-DLA200Hシリーズ

MJPG-streamerのインストール

Linuxでストリーミング再生できるソフトである「MJPG-streamer」を使います。このソフトはapt-getでインストールできないらしいので、「Subversion」でインストールします。まず必要なソフトをインストールしておきます。

sudo apt-get update
sudo apt-get install subversion libjpeg-dev imagemagick

続いて「MJPG-streamer」を取得してインストールします。

svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
cd mjpg-streamer
make
sudo make install

ストリーミング配信してみる

まずはWEBカメラがラズパイにきちんと認識されているか確認します。

ppdr@raspberrypi:~ $ lsusb
Bus 001 Device 006: ID 14cd:125c Super Top SD card reader
Bus 001 Device 007: ID 056e:700a Elecom Co., Ltd 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Elecom…みたいな感じのカメラの名前が出ていれば認識されています。デバイスとしての名前も確認しておきましょう。

ppdr@raspberrypi:~ $ ls /dev

...
video0
...

私の名前はvideo0という名前で認識されました。どれがカメラかわからない方は抜いたり指したりして追加された名前を確認してみましょう。

次のコマンドでMJPG-streamerを起動しましょう。

cd ~/mjpg-streamer
sudo ./mjpg_streamer -i "./input_uvc.so -f 10 -r 320x240 -d /dev/video0 -y -n" -o "./output_http.so -w /usr/local/www -p 8080 -c ppdr:password"

-fはフレームレートで、1秒に何回動画を更新するかです。少ないほど通信量が小さくなります。
-rは動画のサイズです。あまり大きくしないほうが止まらずに見れます。
-pはストリーミングするポート番号です。webページやリモートデスクトップで使用している80や443など以外の番号ならなんでもいいでしょう。ポートが使用中だと次のようなエラーになります。

bind: Address already in use

WEB上に公開して誰でも見れてしまうとセキュリティ的に(プライバシー的に?)良くないので-cでパスワードをかけます。[ユーザ名]:[パスワード]で指定します。

エラーがでなければストリーミング配信が始まります。
ネットワークにつながっている他のPCのブラウザのアドレス欄に、[ラズパイのIPアドレス]:[ポート番号]を入力してエンターを押します。(例)192.168.0.7:8080

こんな感じのページに移動して、カメラの映像を見ることが出来ました!

使い道① 外出先から自宅カメラの様子を確認

防犯カメラ的な使い方をするなら、外出先から見れると便利です。その場合はVPN接続がおすすめです。ラズパイに外出先からVPNする方法は長くなるので次回解説します。

使い道② 動画をWEBに公開

動画を他の人に見てもらいたい場合は、

  • DDNSサービスを利用してラズパイに接続できるようにする
  • ルーターのポートを開放する

両方とも解説しているサイトが多数あるので、ここでの説明は割愛します。VPNで自分だけ見る場合はいいですが、外部に公開する場合はパスワードをきっちり設定しましょう。