ラズパイの新カメラスタックに注意

Raspberry Pi の最近の OS バージョンでは、カメラモジュール・カメラスタック周りに大きな変更があり、従来のコード・プログラムがそのままでは動作しないという状況になっていました。CSI 接続しているカメラでその影響を直接出遭ってしまったので、ここに記載します。

手元の環境は、以下の通りです。

  • Raspberry Pi 4
  • 2022-01-28 バージョンの RaspberryPi OS Bullseye Lite (32bit)
  • カメラインターフェース経由カメラモジュールを接続 (IMX219)

OpenCV でのキャプチャに失敗

よくネット上で公開されている以下の Python コードを実行してみると、キャプチャーに失敗します。タイミングの問題かと考えて、ret = True が返ってくるまで待とうとしてみましたが、そういうわけでもなく、永遠に失敗します。

import cv2
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

ret, frame = cap.read()

# ここで False が出力される
# print(ret)

USB 接続の Web カメラではここで正常にキャプチャが出来ます。新カメラスタックになってから、影響を受けているのはカメラインターフェース(CSI) 側のカメラのようです。

また、動作確認によく使われていた “raspistill” コマンドも動かない状態でした。

余談

vcgencmd コマンドを使って状況を確認してみると以下の通りです。認識出来ていないとかいわれてしまいます。

$ vcgencmd get_camera

supported=0 detected=0

簡単な対策

昔のコードを動くようにするには、raspi-config コマンドでカメラの Legacy Camera Support を有効化する、という方法があります。

ここで、有効化を選択して、ラズパイを再起動すると、先ほどのコードや昔のコマンドも使用可能となりました。

ただし、基本的にレガシーのものは今後サポートされていかないものになるので、これから恒常的に使うには不安です。

PiCamera2 を使ってみる

現在開発が進んでいる PiCamera2 を使用してみます。この PiCamera2 はまだ簡単にインストールできる状態にはなっておらず、ネット上の記事を参考に手動で導入を行いました。

公式リポジトリの手順をそのまま適用するのではダメで、必要に応じて本家のドキュメントを見ながら部分的に変更するというちょっと面倒な作業でした。ですので、参考にした日本語のページがとても助かりました。

動作確認

ヘッドレスな環境ということもあり、動作確認のコードは以下のものを使いました。

from picamera2.picamera2 import *

picam2 = Picamera2()
config = picam2.still_configuration()
picam2.configure(config)

picam2.start_preview()
picam2.start()

## ここでデータ取れている
np_array = picam2.capture_array()

## キャプチャデータをファイル保存
picam2.capture_file('demo.jpg')

picam2.stop()

インタラクティブモードで打ち込んでいくと、動作の状況もよくわかります。

関連記事

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください