LoginSignup
2
3

More than 1 year has passed since last update.

ストーカー被害に遭ったので監視カメラ作った備忘録① ~ラズパイにOSインストール、motionでの動体検知・撮影、sSMTP+MuttによるGmail送信まで~

Last updated at Posted at 2021-12-24

前置き

メリークリスマス。

現在進行形でストーカー被害に遭っています。
警察に相談して、警察の方からも直接ストーカー相手に厳重注意して頂いたのですが相手方は反省していないようで。

家の前を通るのもダメって警察から注意を受けたにも関わらず通る気満々のようなので、それなら監視カメラでも作るか~と思ってラズパイ(Raspberry Pi 4 Model B)とwebカメラ(ロジクール ウェブカメラ C270)を購入して監視カメラを作り始めました。実際怖い。本当に怖い。

当記事はその作業手順の備忘録になります。

もし私と同様にストーカー被害に遭って『ラズパイ+webカメラで監視カメラを作成したい!』という思考に至り、結果的にこの記事にたどり着いてしまったLinux初心者の方にも伝わるように、なるべく分かりやすい記事を書けたらと思います(そういう方はまず警察に相談しましょう)(可能なら早急に引っ越ししましょう)(というか自作じゃなくても普通に高性能な監視カメラを買った方が良い気がs)

当記事では、ラズパイ+webカメラで動体検知&静止画や動画を撮影、さらに撮影したものは定期的にGmailで自分宛てに送信するシステムの作成手順を取り上げます。

準備するもの

上2つ(ラズパイ+webカメラ)で2万円くらいでした。

  • Raspberry Pi 4 Model B
    • Amazonでこちらを購入
    • MicroSDカード(32GB)、電源アダプター、MicroHDMI-to-HDMIケーブルなど必要なものが一式揃っていて良きです
  • ロジクール ウェブカメラ C270
    • Amazonでこちらを購入
    • 新品を買ったと思ったら中古の物が届いてビックリしましたがとりあえず動いたので良しとします
  • モニタ、キーボード、マウス
    • ラズパイに使う用。カメラがちゃんと動いているか、静止画や動画が撮れてるかの確認に使用
    • 他、普通にラズパイのターミナルで作業したい場合に使用
  • 作業用PC (Windows10)
    • ラズパイにOSを入れるために必要。ラズパイに入れるOSはこの作業用PCでダウンロードして、SDカードを通してラズパイに持っていきます (詳細は後述)
    • 他、作業用PCからSSHでラズパイを操作する場合に使用。この用途がメイン。いちいち作業用PCとラズパイとで作業する手と目を反復横跳びするは面倒なので

そもそも自作する必要ある?

ありません。
この疑問を持った方は普通に監視カメラを買うことをお勧めします。

2万円出さずとも、より安価で良いものはたくさんあります。
この記事で取り上げる自作監視カメラよりも高画質で撮影してくれたり、さらにスマホに情報を送る機能があったり、高精度な動体検知のみならず熱感知、顔認識まで……Amazonでざっと調べただけでも色々ありますね。書いてて悲しくなってきました。

私が自作しようと思ったのは、ただ純粋にラズパイを触ってみたかったというのがあります。純粋にお遊び&お勉強ですね。
ラズパイは普通に色々な使い道があるので、今回は監視カメラですが他の用途でも使ってみたいなと思っています。

次回の記事では、このラズパイをwebサーバにしてwebページ作る手順の備忘録でも書こうかなとふんわり考えています。

あとは、幸か不幸かストーカー相手の顔写真もたくさんあるので、機械学習でストーカー相手を学習させたモデルを使って、もし現れたらアラートで知らせる……みたいなのも(蛇足ですが)できたら面白そう……と思っていましたが、監視カメラを置く場所・距離の都合上、多分顔認識までは厳しそう……となっています。

……猫が近くをどれくらい歩いたかとか、猫の様子とその日の天気や気温の相関を可視化とかできたら面白いかもしれない……(※思い付きで適当に書いています)。

つまりラズパイを使うメリットは、監視カメラの用途であってもそうでなくても、自分のやりたいように様々な機能を持たせることができること、ですね。

作業手順

作業手順は下記の通りです。
ラズパイの組み立てやOSインストールに関してはほぼ丸々参考にしたサイトや動画の手順通りに行ったので、そちらの紹介をして詳細は割愛します。

目次

1. ラズパイの組み立て

届いたものはこんな感じです。↓
20211213_144825.jpg

