265.ラズパイ無双[11_opencvストリーミング2]
初回:2022/7/13
Raspberry Pi (ラズベリーパイ、通称"ラズパイ")で何か作ってみようという新シリーズです。カメラ画像をストリーミング出来るサーバーのベースとなった記事をご紹介したいと思います。
P子「最終回直前スペシャルという事ね」※1
1.参考資料
最終形のストリーミングサーバーとなる実装の解説記事です。色々と探しましたが、この解説記事が、最も本番環境として使える実用性の高い実装だと思います。
≪参考資料≫
https://qiita.com/RIckyBan/items/a7dea207d266ef835c48
FlaskとOpenCVでカメラ画像をストリーミングして複数ブラウザでアクセスする
この記事自体の解説は、オリジナルの記事を確認されるのが、一番わかりやすいと思います。
P子「丸投げするのね」
解説記事を解説しても仕方ありませんし、元の解説より上手に説明できるとも思えません。ただ、最終的なストリーミングサーバーは、ここで説明されている実装をさらに改造していますので、その違いをここでは述べていきたいと思います。
2.改善の方針1
改善するにあたり、一つ目の方針は、APIサーバーをFlaskではなく、bottleにするという事です。これは、このストリーミングサーバーをラズパイで動かそうとしているからです。
P子「Flaskはラズパイで動かないの?」
問題無く動くと思います。これは単なる趣味の違いです。
ただし、Flaskが好きな人も多くいると思います。最終的なストリーミングサーバーは、Flaskへの改造が上手くいくように用意しておくつもりです。
3.改善の方針2
二つ目の方針は、参考のストリーミングサーバーの中枢である base_camera.py の実装を、@staticmethod や@classmethod ではなく、インスタンス化して使用するように書き換えたことです。実際のところ、各インスタンスから、これらのスタティックメソッド経由で同じカメラインスタンスを使用するという事ですが、その場合、2カメラ対応(USBにカメラを2台接続して使用するケース)に対応可能か、よく分かりませんでした。
現在でもよく分からないのは、実は単純な2カメラすら動いていません。openCvのインストールに問題があったのか、64bit版 Bullseye に問題があるのか、未だに未確認です。ただ、理屈だけで言うと、インスタンス化しておかないとうまくいかない気がしたので、変更しています。
4.改善の方針3
三つ目の方針は、openCvフィルターとして、モジュールを差し替えられる構造にしておくことです。さらに、Web APIサーバーのbottleやFlask を使用しているのですから、それらのモジュールも動的に読み込めるようにしておくことです。そして、bottleのルーティングによるアプリケーションの処理も、動的に差し替えできるようにすることです。これら3種類のオブジェクトをインスタンス化して渡すことで、Webからのデータ登録をフィルターやモジュールに渡して処理を行い、Webに返すなどの機能を、ストリーミングサーバーと独立した形で用意することができるようになります。
5.まとめ
今回は、解説だけで、あまり面白くなかったと思います。実は準備不足で想定していたネタが使えませんでした。
次回は、もう少しきちんと出来ればよいと思います。
P子「間に合うのかしら?」
現状、微妙な状況です。
ほな、さいなら
======= <<注釈>>=======
※1 P子「最終回直前スペシャルという事ね」
P子とは、私があこがれているツンデレPythonの仮想女性の心の声です。