Raspberry Piの静止画撮影プログラム|picamera2で高解像度の写真を撮るPythonコード例【2026年版】

プログラミング・電子工作






Raspberry Piの静止画撮影プログラム|picamera2で高解像度の写真を撮るPythonコード例【2026年版】|YOFUKASI AI




Raspberry Pi / Python

Raspberry Piの静止画撮影プログラム――picamera2で高解像度の写真を撮るコード例。

撮った写真、思ったより画質が低くありませんか。プレビュー設定のまま撮影してしまう典型的なミスから、ファイルの上書き防止まで、実際に動くプログラムの作り方を解説します。

YOFUKASI AI編集部 | 更新日:2026年8月18日 | 読了目安:約12分

Chapter 01 — Introduction

01「なんとなく撮れた」から「意図通りに撮る」へ

結論から言えば、picamera2で写真は簡単に撮れるが、「意図した解像度で」「上書きせずに」撮ろうとすると、もう一段階の理解が必要になる。プレビュー用の設定のまま撮影すると、画面表示と同じ低めの解像度で保存されてしまう。また、ファイル名を固定したまま繰り返し撮影すると、前の写真がどんどん上書きされてしまう。

実例として、picamera2で静止画を保存する方法を丁寧に解説した記事がある。picamera2でカメラの映像を静止画として保存する(Marupeke-IKD)では、create_still_configurationメソッドで取得したconfigは静止画モードのコンフィグであり、これをconfigureメソッドに設定した時点でPicamera2オブジェクトが「静止画モード」に切り替わると説明されている。プレビュー用の設定と静止画用の設定は別物であるという点が、意図通りの写真を撮る第一歩になる。

編集部見解:「動いた」と「意図通りに動いた」の間には、実は結構な距離がある。特にカメラプログラムは、画面上で一見正しく見えても、保存されたファイルを開いて初めて解像度の低さに気づく、ということが起こりやすい。撮影前に「今どの設定で撮ろうとしているか」を意識する癖をつけたい。
― YOFUKASI AI編集部

本記事では、picamera2を使った静止画撮影プログラムの基礎知識から、解像度とファイル名管理の仕組み、そして実際に複数枚を連番で撮影するプログラムの作り方までを、初心者を対象に解説する。



Chapter 02 — Background

02静止画撮影プログラムの基礎知識

picamera2で静止画を撮影するコードは、大きく分けて「高レベルAPI」と「低レベルAPI」の2種類がある。手早く1枚撮りたいだけなら、高レベルAPIのstart_and_capture_file()を使うのが最も簡単である。

from picamera2 import Picamera2

picam2 = Picamera2()
picam2.start_and_capture_file("test.jpg")

この3行だけで撮影から保存までが完了する。実際に、この最小構成の書き方を紹介している記事もある。ラズパイカメラモジュールV3のファーストインプレッション(ラズパイダ)では、Picamera2はとても便利で単に撮影するだけならもっと端折ることもでき、Picamera2をインポートしてインスタンス化したあとstart_and_capture_fileを呼ぶだけの3行でOKだと紹介されている

用語の整理

  • 低レベルAPI:start()・configure()・capture_file()のように、各処理を個別に呼び出す書き方。細かい制御がしやすい。
  • 高レベルAPI:start_and_capture_file()のように、複数の処理をまとめて行う書き方。手早く書けるがカスタマイズの余地は少ない。
  • main / lores / raw:picamera2が内部で扱う3種類の画像ストリームの名前。通常の撮影では主に”main”を使う。

高レベルAPIには、複数枚を撮影するstart_and_capture_files()という関数も用意されている。Pythonライブラリ(Rasberry Piカメラ操作):Picamera2(KIYO)では、静止画の高レベルAPIとしてstart_and_capture_file(静止画撮影)とstart_and_capture_files(時間遅れごとの複数画像撮影)の2つがあり、name引数でファイル名を、delay引数で撮影前の待機時間を指定できると説明されている

Chapter 03 — Mechanism

03解像度とファイル名管理の仕組み