左半分の段ボール箱にラズパイ一式が入っています。
中央右側のプチプチに入っているのがwebカメラです。中古です。
右側のUSBメモリみたいなものは念のため買っておいた無線LAN子機ですが、ラズパイ4に搭載されている無線LANが問題なく使えそうなので、今回こちらの出番はなさそうです。箱は初対面時から潰れていました。

組み立てはこちらの動画を参考にしました。↓

上記の動画を参考に、ヒートシンクやファン等を一通り付けた実物がこんな感じです。↓
vlzgvg.jpg

上の蓋をパカッと被せれば組み立ては終了です。

2. OSインストール

こちらの記事を参考にインストールしました。
そもそもラズパイって何?という部分から丁寧に解説されていて、作業手順の解説も分かりやすくて大変良い記事です。

私の作業用PCも記事先と同じでWindowsなので、Raspberry Pi Imagerファイルは『Download for Windows』の項目をクリックしてダウンロードしました。
また、Raspberry Pi Imagerを起動した後の『CHOOSE OS』についても、記事先と同じで『Recommended』と書かれている『Raspberry Pi OS (32-bit)』を選択しました。

ラズパイにOSをインストールして無事初期設定を終えたら、以下の記事を参考にしてセキュリティ対策を行います。
記事の後半に記載されているSSHの設定もここで行います。これにより作業用PCからラズパイを操作できて便利です。

買ったらまず実施!RaspberryPiのセキュリティ対策

また、下記の記事を参考に~/.ssh/configファイルを設定することで、作業用PCからラズパイへのSSH接続が楽になります。

~/.ssh/configを使ってSSH接続を楽にする

3. motionのインストール、設定

motionとは?

動体検知用のソフトウェアです。
リファレンスも豊富で扱いやすそうだったので、今回こちらのソフトウェアを採用しました。

詳細はこちらのドキュメントで確認できます。

motionの設定回りは下記の記事を参考にしました。

Raspberry Pi(ラズパイ)にMotionを入れて動体検知機能付きの監視カメラを作る - 親子ボードゲームで楽しく学ぶ。

ちなみに、私のmotionのバージョンは4.3.2です。

motionのインストール

ラズパイでターミナルを起動し(もしくは作業用PCからcygwinなどでラズパイにSSH接続し)、下記コマンドを実行してmotionをインストールします。

$ sudo apt install motion

左端に映っている$はコマンドではないので入力しません。
他のサイトを見ても、$#がコマンドの左端に映っていることがありますが入力しません。
現在のユーザが一般ユーザだったら$、rootユーザ(=管理者)だったら#という情報を示している記号です。
これらはコマンドプロンプトと呼ばれるもので、プロンプト(prompt)は『促す』という意味です。つまり、『これの後にコマンドを入力してください』という、コマンドを促す記号が$#ということです。

また、上記で打っているaptコマンドはどのディレクトリに入っている状態で打っても問題ないです。
ちなみに、自分が今どのディレクトリにいるかはpwdコマンドで確認できます。

あと、色んな記事を見てるとaptコマンドとapt-getコマンドどちらを使うべきか迷うかもしれませんが、基本的にaptコマンドでいいと思います。

apt と apt-get の違い | rs-techdev

webカメラをラズパイに接続し、下記コマンドを実行すれば、とりあえずカメラが動作します。

$ sudo motion

ブラウザからhttp://<ラズパイのIPアドレス>:8081を開くと、webカメラに映っている映像が確認できます(※ラズパイとは別のマシンから確認する場合は、後述するstream_localhostの設定をoffにしている場合のみ可能)。

保存先ディレクトリの作成

撮影された静止画や動画が保存されるディレクトリを作成します。

$ mkdir /home/<ユーザ名>/motion_data

motion.conf

motionの設定ファイルであるmotion.confを編集します。

このファイルで扱う各パラメータについては、こちらのリファレンスを見れば分かります。
上記のリファレンスを日本語訳しているページもこちらにあります。

motion.confにデフォルトで記載されていたパラメータで値を変更するパラメータを『変更項目』に、デフォルトで記載されておらず今回新たに追記するパラメータを『追加項目』に書きます。

cdコマンドでmotion.confがある/etc/motionディレクトリに移動します。

編集する前に、下記のようにオリジナルのmotion.confは念のためバックアップを取っておくといいです。

$ sudo cp motion.conf motion.conf.org

下記コマンドでmotion.confを編集します。
私はファイルを編集する際はvi(vim)を使っていますが、慣れない方はnanoが直感的で良いかもしれません。

$ sudo vi motion.conf

変更項目

