nyanpyou Note

主な目的は調べたり作ったりしたプログラミング備忘録(予定)

Raspberry Pi Camera Moduleの扱い方

以前Raspberry Pi Camera Moduleを使いたいがいまいち方法がわからず困ったという内容の投稿をしたが、その後進展があったため以下に記す。


Raspberry Pi Camera Moduleを動かすために、PiCameraというライブラリが用意されている。PiCameraライブラリのアクセス可能なパラメータの一覧は以下。

picamera.readthedocs.io

Raspberry PiWebカメラやCamera Moduleにアクセスしたい場合はimutilsというライブラリを使うと便利。

github.com

imutils使用時に上記の各種パラメータを変更したい場合、VideoStreamオブジェクトを作る時に一緒に宣言してやればよい(PiCameraのパラメータをそのまま使えるようにimutilsは作られている)。

from imutils.video import VideoStream
import time
#例としてautowhitebalanceをfluorescentモードに設定
vs = VideoStream(usePicamera=True, resolution=(1920,1280), framerate=30, awb_mode="fluorescent").start()
time.sleep(2.0)
・・・

OpenCVWebカメラにアクセスする場合とは勝手が異なるため注意する。

露出時間(シャッタースピード)を変更したい場合は、shutter_speedパラメータを変更すればよい。単位はμs。shutter_speedの値はframerateの値によって制限されており、例えば30fpsに設定した場合は、shutter_speedに33333μs(1/30秒)以上の値を設定することはできない。
また、連続静止画撮影のためのwhile文には、time.sleep()を使って適切な値のディレイを設定することを忘れない。

from imutils.video import VideoStream
import cv2
import time
#5fps、露出時間0.2sで撮影したい場合
i = 1
vs = VideoStream(usePicamera=True, resolution=(1920,1280), framerate=5, awb_mode="fluorescent", shutter_speed=200000).start()
time.sleep(2.0)
while True():
    frame = vs.read()
    cv2.imwrite("{}.jpg".format(i), frame)
    i+=1
    time.sleep(0.2)

ディレイを設定せずに実行すると、VideoStreamオブジェクトが更新される前(上の例だと1/5秒経過する前)に、vs.read()の部分に戻ることになり、同じ画像が複数枚保存されてしまう。
今まではこのディレイを意識していなかっため、想定通りの挙動をしていなかったと考えられる。