Raspberry Pi カメラモジュール3をPython OpenCVで操作する方法

Raspberry Pi カメラモジュール3をPython OpenCVで操作する方法

ラズベリーパイの代表的なオプションパーツであるカメラモジュール。Raspberry Pi財団からオートフォーカス機能が搭載されたカメラモジュール V3が発売されました。

画素数も800万画素から1200万画素になり、HDR(High Dynamic Range)モードも利用できます。性能が大幅にアップしているのにもかかわらず、価格は従来のモデルからあまり変わっていない点も要注目です。


Camera Module 2

Camera Module 3
画素数800万画素
(3280 × 2464) 
1200万画素
(4608 x 2592)
センサーSony IMX219Sony IMX708
フォーカス手動調節式
(固定フォーカス)
モーター駆動
(オートフォーカス)
HDR対応なしあり
価格
KSY
4,070円4,400円
詳細詳細を見る詳細を見る

発売後すぐに購入したCamera Module 3。先代のV2と設定や操作方法が異なり、思いのほか苦労しました。

チェックポイント

この記事ではPythonのプログラムからカメラモジュール V3を操作する方法をまとめています。

公式のプロモーション動画はこちらからご覧いただけます。

使用準備

環境の確認

今回、動作確認で使用した環境は以下の通りです。

カメラモジュール V3は最新のOSであるBullseyeでのみサポートされています。OSのバージョンは以下のコマンドで確認できます。

lsb_release -a

カメラモジュールの接続

  1. 黒いロックを持ち上げる。
  2. リボンケーブルを挿入する
  3. ロックを下に押し込んで固定する

まず、カメラポートの黒いロック部分を上に持ち上げます。

カメラポートのロック解除方法
カメラ接続

リボンケーブルを差し込みます。向きに注意してください。端子部分がHDMIポート側に向くよう接続にします。

リボンケーブルの差し込み方
リボンケーブルの向き

黒いロック部分を押して固定します。

リボンケーブルのロック方法
ケーブルのロック

カメラを有効にする

カメラモジュールを利用するときはカメラを有効にする操作が必要です。まず、ターミナルを開きます。

ターミナルの開き方

「sudo raspi-config」をターミナルに入力してenterキーを押します。

sudo raspi-config

「Interface Options」を選択してenterを押します。

「Legacy Camera Enable/disble legacy camera support」を選択。

「はい」を選択。

了解を押す

Finishを選択

「はい」を選択すると、再起動してカメラが有効化されます。

OSのアップグレード

カメラモジュール3はlibcameraというソフトで操作します。OSをアップグレードして、libcameraを最新の状態にします。

まずターミナルで以下のコマンドを実行して、パッケージリストを更新します。

sudo apt update

OSをアップグレード。時間がかかるので気長に待ちましょう。

sudo apt full-upgrade -y

アップグレードが完了したら再起動します。

sudo reboot

ライブラリのインストール

まず、pipを最新のバージョンにします。下記のコマンドをターミナルに入力してEnterキーを押してください。

sudo python -m pip install --upgrade pip

OpenCVをバージョン指定でインストールします。

sudo pip3 install opencv-python==4.5.1.48

numpyというライブラリを最新にします。

sudo pip install -U numpy

picamera2というライブラリをインストールします。picamera2はPythonでlibcameraを操作するためのライブラリです。

sudo apt install python3-picamera2

「libatlas3-base」 パッケージをインストールします。

sudo apt install libatlas3-base

設定の変更

以下のコマンドを実行してconfig.txtを開きます。

sudo nano /boot/config.txt

以下の内容を最下行に追加します。imx708はカメラモジュール3のセンサーの名称です。

dtoverlay=imx708

キーボードで「Ctrl+O」を入力してEnterキーを押すと保存できます。

「Ctrl+X」を押してファイルを閉じます。

以下のコマンドを実行して再起動します。

sudo reboot

Raspberry Pi 3以前のモデルは追加項目あり

Raspberry Pi 3より以前に発売されたモデルを使用する場合は、追加で設定する項目があります。

  • raspi-configで「Glamor」を有効にする
  •  /boot/config.txtで「dtoverlay=vc4-kms-v3d」のコメントアウトを外す

詳細は公式ドキュメントを確認ください。

カメラモジュールが正常に接続されているかの確認

以下のコマンドを実行します。

vcgencmd get_camera

以下のように表示されていれば、カメラが使える状態になっています。

Pythonプログラムで撮影する

まずは基本的な操作方法を解説します。

