ImageMagickで簡易画像処理を行い、差分を検出する試み
前記事
ではカメラ主導でのpush通知について述べましたが、スクリプト側からスナップショットを撮り、差分を計算して、一定の閾値以上であればDiscordで通知するようなことも可能です。
まず今のスナップショット(静止画)を得るのは、curlを使うと、
curl --digest -o /mnt/nas/images/now.jpg -u id:password http://192.168.0.82/snapshot.jpg
と書けます。id:passwordは読者のものを入れてください。カメラがTS-WLCE以外ならば、仕様書を参考に読み替えてください。だいたいこれで行けると思います。これで現在のディレクトリにsnapshot.jpgができます。ImageMagickにも色々なパッケージが含まれていますが、以下のスクリプトを使っています。差分を取るのは、
composite -compose difference /mnt/nas/images/last.jpg /mnt/nas/images/now.jpg /mnt/nas/images/diff.jpg
のところですね。
#!/bin/bash
thresh=9500
tthresh=43200
ymd=`date +%s`
ymd2=`date +%s -r /mnt/nas/images/last.jpg`
timediff=$(expr $ymd - $ymd2)
if [ $timediff -gt $tthresh ]; then
echo "older file"
curl --digest -o /mnt/nas/images/now.jpg -u id:password http://192.168.0.82/snapshot.jpg
mv /mnt/nas/images/now.jpg /mnt/nas/images/last.jpg
else
curl --digest -o /mnt/nas/images/now.jpg -u id:password http://192.168.0.82/snapshot.jpg
cp /mnt/nas/images/now.jpg /mnt/nas/images/`date +"%I-%M-%S"`.jpg
composite -compose difference /mnt/nas/images/last.jpg /mnt/nas/images/now.jpg /mnt/nas/images/diff.jpg
cp /mnt/nas/images/diff.jpg /mnt/nas/images/diff-`date +"%d-%I-%M-%S"`.jpg
(date +"%m/%d %p %I:%M:%S"; identify -format "%[mean]" /mnt/nas/images/diff.jpg | awk '{printf("%d\n",$1 + 0.5)}') | paste - -
RETCODE=`identify -format "%[mean]" /mnt/nas/images/diff.jpg | awk '{printf("%d\n",$1 + 0.5)}'`
#echo $RETCODE
if [ $RETCODE -gt $thresh ]; then
curl -X POST -s -o /dev/null https://discord.com/api/v10/channels/yourserver_channel/messages -H "Authorization:Bot MTM0NDE3MTM1MjQxMTg2NTA4OA.GUC08m.V4SwEdneuwlG5qOEYeQjBx1XHfc2tvzAfbVq3o" -H "Content-Type:multipart/form-data" -F "file=@\"/mnt/nas/images/last.jpg\"" -F "payload_json={\"content\":\"Detected something\"}"
echo "trig'd"
fi
mv /mnt/nas/images/now.jpg /mnt/nas/images/last.jpg
fi
これをscr.shとすると、
0,30 4,5,6 * * * /home/nao/scr.sh >> /mnt/nas/images/diff.log 2> /dev/null
というように、毎朝4時、5時、6時の0分と30分に起動して、テキスト出力をnasの所定ディレクトリのdiff.logに追記するということになります。実際のlog(一部)とDiscordに送られてきたメッセージの例を以下に示します。
08/22 午前 04:30:01 2237
08/22 午前 05:00:01 3135
08/22 午前 05:30:01 27733
trig'd
08/22 午前 06:00:02 3193
08/22 午前 06:30:01 11677
trig'd
older file
08/23 午前 04:30:01 2111
08/23 午前 05:00:01 3581
08/23 午前 05:30:01 23932
trig'd
08/23 午前 06:00:01 3869
08/23 午前 06:30:01 2249
閾値は、9500なので、これを超えるとtrig’dになります。その時点でのsnapshotが、

こんなふうに送られてきます。
コメント