こんにちは、たねやつです。
今回からスマートアクアリウムに向けての環境構築を進めていきたいと思います。
要は家の水槽を一部コンピュータ管理してより安全快適な水槽を作り出そうということです。
目標
- カメラモジュールを接続できるようになること。
- 画像をカメラモジュールから取得できるようになること。
- 取得した画像の簡単な処理(回転など)ができるようになること。
使用するもの
Raspberry Pi
もちろんRaspberry Piが必要になってきます。初期設定などは済ませているものとします。
Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス
- 出版社/メーカー: Raspberry Pi
- メディア: エレクトロニクス
- この商品を含むブログを見る
(秋葉原・日本橋で買うほうが圧倒的にやすいです。。)
今回使用するのはRaspberry Pi Zero Wを使用します。後々設置する場所にはLANケーブルの配線が困難な場所なので、 無線タイプのものを使用します。もちろん普通の2Bとかでも大丈夫です。
以下の設定を済ませた直後のものを使用します。
カメラモジュールの有効化
以下のものを使用します。Amazonのセール時期に結構な確率で安売りされているのでそこを狙ってみるのもいいかもしれません!
純正のカメラの半額以下の価格で購入できました。
赤外線カメラも売っているそうですが今回は普通のカメラを使用します。
カメラ本体とRaspi本体をつなぐ薄っぺらいケーブルは2種類ついてきます。一つはZero用のコネクタと繋げる用、もう一つはZero以外のRaspiと繋げる用です。
Raspiの設定
picameraモジュールの確認
カメラを使用するために必要な Pythonモジュールが存在しているか確認します。
Raspberry PiにOSをインストールする時の方法によるかもしれませんが、私の場合は存在していませんでした。。。(笑)
以下のコマンドをRaspi上で実行することで確認できます。
$ python -c 'import picamera' ImportError: No module named picamera
ImportError: No module named picamera
と表示されている場合モジュールが存在していない事になります。以下の点順で導入しましょう。
$ sudo apt-get udate $ sudo apt-get install python-picamera python3-picamera
完了後、再度`$ python -c 'import picamera'を実行すると今度はエラーが表示されないはずです。
カメラを有効にする
初期設定ではカメラモジュールから信号を受け取るという設定がOFFになっているので、手動でONにする必要があります。
sudo raspi-config
を実行してInterfacing Options > Camera > <Yes>
でONにします。
その後、Raspiを再起動する必要があります。
ファイルの作成
根幹となる部分です。公式のドキュメントではLinuxのコマンドライン上から画像を取得する方法と、 Pythonでソースコードを書いていく方法の2種類が紹介されています。
今回は後者のPythonで取得する方法で進めていきます!
適当な場所にcamera.py
というファイルでコードを作成してきます。
ホームディレクトリ下に好きな名前でディレクトリを作成してやるのがオススメです。
$ cd ← ホームディレクトリに移動 $ mkdir camera ← "camera"というディレクトリの作成 $ cd camera ← 移動 $ touch camera.py ← "camera.py"というファイルの作成
カメラから画像を取得する処理
camera.py
に以下のコードを書き込みます。
from picamera import PiCamera from time import sleep camera = PiCamera() // カメラが画像の取得を開始する camera.start_preview() // 5秒待つ sleep(5) // 画像を収録して保存 camera.capture('/home/[ユーザー名]/[ディレクトリ名]/image.jpg') // カメラが画像の取得を停止する camera.stop_preview()
import
,変数
,クラス
,メソッド
の概念がよくわからない!という場合は以下のようなページが参考になるかもしれません。。。
[ユーザー名]と[ディレクトリ名]の部分には適切な文字列を入れてください。
camera.start_preview()
のあとにsleep(5)
で5秒静止している理由は、公式ドキュメント情報から「露出の固定のために2秒以上静止してね」とあるためです。
ですので本当にきっちりな時間に画像を取得したい場合は、cronなどの定期実行の時間も考える必要があります。
また、WEBサイトなんかに埋め込んで要求があるたびにjpgを作成して表示なんてことをしようとしている場合、推奨ギリギリの2秒にしておかないと待ち時間が長くなってしまいます。(2秒でも長いですが,,,)
実行
以下のコマンドで実行。camera.py
の存在しているディレクトリ内で実行してください。
$ python camera.py
実行権限付与とかrootで実行しなくてもいいんですね。
実行したらカメラのLEDが赤く光ります。処理が終了後指定したパスに指定したファイル名で保存されます。
FTPかなんかで見に行きましょう!以下の記事でRaspiにFTPサーバーを建てて、ブラウザから参照する方法を紹介しています。
画像が見れましたか?画像がそもそも保存されない場合は指定したディレクトリがおかしい可能性があります。
シャッタースピードなどを自動ではなく手動で設定する必要がありそうですが、画像が取得できますね!
水草の部分をアップにしてみても結構画質よく撮れていますね!
ここから露出・SSを下げてコントラストを上げればいい感じにブレなく写ってくれそうです。
ファイル名を現在日時にする
今のままだとファイル名がimage.jpg
固定で実行するたびに上書きされてしまいます。
ファイル名の末尾に現在日付を足してかぶらないようにしましょう。ついでにもう少し定数部分などを切り分けて汎用性の高いコードにしましょう。
import datetime from picamera import PiCamera from time import sleep USER_NAME = "ユーザーネーム" HOME_DIR = "/home/" + USER_NAME SAVE_DIR = HOME_DIR + "保存ディレクトリ" # ファイル名の生成 # 現在時刻を取得 datetime = datetime.datetime.today() datetime_formatted = datetime.strftime("%Y%m%d%H%M%S") # ファイル名に時刻を埋め込む file_name = "IMG_" + datetime_formatted + ".jpg" camera = PiCamera() camera.start_preview() sleep(5) camera.capture(SAVE_DIR + file_name) camera.stop_preview()
ユーザーネーム、保存ディレクトリには任意の値を入力してください。保存ディレクトリの値の末尾には必ずスラッシュ(/)をつけてください。
datetimeモジュールを使いしています。コレで現在時刻の取得、時刻のフォーマットを行います。
出来上がるファイル名は IMG_20180504173025.jpg
のようなかんじで年月日時分秒の順で表示しています。
画像を回転させる
取得できる画像を回転させる場合、start_preview()
を始める前に、camera.rotation = 180
で回転度数を指定できます。
...
camera.rotation = 180
camera.start_preview()
...
180と指定した場合は上下反転した画像になります。
その他いろいろな設定
以下のページにカメラのいろいろな値の設定方法と、参考のコードが載っています。
https://picamera.readthedocs.io/en/release-1.12/recipes1.html
SSや画面解像度を設定できます。
最後に
以上でカメラモジュールから画像を取得する事ができるようになりました!
あとはcronで定期実行したり、webページからのリクエストに答えて画像を表示なんて連携もできます。
それに関しては別記事にて。
参考
https://www.raspberrypi.org/documentation/usage/camera/README.md https://projects.raspberrypi.org/en/projects/getting-started-with-picamera