はじめに
Bullseye以降からRaspberryPiOSのカメラ制御の仕様が変わり、従来のraspistillからlibcameraに置き換えられました。
またこれに伴いPythonのライブラリも変更されOpenCVでは制御できなくなりlibcameraベースのpicamera2が必須になりました。
RaspberryPiOS(Bullseye以降)にはPiCamera2とlibcameraがプリインストールされているためホスト側では難無くカメラを使用できますが、仮想環境においてはそもそも前提となるlibcameraの構築手順の情報が乏しく、Pythonライブラリの依存性の問題でほとんどの方が苦労していると思います。
ここではDockerコンテナ内でカメラを制御する方法を確立しまとめています。
具体的なユースケースやプロジェクトの要件に合わせてDockerfileをカスタマイズしてください。
ソースコードはこちらに載せています。
実行環境例
こちらでは以下の環境で動作できました。
始める前にはRaspberry Piにカメラモジュールが接続され、有効化されていることを確認してください。
- Raspberry Pi 5(8GB)
- Raspberry Pi OS 64bit Bookworm(Release 2023-12-05)
- Docker及びDocker Compose
- Camera Module v3
全体構成
app
|-- code
| `-- camera.py
|-- docker-compose.yml
`-- Dockerfile
Dockerイメージ
RaspberryPiOSをベースイメージ化した以下のイメージを使用しています。
https://github.com/dtcooper/raspberrypi-os-docker
FROM dtcooper/raspberrypi-os:python3.11-bookworm
RUN apt update -y && apt upgrade -y && apt install git vim -y
#libcamera
RUN apt install libcamera-tools libcamera-apps-lite -y
RUN apt install libcap-dev libcamera-dev -y
RUN apt install libatlas-base-dev libopenjp2-7 libkms++-dev libfmt-dev libdrm-dev -y
RUN pip install rpi-libcamera rpi-kms
#picamera2
RUN apt install -y python3-picamera2 --no-install-recommends
RUN pip install picamera2
WORKDIR /code
Dockerコンテナはカメラハードウェアとのやり取りに特権アクセスが必要です。
privileged
フラグは、コンテナがホストシステムのデバイスにアクセスするために使用されます。
また、カメラのデバイスファイルにアクセスできるように/dev/video0
とrun/udev:ro
ディレクトリをマウントしています。
version: '3.3'
services:
picamera2:
build: .
stdin_open: true
tty: true
container_name: picamera2
volumes:
- ./code:/code
- /run/udev/:/run/udev:ro
devices:
- /dev/video0:/dev/video0
command: bash
privileged: true
カメラスクリプト
from picamera2 import Picamera2
picam2 = Picamera2()
picam2.start_and_capture_file("test.jpg", show_preview=False)
起動方法
$ docker-compose up -d
カメラスクリプトの実行
Dockerコンテナ起動後は/code
ディレクトリに配置されたcamera.py
という名前のPythonスクリプトを実行します。
これでtest.jpg
という名称の静止画が出力されます。
$ docker-compose exec picamera2 bash
$ python3.11 camera.py
または
$ docker-compose exec picamera2 python3.11 camera.py
最後に
PiCamera2は自動設定を使用しない限り、接続するカメラに応じて設定を変える必要があります。
個別に設定する場合は/boot/firmware/config.txt
をコンテナにマウントする必要があるかもしれません。