静止画の撮影

スタートメニューのプログラミングからThonnyを開きます。

以下のプログラムをコピーペーストします。

from picamera2 import Picamera2

picam2 = Picamera2()

#カメラ画像を保存する
picam2.start_and_capture_file("test.jpg")

プログラムを保存して実行します。

プログラムを実行すると、test.jpgというファイル名で画像が保存されます。

動画の撮影

from picamera2 import Picamera2

picam2 = Picamera2()

#5秒間の動画を撮影して保存する
picam2.start_and_record_video("test.mp4", duration=5)

上のプログラムを実行すると、test.mp4というファイル名で5秒間の動画が保存されます。

Pythonプログラムでカメラ映像(動画)を表示する

当初はOpenCVの.read()で画像を読み込もうとしたのですが、映像が表示されませんでした。そこでPicamera2を使って画像を取得してからOpenCVで表示させるという方法にしています。

import cv2
from picamera2 import Picamera2
from libcamera import controls

picam2 = Picamera2()
picam2.configure(picam2.create_preview_configuration(main={"format": 'XRGB8888', "size": (640, 480)}))
picam2.start()
#カメラを連続オートフォーカスモードにする
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})

while True:
  im = picam2.capture_array()
  cv2.imshow("Camera", im)
 
  key = cv2.waitKey(1)
  # Escキーを入力されたら画面を閉じる
  if key == 27:
    break

picam2.stop()
cv2.destroyAllWindows()

プログラムを実行するとカメラの映像が立ち上がります。オートフォーカス機能も有効になっているので、近くの映像も鮮明に撮影できます。

オートフォーカスの速度を早くしたいときは、プログラムの9行目を以下のように変更します。

picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous, "AfSpeed": controls.AfSpeedEnum.Fast})

HDR(High Dynamic Range)モードで表示する

HDR(High Dynamic Range)モードにすると、明るい部分と暗い部分がどちらも鮮明に表現できます。明るさの異なる複数枚の画像を合成して、1枚の画像を生成する仕組みです。

本来、HDRをオンにするときはコマンドを入力する必要があります。以下のプログラムではos.systemを使い、プログラム中でHDRをオンにするコマンドを実行しています

import cv2
from picamera2 import Picamera2
from libcamera import controls
import os

picam2 = Picamera2()

#HDRをオンにする
os.system("v4l2-ctl --set-ctrl wide_dynamic_range=1 -d /dev/v4l-subdev0")
print("Setting HDR to ON")

picam2.configure(picam2.create_preview_configuration(main={"format": 'XRGB8888', "size": (640, 480)}))
picam2.start()
#カメラを連続オートフォーカスモードにする
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous, "AfSpeed": controls.AfSpeedEnum.Fast})

while True:
  im = picam2.capture_array()
  cv2.imshow("Camera", im)
 
  key = cv2.waitKey(1)
  # Escキーを入力されたら画面を閉じる
  if key == 27:
    break

picam2.stop()
cv2.destroyAllWindows()

#HDRをオフにする
os.system("v4l2-ctl --set-ctrl wide_dynamic_range=0 -d /dev/v4l-subdev0")
print("Setting HDR to OFF")

参考にさせていただいたサイト
How To Use Raspberry Pi Camera Module 3 with Python Code

OpenCVを使用すれば顔認識もできる

OpenCVを使えるメリットは画像を扱うための機能が豊富に用意されていることです。顔認識もすぐに実装できます。

import cv2
from picamera2 import Picamera2
from libcamera import controls

face_detector = cv2.CascadeClassifier("/usr/local/lib/python3.9/dist-packages/cv2/data/"\
"haarcascade_frontalface_default.xml")
cv2.startWindowThread()

picam2 = Picamera2()
picam2.configure(picam2.create_preview_configuration(main={"format": 'XRGB8888', "size": (640, 480)}))
picam2.start()
#カメラを連続オートフォーカスモードにする
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})

while True:
    im = picam2.capture_array()

    grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    faces = face_detector.detectMultiScale(grey, 1.1, 5)

    for (x, y, w, h) in faces:
        cv2.rectangle(im, (x, y), (x + w, y + h), (0, 255, 0))

    cv2.imshow("Camera", im)
   
    key = cv2.waitKey(1)
    # Escキーを入力されたら画面を閉じる
    if key == 27:
        break

picam2.stop()
cv2.destroyAllWindows()

映像の中から顔が検出されると、緑の枠で囲まれます。すみません、顔の部分は後から加工して消しています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です