9.3 KiB
画像を撮影する - Raspberry Pi
このレッスンでは、Raspberry Piにカメラセンサーを追加し、画像を読み取る方法を学びます。
ハードウェア
Raspberry Piにはカメラが必要です。
使用するカメラはRaspberry Pi Camera Moduleです。このカメラはRaspberry Pi専用に設計されており、Piの専用コネクタに接続します。
💁 このカメラはCamera Serial Interface(モバイル業界プロセッサインターフェースアライアンスによるプロトコル)を使用します。これは画像を送信するための専用プロトコルです。
カメラを接続する
カメラはリボンケーブルを使ってRaspberry Piに接続できます。
タスク - カメラを接続する
-
Piの電源を切ります。
-
カメラに付属しているリボンケーブルをカメラに接続します。これを行うには、ホルダーの黒いプラスチッククリップを少し引っ張って外し、ケーブルをソケットに差し込みます。青い面がレンズから離れる方向、金属ピンのストリップがレンズに向かう方向にしてください。ケーブルが完全に挿入されたら、黒いプラスチッククリップを元の位置に戻します。
クリップを開けてケーブルを挿入する方法を示すアニメーションはRaspberry Pi Getting Started with the Camera module documentationで確認できます。
-
Grove Base HatをPiから取り外します。
-
Grove Base Hatのカメラスロットを通してリボンケーブルを通します。ケーブルの青い面がA0、A1などとラベル付けされたアナログポートの方向を向くようにしてください。
-
リボンケーブルをPiのカメラポートに挿入します。再び黒いプラスチッククリップを引き上げ、ケーブルを挿入してクリップを元に戻します。ケーブルの青い面がUSBとイーサネットポートの方向を向くようにしてください。
-
Grove Base Hatを再装着します。
カメラをプログラムする
Raspberry PiはPiCamera Pythonライブラリを使用してカメラをプログラムできます。
タスク - レガシーカメラモードを有効にする
残念ながら、Raspberry Pi OS Bullseyeのリリースに伴い、OSに付属していたカメラソフトウェアが変更され、デフォルトではPiCameraが動作しなくなりました。代替としてPiCamera2が開発されていますが、まだ使用可能な状態ではありません。
現在のところ、Piをレガシーカメラモードに設定することでPiCameraを動作させることができます。カメラソケットはデフォルトで無効になっていますが、レガシーカメラソフトウェアを有効にすると自動的にソケットも有効になります。
-
Piの電源を入れ、起動を待ちます。
-
VS Codeを起動します。Pi上で直接起動するか、Remote SSH拡張機能を使用して接続します。
-
ターミナルで以下のコマンドを実行します:
sudo raspi-config nonint do_legacy 0 sudo reboot
このコマンドはレガシーカメラソフトウェアを有効にする設定を切り替え、設定を反映させるためにPiを再起動します。
-
Piの再起動を待ち、再度VS Codeを起動します。
タスク - カメラをプログラムする
デバイスをプログラムします。
-
ターミナルで
pi
ユーザーのホームディレクトリにfruit-quality-detector
という新しいフォルダを作成します。このフォルダ内にapp.py
というファイルを作成します。 -
このフォルダをVS Codeで開きます。
-
カメラと対話するためにPiCamera Pythonライブラリを使用します。以下のコマンドでPipパッケージをインストールします:
pip3 install picamera
-
app.py
ファイルに以下のコードを追加します:import io import time from picamera import PiCamera
このコードは必要なライブラリをインポートし、
PiCamera
ライブラリを含みます。 -
次に、カメラを初期化する以下のコードを追加します:
camera = PiCamera() camera.resolution = (640, 480) camera.rotation = 0 time.sleep(2)
このコードはPiCameraオブジェクトを作成し、解像度を640x480に設定します。より高い解像度(最大3280x2464)もサポートされていますが、画像分類器はもっと小さい画像(227x227)で動作するため、大きな画像をキャプチャして送信する必要はありません。
camera.rotation = 0
行は画像の回転を設定します。リボンケーブルはカメラの下部に接続されますが、分類したいアイテムに向けやすくするためにカメラを回転させた場合、この行を回転角度に応じて変更できます。例えば、リボンケーブルをカメラの上部に吊り下げた場合、回転を180に設定します:
camera.rotation = 180
カメラは起動に数秒かかるため、
time.sleep(2)
が必要です。 -
次に、画像をバイナリデータとしてキャプチャする以下のコードを追加します:
image = io.BytesIO() camera.capture(image, 'jpeg') image.seek(0)
このコードはバイナリデータを保存するための
BytesIO
オブジェクトを作成します。カメラからJPEGファイルとして画像を読み取り、このオブジェクトに保存します。このオブジェクトにはデータの位置インジケータがあり、必要に応じてデータを末尾に書き込むことができます。そのため、image.seek(0)
行で位置を先頭に戻し、後で全データを読み取れるようにします。 -
次に、画像をファイルに保存する以下のコードを追加します:
with open('image.jpg', 'wb') as image_file: image_file.write(image.read())
このコードは
image.jpg
という名前のファイルを開き、BytesIO
オブジェクトからすべてのデータを読み取り、そのファイルに書き込みます。💁 画像を直接ファイルにキャプチャすることもできますが、
camera.capture
呼び出しにファイル名を渡す必要があります。このレッスンの後半で画像を画像分類器に送信するためにBytesIO
オブジェクトを使用しています。 -
カメラを何かに向け、このコードを実行します。
-
画像がキャプチャされ、現在のフォルダに
image.jpg
として保存されます。このファイルはVS Codeのエクスプローラーで確認できます。ファイルを選択して画像を表示します。必要に応じてcamera.rotation = 0
行を更新し、再度撮影してください。
💁 このコードはcode-camera/piフォルダにあります。
😀 カメラプログラムが成功しました!
免責事項:
この文書は、AI翻訳サービス Co-op Translator を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知ください。元の言語で記載された文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤解釈について、当方は一切の責任を負いません。