たねやつの木

Photographs, Keyboards and Programming

Raspberry Piにカメラモジュールを接続して写真を撮る。

こんにちは、たねやつです。

今回からスマートアクアリウムに向けての環境構築を進めていきたいと思います。

要は家の水槽を一部コンピュータ管理してより安全快適な水槽を作り出そうということです。

目標

  • カメラモジュールを接続できるようになること。
  • 画像をカメラモジュールから取得できるようになること。
  • 取得した画像の簡単な処理(回転など)ができるようになること。

使用するもの

Raspberry Pi

もちろん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サーバーを建てて、ブラウザから参照する方法を紹介しています。

画像が見れましたか?画像がそもそも保存されない場合は指定したディレクトリがおかしい可能性があります。

IMG_20180504231356

IMG_20180504232144

シャッタースピードなどを自動ではなく手動で設定する必要がありそうですが、画像が取得できますね!

水草の部分をアップにしてみても結構画質よく撮れていますね!

ここから露出・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