2016年7月13日水曜日

FreeBSDで監視カメラ

まず。Linuxではよく用いられるmotionに関してはUSBカメラではうまく動かず諦めました。なのでpwcviewを使ったUSBカメラによる監視カメラの作り方です。

カメラの認識

FreeBSDでのカメラの利用にはwebcamdというデーモンが必要なので、以下のスクリプトでカメラを認識させます。USBカメラを追加・削除する度にデーモンの起動が必要なので、繰り返し実行すればwebcamdを全部殺して起動し直すようにしています。

cameraStart.sh
#!/bin/sh
kldload cuse4bsd
killall webcamd
usbconfig list | grep Camera | awk -F : '{print "webcamd -d "$1" -B -H"}' | sh

監視(pwcview)

 pwcviewはカレントディレクトリのpwcview.msk(動体検知対象外を示すマスク)を読み込むので、カメラの数だけディレクトリが必要です。ここでは/cam/0ディレクトリを監視カメラ用ディレクトリにしています。

重要なのはpwcviewによる表示はxgaやuxgaに対応していますが、マスクはvgaまでしか対応していません(2016/7時点のバグ?)。なので今回はvga(640x480)での監視をしています(-s オプション)。pwcviewで動体検知をした再に動画に記録するのですが、この際の動画変換はmencoderで行います。深い意味は考える必要はなくてw=640:h480の所の解像度がpwcviewに与えたサイズと一致していれば良いです。
-dオプションでカメラの指定、-uで動体検知の感度(小さいほど高感度)を指定します。

/cam/0/run.sh
#!/bin/sh
cd /cam/0
F=`date +%Y%m%d_%H%M`
echo run $F
pwcview -hkr -s vga -f 5 -u 1300 -d /dev/video0 | mencoder -quiet -demuxer rawvideo -rawvideo fps=5:w=640:h=480:i420 - -ovc lavc -lavcopts vcodec=mpeg4 -o $F.mp4 >/dev/null 2>&1


複数カメラでの監視

複数カメラでの監視のため実際には以下のスクリプトで/cam/0と/cam/1の二つを起動しています。
 以下のスクリプトをcronで定期的に実行する事で、実行のたびにファイル名を分けて動体検知動画を見る事ができます。


 #!/bin/sh
killall pwcview
killall pwcview
sudo sh /home/akira/bin/cameraStart.sh
sleep 2

nohup /ssd/cam/0/run.sh &
nohup /ssd/cam/1/run.sh &

Future works

pwcviewが4:3サイズの画像しか対応していないのは今時じゃない。さらにマスクがvgaまでというのもなにか変。なので修正が必要だとは思います。西院フェスおわったら修正するかなぁ。
USBカメラからの読み込みは非圧縮のみなので高解像度ではfpsを高く出来ません。そこの改良までは手を付けるつもりはないですが、、、だれかやんないかな。