カメラと画像解析
はじめに
カメラを扱う人はラズパイのメモリが足りなくなって動かなくなることが多そう。なのでスワップを増やしておきましょう。
sudo nano /etc/dphys-swapfile
とやって、中の CONF_SWAPSIZEの設定のところを探す。標準だと
CONF_SWAPSIZE=100
となってると思うので、この行を
CONF_SWAPSIZE=1024
とでもしておきましょう。
その後、以下のコマンドで変更を反映します。
sudo /etc/init.d/dphys-swapfile restart
※これは最初のapt upgradeが通らない時とかにも有効っぽい。
開発論でスワップをオフにしているそうで。ちゃんと言われた通りに設定してる人は、再起動時にまたスワップがオフになるので、そうしないように設定しておきましょう。
sudo systemctl start dphys-swapfile
sudo systemctl enable dphys-swapfile
(確かにスワップを作ると、不慮の電源オフに弱くなるけど、そのままで動かないんじゃ仕方ないので、、 電源ブチ抜きにこれまで以上に注意しましょう。固まりにくくなると思うので、辛抱強く待つようにしましょう。)
カメラと画像解析
マイコンで扱えるセンサには様々なものがあるが、ここでは汎用的で高機能な「カメラ」の取り扱いについて学ぶ。
マイコンに接続したカメラからデジタル画像を受け取るには、デバイスを回路としていかに接続するかよりも、入力された情報をソフトウェア上でいかに扱うかが重要である。
Raspberry Piでは、ラズパイ用のカメラモジュールとUSBカメラのどちらも利用可能だが、ここではラズパイ用カメラモジュールを扱う。
参考サイト
1
カメラの接続、OpenCVからの操作
https://sozorablog.com/camera_shooting/
2
コマンドで静止画撮影、ピント調整とか
https://www.indoorcorgielec.com/resources/raspberry-pi/camera-setup/
カメラの貸し出し
カメラモジュールを貸し出す。
カメラは各自で管理し、最終課題後(あるいは使わなくなったら)返却すること。
カメラの接続
こちらの記事を参考に、カメラモジュールをRaspberry Piに接続する。
向きに注意してリボンケーブルを差し込する。
ラズパイでのカメラの有効化
Raspberry PiにSSHでログイン後、カメラの設定を確認する。
raspi-config
sudo raspi-config
からラズパイの設定画面に入り、Inteface Optionsを選択→legacy camera supportをオフにしておく。
(最初からオフになっていれば変更しなくて問題ない)
config.txtの編集
/boot/config.txt の末尾に、貸し出したカメラモジュールを表す
dtoverlay=IMX219
と書いておく。
sudo nano /boot/config.txt
※補足
もしこの/boot/config.txtに別のdtoverlayがあったりするとカメラが認識されないかもしれない。
例えば1人聞いたのだと、dtoverlay=vc4-kms-v3dとかなんとか書いてあったりした。これはコメントアウトしちゃいましょう(行頭に#)
リブート
設定完了後、一度リブートしておく。
sudo reboot
静止画の撮影テスト
カメラの接続後、撮影可能かをテストする。
ただしMac上のターミナルからSSHで接続する場合、ラズパイ上のGUI機能は使えないので、プレビュー表示などは利用できない点に注意。
撮影
プレビューなしで即時に撮影するには、以下のコマンドを用いる。
libcamera-still -n -o photo.jpg
photo.jpgという名前で撮影された画像が保存される。(コマンドで指定するファイル名を変えれば別の名前で複数撮影できる)
ただし、ラズパイ上にある画像はそのままターミナルでは表示できない。
まずはファイルが作成されているか、それっぽいファイルサイズになっているかを確認してみる。
ls -l
転送
撮影した画像を見るには、何らかの手段でPCなどに転送する必要がある。
PC開発論でやったCyberduckを使って転送するのでもOK。(昨年のものにリンクしています)
一歩進むには、例えばラズパイにウェブサーバを立ててみる手もある。
https://www.fabshop.jp/webserver-apache/
(他にIoTで扱うLINE Notifyで送るとかもあり得る)
ピントの調整
参考サイトを参照。
先述の通りターミナル経由のでの接続ではプレビューができないので、撮影した画像を転送して確認しながら行う。
Picamera2を使ったカメラの操作とClarifaiを使った画像認識
OpenCVを使ったカメラの操作と画像認識
OpenCVというライブラリを用いてカメラを操作する方法も一般的である。
特にOpenCVを用いると、OpenCVの持つ画像認識機能を使うことができる。
(ちょっと高度になるので、チャレンジしたい人向け)
【ラズベリーパイ】監視カメラの作り方|Pythonでカメラモジュールを自在に操作
を参考に、人が来たらシャッター(写真撮影)、くらいのことができるといい感じ。
適宜やってみよう。
ただし上記サイトでは、プレビューウィンドウを開くデモなどがあるが、ターミナルからの操作ではウィンドウを開けないため、エラーになる。画面に出さずに処理をする必要がある。
ラズパイのGUI環境を利用する
カメラ画像を扱う場合、開発時にディスプレイを接続せずにMacからGUI環境を用意してプレビューなどできるようにした方がよさそう。
VNCを使ってMacからGUI接続をする。
SSHで一度ラズパイに入り、
sudo raspi-config
で、「3 Interface Options」→「I3 VNC」をオンにする
MacにVNC Viewerをインストールする。
https://www.realvnc.com/en/connect/download/viewer/macos/
アカウント登録とか必要だけど、手順通りに(英語だけどがんばって)
インストール完了後、VNC Viewerからラズパイに接続する。
sshする際と同じようにホスト名を入れればよい。
pi / パスワード を入力して接続。
デスクトップが表示されるが、最初は解像度がおかしいかもしれない。
メニューの「Preferences」から「Raspberry Pi Configuration」に入ると、Displayのタブで解像度が選べる。1280x720とか?
ラズパイをリブートすると反映される。
まだカメラがうまく動かない気がするので、libcameraを入れ直す。
sudo apt install -y libcamera0
sudo apt install -y libcamera-apps
入ったらたぶんいけるはず??
libcamera-hello
してみよう。
画像ビューアのインストール
せっかくGUI環境を入れたなら、直接ラズパイ上で画像を表示できるように画像ビューアソフトをインストールしておこう。
sudo apt install shotwell
インストールすると、フォルダから画像をダブルクリックで表示されるようになる。
(これは一例で、いろんな画像ビューアがある。)
ミニミニプロジェクト
ここまでで、
何かをトリガにカメラを操作したり(ボタンを押したら写真撮影、センサで検知したら写真撮影等々)
カメラからの入力を別のアクションのトリガにしたり(顔を認識したら写真撮影、カメラに人が写ったらLEDが光る等々)
できるようになる。
これらを元に何かアイディアを考えてみよう。
ひとまず現段階で実際のセンサやデバイスで実現できなくてもいいので、アイディアを考えて、一部は他の簡潔な手段で代替して構わないので、何か企画をデモできるものを作成してみよう。
ただしこれは発表会などは行わない。
個人課題として作成して、その記録をレポートにまとめる。
その他の補足情報
pipでライブラリを入れようとするとexternally-managed-environmentとかなんとか怒られる場合
ラズパイのOSのバージョン上げるとpipで何か入れようとすると、自分で管理してるからやめてくれって言ってくる。
そういう時は、うるさい、いいから入れろ、と言ってあげると通る。
https://raspida.com/pip-error-pep668