daemon on
target_dir /home/<ユーザ名>/motion_data
width 800
height 600
framerate 100
threshold 150
picture_output best
movie_codec mp4
stream_localhost off
  • daemon: デーモンモードを機能させるか、つまりバックグラウンドでシステムを動作させるかどうかです。動作させたいのでonにします。デーモンの召喚を召喚!
  • target_dir: 撮影した静止画・動画の保存先ディレクトリ。先ほど作成したディレクトリを指定します
  • width: 撮影する静止画・動画の解像度(幅)
  • height: 撮影する静止画・動画の解像度(高さ)
  • framerate: 1秒間に撮影する最大フレーム数
  • threshold: 閾値。ここで指定したピクセル数より大きなピクセル数の変化が画面にあった場合に、picture_outputfirstbestonのいずれかに設定していたら静止画を撮影、またはmovie_outputonに設定していたら動画を録画します。つまり、この値を低く設定すればするほど小さな動きの変化も検知して撮影・録画を行います
  • picture_output: 動体検知した際にどのように静止画を撮影するかを指定します。offは撮影しない、onは可能な限り撮影、firstは動きを検知した瞬間の1枚のみ撮影、bestは(少しCPU使うけど)そのイベントで最も動きを検知した瞬間の1枚のみを撮影します。onにすると撮りまくってえらい数の静止画が生成されるのでbestあたりが良いかなと思います
  • movie_codec: 保存する動画のファイル形式
  • stream_localhost: カメラのリアルタイムの映像確認ページの閲覧権限を、ローカルホストに限定するかどうかを指定します。これをoffにすることで、同じLAN内の別のマシンからもhttp://<ラズパイのIPアドレス>:8081にアクセスしてカメラのリアルタイムの映像を見ることが可能になります

もし動画ファイルを生成したくない場合は、movie_outputoffにします。

movie_output off

追加項目

movie_bps 700000
  • movie_bps: 映像の1秒あたりのビットレート。高ければ高いほど高品質になり、その分ファイルサイズが大きくなります

動きが無くても定期的に画像を保存したい場合は、snapshot_intervalを指定します。

snapshot_interval 300 # 動きが無くても5分おきに画像を保存

/etc/default/motion

デーモン起動用ファイルを作成します。
下記コマンドでファイルを作成・編集を行います。

$ sudo vi /etc/default/motion

下記の内容を記載して保存します。

start_motion_daemon=yes

4. sSMTPのインストール、設定

sSMTPとは?

メール送信に使えるソフトウェアです。
シンプルで扱いやすそうだったので採用しました。

ローカルホストにSMTPサーバが起動していなくても、外部のサーバに接続してメール送信ができます。
sSMTPについてざっと理解するには下記の記事が分かりやすいかもしれません。

[linux][sSMTP] 自前で smtp サーバを用意せずにメール送信する | バシャログ。

また、当記事でこれから行うことと以下の記事でやっていることはほぼ同じなので紹介しておきます。
私も参考にさせていただきました。

Raspberry Pi | 撮った写真をgmailで送るための設定(sSMTPとMutt) – たぷん日記

私のsSMTPのバージョンは2.64です。

sSMTPのインストール

sSMTPをインストールします。

$ sudo apt install ssmtp

Googleのアプリパスワードの発行

ご自身のGmailの二段階認証をオンにし、こちらからアプリパスワードを発行します。
ここで発行する16桁のパスワードは、後述するパラメータに使用します。

ssmtp.conf

sSMTPの設定ファイルであるssmtp.confを編集します。

ssmtp.confにデフォルトで記載されていたパラメータで値を変更するパラメータを『変更項目』に、デフォルトで記載されておらず今回新たに追記するパラメータを『追加項目』に書きます。

いずれも、今回使用するGmailのSMTPサーバに関するパラメータです。

また、今回も編集する前にオリジナルのssmtp.confは念のためバックアップを取っておきましょう。

# cp ssmtp.conf ssmtp.conf.org

変更項目

root=<送信元メールアドレス(Gmailアドレス)>
mailhub=smtp.gmail.com:587

追加項目

AuthUser=<送信元メールアドレス(Gmailアドレス)>
AuthPass=<16桁のアプリパスワード>
AuthMethod=LOGIN
UseTLS=Yes
UseSTARTTLS=Yes
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt

AuthPassには、先ほど発行した16桁のパスワードを記載します。

5. メール送信機能の実装

