自宅にペットや高齢者などを見守るカメラを設置している人はどのくらいいらっしゃるでしょう。特に外出先からスマホでサクッと確認できたら便利ですよね。
既製品でも構いませんが、ラズパイとカメラモジュールで簡易的なストリーミングカメラを構築してみます。
断っておきますが、私はペットも高齢者も見守る環境ではありません。
今回の環境
自宅内であれば、Wi-Fiに接続するだけで済むことがほとんどです。外出先から確認となると、ルーターを経由しないとなりませんから、ポート開放が必要です。
更に、カメラの映像はストリーミングと言って配信する機能が無ければなりません。単にカメラで撮影できるだけでは、その機械でしか確認できません。
録画を再生するのではなく、リアルタイムに視聴するなら、映像を送り続けている状態にしないとなりません。
つまり、提供(serve)しないとならないので、ある意味でサーバーになります。
ポート開放するとセキュリティのリスクがとても高まります。できればVPNサーバー経由で閲覧した方が良いでしょう。
- カメラの映像を配信するサーバー(Raspberry Pi )
- Raspberry Pi用カメラモジュール
- ルーターのポートフォワーディング(ポート開放)
- 別のVPNサーバーと連携
Raspberry Pi は手に入りやすいRaspberry Pi 4にしました。スペック的には3B+でも良いです。Raspberry Pi Zero 系は色々と遅いので、今回は避けます。
カメラモジュールは、Raspberry Pi用のものです。メニューからカメラを有効にして再起動で使えます。

ルーターのポート開放は機種によります。この記事では家庭内で確認しています。
VPNサーバーと連携させて外出先からも使ってください。
最終的な出来上がり
インストール自体はopenCVだけ気をつければ10分程度です。
プログラムを実行すると、Webブラウザ経由で閲覧できます。

ポートは5000番になっています。