撮影した写真の解像度は、プレビューウィンドウの大きさと連動してしまうことがある。実際にこの点でつまずいた経験が記録されている。Picamera2を使った写真の撮影(ノーザラントの研究室)では、撮影した写真のサイズがプレビューウィンドウと同じサイズになってしまい、サイズの大きな写真を撮影したい場合はプレビューウィンドウのサイズも大きくする必要が生じるが、Picamera2には写真撮影モードと動画撮影モードがあらかじめ準備されていると説明されている。つまり、プレビュー表示は小さいままにしつつ、撮影だけ高解像度で行いたい場合は、静止画専用の設定(create_still_configuration)を使う必要がある。

from picamera2 import Picamera2, Preview
import time

picam2 = Picamera2()
preview_config = picam2.create_preview_configuration(main={"size": (640, 480)})
still_config = picam2.create_still_configuration(main={"size": (4056, 3040)})

picam2.configure(preview_config)
picam2.start_preview(Preview.QTGL)
picam2.start()
time.sleep(2)

picam2.switch_mode_and_capture_file(still_config, "highres.jpg")

このように、プレビューは低解像度のまま表示しつつ、撮影の瞬間だけ高解像度の設定に切り替える、という書き方が実務でよく使われる。

ファイル名の上書き問題への対処

ファイル名を固定したまま撮影を繰り返すと、前の写真が上書きされてしまう。この問題への対処法も実例として紹介されている。同記事では、保存されるファイル名が固定だと複数枚撮影しても上書きされてしまうため、num変数を用意してその数字をファイル名にくっつけ、撮影のたびにnumを1ずつ増やすことで上書きを防ぐ方法が紹介されている。

初心者向けのポイント
連番(1, 2, 3…)の代わりに、撮影した日時を使ってファイル名を作る方法もある。from datetime import datetimeのあと、filename = datetime.now().strftime("%Y%m%d_%H%M%S") + ".jpg"のように書けば、「いつ撮った写真か」がファイル名から一目で分かるようになる。長期間にわたって撮影するプログラムでは、こちらの方が管理しやすいことが多い。



Chapter 04 — Comparison

04撮影方法(API・コマンドライン)の比較

静止画を撮影する方法には、Pythonのコード以外にコマンドラインという選択肢もある。用途に応じて整理する。

項目 A. 高レベルAPI(start_and_capture_file) B. 低レベルAPI(capture_file等) C. コマンドライン(libcamera-still)
コードの短さ 非常に短い やや長い コード不要
細かい制御 限定的 可能(解像度・タイミング等) コマンドの引数の範囲内
他の処理との連携 しづらい しやすい(センサー値と組合せ等) しづらい
向いている場面 手早い動作確認 実際のプロジェクトへの組み込み ターミナルでのその場確認

※コマンドラインでの撮影はlibcamera-still -o test.jpgのように実行する。Pythonプログラムとコマンドラインの使い分けはラズベリーパイ入門講座4(カメラモジュールを使用した撮影)(無料のオンラインパソコン教室)でも紹介されている。

動作確認の第一歩はコマンドライン(C案)で十分だが、センサーの値をきっかけに撮影するなど他の処理と組み合わせたい場合は、B案(低レベルAPI)でプログラムに組み込むのが実務的である。

Chapter 05 — Practice

05実践:連番ファイルで複数枚撮影するプログラムを作る5ステップ

ここでは「ボタンを押すたびに、上書きせず連番で写真を保存するプログラム」を作る手順を示す。

  1. STEP1. カメラを起動し、静止画用の設定を準備する

    Picamera2オブジェクトを作成し、静止画用の解像度設定を用意する。

    例:picam2 = Picamera2(); still_config = picam2.create_still_configuration()を記述した。
  2. STEP2. 撮影回数を記録する変数を用意する

    撮影のたびに増やしていく変数(カウンター)を用意する。

    例:count = 1を撮影ループの外側で定義した。
  3. STEP3. ファイル名にカウンターを組み込む

    文字列の連結で、カウンターの数字をファイル名に含める。

    例:filename = "photo_" + str(count) + ".jpg"という形でファイル名を作成した。
  4. STEP4. 撮影してカウンターを増やす

    capture_file(filename)で撮影・保存し、その後カウンターを1増やす。

    例:picam2.capture_file(filename); count += 1を記述した。
  5. STEP5. プログラム終了時にclose()でカメラを解放する

    撮影がすべて終わったら、picam2.close()を呼んでカメラのリソースを解放する。

    例:プログラムの最後にpicam2.close()を追加した。close()を省略していた際、次に別のプログラムでカメラを使おうとしたらエラーになったため、この行を追加した(編集部想定シナリオ)。