ここまでの設定ファイル等の場所と説明まとめ(おさらい)

  • /etc/motion/motion.conf
    • motion設定ファイル3で設定しました
    • これを編集してカメラ周り(撮影、録画等)の設定をします
  • /etc/default/motion
    • デーモン起動時に読み込まれる設定ファイル3で設定しました
  • /etc/ssmtp/ssmtp
    • ssmtp設定ファイル4で設定しました
  • /home/<ユーザ名>/motion_data
    • 撮影した静止画ファイルや動画ファイルが入るディレクトリ3で作成しました
    • <ユーザ名>は、piユーザをそのまま使ってる人はpiになります
  • /var/lib/motion_setting
    • 以下のファイルが入るディレクトリです
      • send_camera_mail.sh
        • /home/<ユーザ名>/motion_dataディレクトリに入っている静止画ファイルや動画ファイルをメールに送る機能を持つファイルです
        • 以下に作成手順を記載します
      • message.txt
        • メール本文の内容を記載するファイルです。書く内容は適当でいいです
        • 以下に作成手順を記載します

Muttのインストール

sSMTPだけではファイルを添付することができないので、Muttという電子メールクライアントを組み合わせて扱います。

私のMuttのバージョンは2.0.5です。

下記コマンドでMuttをインストールします。
-yオプションを付けることで、本当にインストールしますか?[Yes/no]の対話部分を自動でYesにして手入力をスキップできます。

$ sudo apt install -y mutt

シェルスクリプトの作成

以降の手順は下記の記事を参考にしております。

Raspberry Piを使った格安監視カメラシステムを作った!|まるブロ -へたれエンジニアが頑張ります-

/var/lib/motion_settingディレクトリを作成します。

$ sudo mkdir /var/lib/motion_setting

作成したディレクトリ内に、send_camera_mail.shというファイルを作成します。

send_camera_mail.sh
#!/bin/sh

files="/home/<ユーザ名>/motion_data/*"
all_file=""
file_size=0
cur_file_size=0

for filepath in ${files}
        do
                cur_file_size=`ls -l ${filepath} | awk '{ print $5; }'`
                file_size=`expr ${file_size} + ${cur_file_size}`

                # 添付ファイルが25MBを超えないように分けてメールを送る
                if [ ${file_size} -lt 25000000 ]; then
                        all_file=${all_file}' -a '${filepath}
                else
                        mutt -s "監視システムからの連絡" "<送信先メールアドレス(Gmailアドレス)>" -c ""${all_file}<"/var/lib/motion_setting/message.txt"
                        all_file=""
                        all_file=${all_file}' -a '${filepath}
                        file_size=${cur_file_size}
                fi
        done

if [ -n "${all_file}" ]; then
        mutt -s "監視システムからの連絡" "<送信先メールアドレス(Gmailアドレス)>" -c ""${all_file}<"/var/lib/motion_setting/message.txt"
fi

# ファイルの削除
ls "${files}.jpg" > /dev/null 2>&1
if [ $? -ne 0 ]; then
        echo "jpgファイルを`ls -Ul ${files}.jpg | wc -l`件削除しました"
        sudo rm -r ${files}.jpg
else
        echo "jpgファイルはありませんでした"
fi
ls "${files}.mp4" > /dev/null 2>&1
if [ $? -ne 0 ]; then
        echo "mp4ファイルを`ls -Ul ${files}.mp4 | wc -l`件削除しました"
        sudo rm -r ${files}.mp4
else
        echo "mp4ファイルはありませんでした"
fi

echo "メール送信処理が終了しました"

このファイルが、静止画ファイルや動画ファイルを添付してメール送信する機能を果たします。

今回送受信に使うメールアドレスにGmailを採用していますが、Gmailでは25MB以上のファイルを添付できないので、添付ファイルが25MBを超えるほど多い場合は数回に分けてメールを送るようにしています。

メールを送ったあとは、送った静止画ファイル、動画ファイルを全て削除しています。

メール内容の作成

自分宛てに送るメールの本文内容を記載するファイルです。
同じディレクトリに作成します。内容は適当でいいです。

message.txt
メール本文

動作確認

一旦ここで、ちゃんと撮影されるか、メールが送られるか確認します。

ラズパイを再起動してから再びmotionを起動します。
また、webカメラに自分の顔ないし体が映るようにします。

現状の設定では、動きを検知し次第静止画・動画を撮影し、/home/<ユーザ名>/motion_dataディレクトリにそのファイルが保存されるようになっています。

自分の顔ないし体を動かしてみて、動きを検知して撮影された静止画・動画がちゃんと/home/<ユーザ名>/motion_dataディレクトリに保存されているか、またsend_camera_mail.shを実行してちゃんとそれらのファイルが添付されたメールが送られるか確認しましょう。