前回に構築したVPNサーバーと連携して、外出先からこのカメラのストリーミングも安全に閲覧できます。
ウェブアプリケーションフレームワーク「Flask」
今回のストリーミングはWebブラウザで確認するパターンです。
色々試してみたところ、いつものようにgithubから探して、文系の私にも構築できた方法でご紹介します。
mjpg_streamerなんかが有名だと思いますけど、flaskというフレームワークが気になっていたので、ちょうど良かった。
利用したプログラム:pi-camera-stream-flask
ウェブアプリケーションフレームワークの「flask」を利用しています。
肝心のプログラムは比較的に短く、gitで取り寄せればOKで手間なしです。
それにコードが複雑ではないため、理解し易く、自分で手を入れるのも良さそうに思えたからです。(自分でコードを書けないので)
この作者さん、どこかで見たことあると思ったら、スマートミラーの動画で発見していました。
インストールの注意点
サイトにあるように、各種ライブラリをインストールし、必要なアプリケーションを入れていきます。【OSはRaspberry Pi OS(32bit)のBuster】
先ずはいつものアップデートとアップグレードから始めましょう。
sudo apt update
sudo apt full-upgrade
aptコマンドで必要なライブリを追加していきます。ここは特に問題ないでしょう。
sudo apt install libatlas-base-dev
sudo apt install libjasper-dev
sudo apt install libqtgui4
sudo apt install libqt4-test
sudo apt install libhdf5-dev
次に、Flask、numpy、imutils、opencvをpip3コマンドで入れていきます。
pip、pip3やPython、Python3とか、ホントよく分からない。単純に統一して欲しい、と感じるのは非エンジニアだからかな。
どうやら現時点のRaspberry Pi OSでは、pip3も入っているし、flaskもnumpyも入っていた。
sudo pip3 install flask (既に入っていた)
sudo pip3 install numpy (既に入っていた)
sudo pip3 install imutils
問題のopencv
検索すると色々と出てくる問題のopencv-contrib-python、opencv-pythonは、調べた結果、参考にするサイトとは別の方法でインストールします。
armv7でbusterに対応しているバージョンです。バイナリで提供されます。
sudo pip3 install opencv-contrib-python==4.4.0.46
参考:https://www.piwheels.org/project/opencv-contrib-python/#install
piwheelsサイトに書いてあったとおり、必要なモジュールがあります。念のためインストールを実行しました。Raspberry Pi OSをアップグレードした段階ではすべて入っていましたので、飛ばしても大丈夫です。
sudo apt install libaec0 libaom0 libatk-bridge2.0-0 libatk1.0-0 libatlas3-base libatspi2.0-0 libavcodec58 libavformat58 libavutil56 libbluray2 libcairo-gobject2 libcairo2 libchromaprint1 libcodec2-0.8.1 libcroco3 libdatrie1 libdrm2 libepoxy0 libfontconfig1 libgdk-pixbuf2.0-0 libgfortran5 libgme0 libgraphite2-3 libgsm1 libgtk-3-0 libharfbuzz0b libhdf5-103 libilmbase23 libjbig0 libmp3lame0 libmpg123-0 libogg0 libopenexr23 libopenjp2-7 libopenmpt0 libopus0 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpixman-1-0 librsvg2-2 libshine3 libsnappy1v5 libsoxr0 libspeex1 libssh-gcrypt-4 libswresample3 libswscale5 libsz2 libthai0 libtheora0 libtiff5 libtwolame0 libva-drm2 libva-x11-2 libva2 libvdpau1 libvorbis0a libvorbisenc2 libvorbisfile3 libvpx5 libwavpack1 libwayland-client0 libwayland-cursor0 libwayland-egl1 libwebp6 libwebpmux3 libx264-155 libx265-165 libxcb-render0 libxcb-shm0 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxi6 libxinerama1 libxkbcommon0 libxrandr2 libxrender1 libxvidcore4 libzvbi0
opencv-pythonも同じくバージョンを指定してインストールします。
sudo pip3 install opencv-python==4.5.1.48
改めて記載しておくと、OpenCVはバイナリでbusterでも動作するバージョンを指定してインストールしました。
今回opencvをバージョン指定してインストールした方法
sudo pip3 install opencv-contrib-python==4.4.0.46
sudo pip3 install opencv-python==4.5.1.48
そのため参考にするサイトにあった方法ではインストールしませんでした。
調べてみるnumpyのバージョンと組み合わせがあるようです。
どうやらコンパイルするみたいで、Raspberry Piの性能では1時間以上?かかるとあり、現実的ではありませんね。Raspberry Pi Zero 系だと1日かかったとissueにありました。
sudo pip3 install opencv-contrib-python
sudo pip3 install opencv-python
これで、コケることなく無事にスムーズにインストールは完了しました。
プログラムをダウンロード&実行
早速、作者のgithubからPythonプログラムをダウンロードして実行してみましょう。
git clone https://github.com/EbenKouao/pi-camera-stream-flask.git
pi-camera-stream-flask/というフォルダがあり、その中のmain.pyを実行します。
cd pi-camera-stream-flask/
sudo python3 main.py
実行すると、警告が出ていました。内容は、ちゃんとWSGIサーバーの仕様に準拠しろよ、ってことでした。
実稼働環境で開発サーバーを使用しないでください。
代わりに、運用WSGIサーバーを使用してください。
Serving Flask app "main" (lazy loading) Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. Debug mode: off Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
別PCのWerbブラウザでなら、Raspberry Piの稼働しているIPアドレスにコロンで5000番ポートで確認できます。


カメラモジュールを接続したRaspberry Piなら、localhost:5000/で観られます。

結構、メモリー消費があるようなので、長時間も表示していると、閲覧デバイス側のWebブラウザでメモリー消費が大きくなります。macで3時間くらい試してみました。一応、大丈夫でした。
プログラムをカスタマイズ
プログラムもシンプルにcamera.pyとmain.py、表示用のHTMLはテンプレートフォルダに入っています。非エンジニアにとっては難しいですけど、それほど複雑なプログラムではありませんので、ご自分でカスタマイズしましょう。
Pythonを勉強しているなら、ちょうど良い教材だなと感じました。特に画像処理系は人気があるので、前から気になっていました。作者のEbenKouaoさんに感謝です。
画像を処理するためにopenCVをインストールしてありますが、機械学習にも利用するので、見守りカメラに物体検知を組み込むなど、コードを勉強しながら発展させてみてはいかがでしょう。
VPNサーバーと連携させて試せるように、簡単に用意できるストリーミングカメラのご紹介でした。