ここで作成した仕組みに、時間指定の自動撮影(タイムラプス的な使い方)を組み合わせることも可能である。time.sleep()を組み合わせたループにすれば、一定間隔での連続撮影プログラムに発展させられる。

Chapter 06 — Pitfalls

06注意点・よくある誤解

!誤解1. プレビューが表示できれば撮影も同じ画質になる

プレビュー用の設定のまま撮影すると、プレビュー画面と同じ比較的低い解像度で保存されてしまう。高解像度で撮影したい場合は、create_still_configuration()を使った静止画専用の設定に切り替える必要がある。

!誤解2. ファイル名は毎回同じでも問題ない

ファイル名を固定したまま繰り返し撮影すると、前の写真が上書きされてしまう。連番やタイムスタンプをファイル名に含めることで、意図せず過去の写真を消してしまう事態を防げる。

!誤解3. プログラムを終了すればカメラも自動的に解放される

プログラムを終了しても、close()を呼んでいないとカメラのリソースが正しく解放されず、次にカメラを使おうとした際にエラーになることがある。撮影処理の最後には明示的にclose()を呼ぶ習慣をつけておきたい。



Chapter 07 — FAQ

07FAQ

Q.静止画を撮影する一番シンプルなコードはどう書けばよいですか。
A.picamera2には高レベルAPIが用意されており、Picamera2オブジェクトを作成したあと、start_and_capture_file(“test.jpg”)の1行を呼び出すだけで撮影から保存までを完了できます。細かい設定なしで手早く1枚撮りたい場合に便利です。

Q.撮影した写真の解像度が低いのはなぜですか。
A.プレビュー用の設定(create_preview_configuration)のまま撮影すると、プレビュー画面と同じ比較的低い解像度で保存されてしまいます。フルサイズに近い高解像度で撮影したい場合は、create_still_configuration()で静止画専用の設定を作り、configure()で適用してから撮影する必要があります。

Q.撮影するたびに同じファイル名で上書きされてしまうのを防ぐにはどうすればよいですか。
A.ファイル名に連番やタイムスタンプを含めることで防げます。例えば変数で撮影回数をカウントし、その数字をファイル名に組み込んだり、datetimeモジュールで現在時刻を文字列にしてファイル名に使ったりする方法が一般的です。

Q.capture_file()とstart_and_capture_file()はどう違いますか。
A.capture_file()は、あらかじめstart()でカメラを起動した状態から呼び出す低レベルの撮影メソッドで、細かい制御がしやすいのが特徴です。start_and_capture_file()は、カメラの起動から撮影・保存までをまとめて行う高レベルAPIで、短いコードで手早く撮影したい場合に向いています。

Q.プログラムの最後にclose()を呼ぶ必要はありますか。
A.呼んでおくことが推奨されます。close()を呼ばずにプログラムを終了すると、カメラのリソースが正しく解放されず、次にカメラを使おうとした際にエラーになることがあります。撮影が終わったら明示的にclose()を呼ぶ習慣をつけておくと安全です。

Q.一定間隔で自動的に何枚も撮影するプログラムは作れますか。
A.作れます。ループ処理の中でtime.sleep()を使って撮影間隔をあけながらcapture_file()を繰り返し呼び出すことで、一定間隔での連続撮影(タイムラプス撮影に近い動作)が実現できます。長時間の連続撮影ではストレージ容量にも注意が必要です(編集部見解)。

参考文献

関連記事(内部リンク)

該当なし(本記事はRaspberry Pi・picamera2がテーマであり、内部リンクプールはArduino関連記事のみで構成されているため、無理な挿入は行っていません。)


関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP
CLOSE