みなさんは、研究室に行ったら誰もいなかったなんて経験、ありませんか?僕はよくあります。今回はそんな、「研究室にいったら誰もいなくてぼっちになってしまう」問題を解決すべく、研究室にラズパイを用いた生配信カメラを設置して研究室の様子を確認することでぼっちを回避しようというお話です。実際にやってみると、ラズパイとUSBカメラさえあれば比較的簡単に実現できることが分かりました。
背景
弊研究室にはコアタイムが存在しません。そのため、研究室への出席は自由。時間帯も各自に委ねられています。半分くらいの学生は研究室に来て研究をしています。私もその一人で、人と話したいという理由で研究室に赴きます。
そんな弊研究室ですが、日によっては誰も来てないなんてことがたまにあります。私は研究室のメンバーとおしゃべりしたくて研究室に行っているので、せっかく研究室に出向いたのにぼっちになるなんていうのは非常に辛いものがあるわけです。
そこで、遠隔で予め研究室の出席状況を把握できればぼっち回避できるよなと思い立ちました。それが今回、生配信カメラを設置しようと思ったきっかけです。
システム概要
今回、構築したシステムをご紹介します。
出席状況確認をする方法としては色々な方法が考えられます。ICカード、Bluetooth、感圧、照度、音声認識、画像認識、物体検出など数多にあります。今回は導入のしやすさと研究室メンバーに余計な手間をかけさせないという観点から「研究室内映像のリアルタイム配信」を採用しました。映像配信をやってみたかったというのも採用理由のひとつです。ICカードやBluetoothでも出席状況を確認できますが導入コストや運用の手間がかかるので不採用としました。配信機材としては、そこら辺にあったラズパイとUSBカメラが使えそうだったのでこれらを採用しました。
また、映像の配信範囲については研究室内ネットワークに限定しています。自宅など外部から映像を閲覧する場合は、研究室のネットワーク上のサーバにSSH接続してポートフォワーディングすることでブラウザから映像を確認できます。
システム構築
システム構築の手順は以下のとおりです。
- 機材の調達
- ラズパイのセットアップ
- 機材の設置
- 運用
1. 機材の調達
まずは、みなさんお手持ちのラズパイを用意します。あとはそこら辺に落ちているUSBカメラを拾ってきます。
- RaspberryPi 4 Model B
- Buffalo BSW200MBK
セットアップに使用するモニタやマウス、キーボードもよしなに用意して準備完了です。
2. ラズパイのセットアップ
今回はLinux環境で映像のストリーミング配信が行える MJPG-Streamer というソフトウェアを利用して映像配信を行います。MJPG-Streamerはリソースの少ない組み込みデバイス向けに開発されているのが特徴で、日本語のドキュメントもいくつか存在します。MJPG-Streamerの他には、動体検知が可能なMotionと呼ばれるソフトウェアもあるようですが、それなりのマシンスペックが要求されるようでラズパイには不向きでした。
今回は、こちらの記事を参考にさせて頂きました。
今回使用するラズパイは既にRaspberryPi OS (Bullseye)が入っていたのでそのまま使いましたが、必要に応じて適当なOSをインストールしてください。
それでは、MJPG-Streamerをインストールしていきます。
# 必要に応じてパッケージを更新
$ sudo apt update -y
$ sudo apt upgrade -y
# 必要なライブラリをインストール
$ sudo apt install -y cmake libjpeg-dev
# MJPG-Streamerをclone
$ git clone
最後のsudo make installを実行するとmjpg_streamerコマンドのパスが通ります。
これでMJPG_Streamerが使えるようになりました。あとは、USBカメラをラズパイに接続して配信のコマンドを実行するだけです。
配信を行うコマンドは以下のとおりです。
mjpg_streamer -o './output_http.so -w ./www -p 8080' -i './input_uvc.so -d /dev/video0 -r 1280x720 -fps 30 -q 10'
ラズパイのChromiumでhttp://localhost:8080?action=streamを確認してみましょう
おぉ〜!
こんなに簡単に映像配信できるとは!
感動。
先程のコマンドですがいくつかオプションがあります。
-p: ポート番号 -d: USBカメラのデバイスファイルパス -r: 解像度 -fps: FPS値 -q: 映像品質
USBカメラのデバイスファイルパスは/dev/video0や/dev/video1などを指定します。Linuxでは周辺機器を接続すると、その機器と/dev配下のデバイスファイルが紐付けられます。他にUSBカメラを接続していない場合は/dev/video0を指定することになると思いますが、もしコマンド実行時にデバイスファイルが存在しない旨のエラーになるようであれば、/dev/video1などを指定してみると解決するかもしれません。
もしUSBカメラではなくラズパイ純正のカメラを使用する場合は、コマンドのオプションが変わってきます。気になる方はこちらのサイトが参考になると思います。
解像度に関しては、ややもっさり感はあるものの1920x1080でも、ほとんど遅延なく配信することができました。ただ、1280x720と見た目がほとんど変わらなかったので今回はより軽量な1280x720を選択しました。
ラズパイの起動時に自動的に配信を開始させたい場合は、配信処理をLinuxのサービスに登録しておくことで起動時に配信を開始させられます。今回はこちらに書かれている手順でサービスの登録を行い、ラズパイの起動時にMJPG-Streamerも起動するようにしました。
以上で、ラズパイとUSBカメラで映像を配信できることを確認できました。あとは、ラズパイを研究室のネットワークに接続してIP固定すれば他の機器から映像を確認することができるようになります。
IP固定はこちらの記事が参考になりました。
ラズパイをWi-Fiやイーサネットケーブルで研究室内ネットワークに接続します。今回はイーサネットケーブルで接続しました。ネットワークに接続したら先の記事を参考に、IPv4とRouter、DNS ServersのIPを固定して、再度接続します。ifconfigコマンドでIPが固定されたことを確認したらIP固定は完了です。
3. 機材の設置
設置場所は研究室が最も見渡せる棚の上に設置しました。ラズパイを棚に設置してよしなに配線したら設置完了です。
// 電源確保のために適当に電源プラグをぶち抜いたら、翌日研究室のWi-Fiが止まっていました
4. 運用
機材を設置できたので、早速研究室内ネットワークの外部から映像を確認してみましょう。まずは、自身のPCから研究室のサーバにSSH接続しポートフォワーディングをします。SSHポートフォワーディングする際は、普段のsshコマンドに-Lオプションを付け加えます。詳しく知りたい場合はこちらの記事が分かりやすいです。
ssh <接続先ホスト> -L 8080:<ラズパイのローカルIP>:8080
自身のPCでhttp://localhost:8080?action=streamを確認します。
おぉお〜〜!!
外部からでもちゃんと見れました!
これで家からでも確認できそうです。これで無事にぼっち回避できる!!
// ボッチにならないためにボッチで開発してるのは皮肉が効いてていいですね
ということで早速、研究室のメンバーに見てもらったところ、
「なんか監視されてる感じがして嫌。」
と、至極真っ当なご意見を頂きました。
確かに、一方的に見られているのはあまりいい気持ちではないですね。これはなんとかしたい。
ということで、2つの対策を行いました。
- 映像にぼかしをかける
- 研究室にモニタを設置してどんな映像が配信されているかを常時確認できるようにする
1. 映像にぼかしをかける
映像にぼかしをかけることで見られている感の低減を目指します。本来であれば映像データ自体にぼかしをかけるのが適当ですが、今回は身内内での利用に限られるため、CSSを用いてぼかしをかけるという簡易的な方法を取りました。
MJPG_Streamerは、/?action=stream以外にも/index.htmlなどの静的ページをホスティングしています。そこで/?action=streamの代わりに、CSSが適用可能な/index.htmlでぼかし映像を配信することにしました。
MJPG_Streamerがホスティングしている静的ページのデータはリポジトリ配下のwwwディレクトリに置かれています。ここに置かれているindex.htmlを書き換えていきます。
<html xmlns="<http://www.w3.org/1999/xhtml>" xml:lang="en" style="height: 100%;">
<head>
<title>MJPG-streamer</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<!--[if IE 6]>
<link rel="stylesheet" href="fix.css" type="text/css" />
<![endif]-->
</head>
<body style="margin: 0px; height: 100%; background-color: rgb(14, 14, 14); display: flex; justify-content: center; align-items: center;">
<div style="display: table; overflow: hidden;">
<img src="./?action=stream" style="display: block; -webkit-user-select: none; margin: auto; background-color: hsl(0, 0%, 25%); margin: -3px; -webkit-filter: blur(3px);" />
</div>
</body>
</html>
<img src="./?action=stream" />で配信映像を埋め込んでいます。style属性に-webkit-filter: blur(3px);を指定することで映像にぼかしをかけることができます。
http://localhost:8080を確認してみると、ぼかしが掛かっているのが確認できます!
細かな表情までは分からなくなったことで、最初に比べて見られている感が少しばかり低減できたと思います。
ただ、細かいことを言うとブラウザ上で-webkit-filter: blur(3px);の記述を削除してしまえば生の映像が見れたり、/?action=streamや/stream.htmlで生の映像が見れたりしてしまうので、絶対に生の映像を見られたくない場合は映像データ自体にぼかしを入れるようにしてください。
/?action=streamや/stream.htmlについては、ソースコードから該当箇所を削除したりファイルを削除することでアクセスさせないようにすることができます。
2. 研究室にモニタを設置する
研究室にモニタを設置してどんな映像が配信されているかを常時確認できるようにすることで、知らないところで配信されている感の低減を目指します。
家電量販店によくある、カメラのリアルタイム映像がモニタに映っているアレです。
それでは、モニタを用意します。今回はちょうどいいモニタ付きラズパイがそこら辺に落ちていたのでこちらを使用します。
このラズパイを研究室内のネットワークに接続して、Chromiumでhttp://localhost:8080を全画面表示しておきます。
また、放置しているとスクリーンセーバーが起動してしまうのでこれを無効化しておきます。こちらの記事が参考になります。
設置した様子はこんな感じです。
これで配信映像を確認できるようになり、知らないところで配信されている感を少しだけ低減できたかと思います。
おわりに
ということで、今回はぼっちを回避するために、ラズパイを使ったカメラ映像の配信を行ってみました。所感として、映像の配信自体は非常に簡単にできたことに驚きました。MJPG-StreamerをインストールしてUSBカメラを接続し、コマンドを実行したら配信できてしまうんです。面倒だったのはむしろ、IP固定や映像にぼかしをかけるところです。掛かった時間としては、映像を配信するのに2時間、その他の設定や機材設置に5時間、計7時間くらいで構築できました。 現在、この配信映像は研究室のメンバーなら誰でも確認できるようになっています。ちなみにこのシステムの名前は「ぼっち回避くん」です。 ぼっち回避くんを数日使ってみた感想としては、ぼっちにならない安心感が得られるのと、意外にも、みんながいるから研究室に行こう!という研究室に行くモチベーションに繋がることがわかりました。ぼっち回避くんを設置してよかったと思います。