1.はじめに
前回記事の続きを行う。
今回は参考サイトをRaspberry Pi Zero 2 Wで実装し、マシンスペック的に動作可能か確認する。
2.手順
- OpenCVインストール
- 参考サイトの動体検知ソースコードを実行
3.OpenCVのインストール
まずOpenCVをインストールすべく参考サイト内で引用されているパソコン工房の記事を参考にするが、一部変更。
sudo apt-get install python-opencv
sudo apt install python3-opencv
apt-get
とapt
の違いについて
このサイトの内容から要約するとapt
のほうが
・apt-get
やapt-cache
を内包した新しいコマンド
・ユーザレベルなら使いやすい
という事で基本はapt
で良い。
python-opencv
とpython3-opencv
の違いについて
名前から分かる通り、python3-opencv
はPython3.xx.xxのバージョンに向けたOpenCVのバインディングである。本記事投稿時では、これが主流となっている。
python-opencv
はPython2.xx.xxのバージョンに向けたOpenCVのバインディングで簡単に言うと古い。Python2自体は更新が止まっているため、今後の使い勝手を考えるとPython3のほうが無難。もちろん使用環境によってはその限りではないが。
現在のPythonバージョンの確認のコマンドは以下。
python -V
本環境ではPython 3.11.2がインストールされていた。
4.動体検知ソースコード
参考サイトのソースコードをそのまま使用したいが、一部エラーが発生し面倒なのでnanoで#
にてコメントアウトし対応する。
コメントアウトする行は87、88行目でウィンドウ表示に輪郭を入れるものらしい。
コメントアウトしない場合、以下のエラーが出ていた。
[ WARN:@05.330] global ./modules/videoio/src/cap_gstreamer.cpp (1405) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
Traceback (most recent call last):
File "/home/duruga/test/security_cam_motion.py", line 87, in <module>
image, contours, hierarchy = cv.findContours(thresh.copy(), cv.RETR_EXTERNAL , cv.CHAIN_APPROX_SIMPLE)
^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: not enough values to unpack (expected 3, got 2)
このエラーはcv.findContours()の戻り値の足りないため発生している。
・OpenCV 2.x.x / 3.x.x : "image", contours, hierarchy = cv.findContours(...)
・OpenCV 4.x.x : contours, hierarchy = cv.findContours(...)
OpenCV 4系はimageが返ってこないためエラーになっている。
使用環境のOpenCVのバージョン確認方法は以下。
python -c "import cv2; print(cv2.__version__)"
本環境では4.6.0であった。エラーになって当たり前。
5.動作確認
前節のソースコードを適当なディレクトリに保存して実行する。
今回は画面キャプチャボードを使用し、スマホの画面をカメラ入力としている。
ホーム画面で操作をしていないとき。
操作をしたとき。
正常に画面を入力でき、画面操作によって入力映像に変化があった際には左下数値が0→0.08...に変化している。
この程度の負荷であればRaspberry Pi Zero 2 Wでも動作可能と確認できた。
6.おわりに
Raspberry Pi Zero 2 Wにて元々Raspberry Pi 3 Model B Plusで動作してたソースコードをほぼそのまま動作させた。
元のソースコードでカメラの解像度を下げていることもあってか、動作自体は問題ないように感じた。
もちろんJetson nanoなどの高性能な環境と比べるとマウスの動きにラグはあるが、想像していた動作に比べると遥に余裕があると感じた。
次回は目的の動きがない時にアクションを起こす「静体検知」を行いたい。