下記コマンドでラズパイを再起動し、

$ sudo reboot

下記コマンドでmotionを起動します。

$ sudo motion

顔ないし体を動かします。

/home/<ユーザ名>/motion_dataディレクトリに入り、lsコマンドでファイルが生成されているか確認します。

次に、/var/lib/motion_settingディレクトリに移動し、先ほど作成したsend_camera_mail.shを下記コマンドで実行します。

$ sudo ./send_camera_mail.sh

これで撮影ファイルが添付されたメールが送られ、それらのファイルはラズパイからは削除されたはずです。

実際、webカメラで撮影された自分の気持ち悪い横顔の写真が大量にGmailで送られてきたので無事動作確認完了です。
次に進みます。

cronの設定

cronを設定します。
この設定により、メールを自動で何時間おきに送るか、といった設定ができます。
設定ファイルを直接いじっても良いのですが推奨されていないようなので、ここではcrontabコマンドを使って設定します。

$ crontab -e

(エディタを選ぶように聞かれた場合は任意のエディタを選んでから)設定ファイルを開き、ファイルの末尾に以下の設定内容を追記し、保存します。

ここでは1時間おきにメールを送るように設定しています。

# 1時間ごとにメールを送る
0 */1 * * * sudo /var/lib/motion_setting/send_camera_mail.sh > /dev/null 2>&1

cronには、設定されたコマンド(ここではsudo /var/lib/motion_setting/send_camera_mail.sh)実行後に自動でメールが送信される機能がデフォルトで設定されています(※今回実装するメール送信処理とはまた別のメールの話)。

送信内容は/var/spool/mail/<ユーザ名>ファイルにどんどん追記されていくので、いつの間にかディスクを圧迫している、なんてこともあります。

したがって、上記の末尾にある> /dev/null 2>&1によって、cronによるメール送信をしないようにしています。

(むしろ最初はあえて> /dev/null 2>&1は書かずに、どんな風にcronでメールが飛ぶのか確認するのも良いかもです)

ちなみに、エラーが出た場合のみcronからメールを送るようにしてほしい場合は、上記の代わりに下記のように設定します。

0 */1 * * * sudo /var/lib/motion_setting/send_camera_mail.sh 1> /dev/null

crontabコマンドで設定された情報は/var/spool/cron/crontabs/<ユーザ名>ファイル内に記述されます。

下記コマンドで、設定された情報を確認することができます。

$ crontab -l

また、下記のように直接設定ファイルを見て確認することもできます。
この場合はrootユーザに切り替わる必要があります。

# less /var/spool/cron/crontabs/<ユーザ名>

sudoコマンドの設定変更

現状、send_camera_mail.shを実行するにはパスワード入力が求められます(※パスワードを設定してる場合のみ)。

自動で動かしたいのに途中でパスワード入力を求められては、システムがそこで止まってしまい何の意味もありません。

そこで、任意のユーザ(<ユーザ名>)がパスワードを入力せずにsend_camera_mail.shを実行できるように、sudoコマンドの設定を少し変更します。

ここではvisudoコマンドを使います。
visudoコマンドは、sudoコマンドの設定ファイルである/etc/sudoersファイルを安全に編集するためのコマンドです。

/etc/sudoersはとても重要なファイルなので、直接編集するのではなくvisudoコマンドを使って編集するようにしましょう。

下記コマンドを実行します。

$ sudo visudo

以下の内容を追記します。

<ユーザ名> ALL=(ALL) NOPASSWD: /var/lib/motion_setting/send_camera_mail.sh

これで、任意のユーザ(<ユーザ名>)がパスワードを入力せずにsend_camera_mail.shを実行できるようになりました。

したがって、cronで設定した時間通りに、任意のユーザ(<ユーザ名>)がsend_camera_mail.shを実行してくれるシステムの作成が完了しました。

ラズパイを再起動(reboot)してmotionを起動し、webカメラを然るべき場所に置けばOKです。

最後に

とりあえず当記事の目標は達成できました。

写真は実際のGmailの受信トレイです。
1時間ごとにメールが送られてきているのが分かるかと思います。
また、早朝は撮影枚数が少ないのでメール1通に収まっていますが、7時以降は人の動きが増えたことで撮影枚数が増え、メールが分けて送信されていることが分かります。
image.png

もしこれで件のストーカー相手が確認できた場合は、警察に提示できる証拠資料が増えますね。

次回はwebページ作成の記事でも書けたらと思います。

生存報告も兼ねて次回の記事も更新できるように頑張ります。それでは。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3