注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。

参加する理由

  • 専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。

  • 学習と共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。

  • 限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。

  • 特別割引: 最新製品を特別割引でお楽しみいただけます。

  • 季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。

👉 一緒に発見し、創造する準備はできましたか? [こちら] をクリックして、今すぐ参加しましょう!

3. リアルタイムカメラキャプチャ

前の章では、ローカルの動画ファイルを読み込み再生する方法を学びました。 この章ではさらに一歩進み、 Raspberry Pi カメラ を使ってリアルタイムで映像を取得し、OpenCV を用いた 色空間変換 を行います。

1. プロジェクトの目的

  • Picamera2 を使用してカメラのリアルタイムフレームを取得する

  • カメラ出力を BGRA 形式から BGR 形式へ変換する

  • OpenCV を使用してリアルタイムプレビューを表示する

  • 異なる色空間の特徴と用途を理解する

Real-time camera preview illustration

2. コードの実行

重要

開始する前に、次の項目を確認してください:

  • パンチルトが組み立てられている

  • Raspberry Pi のデスクトップにアクセスできる

  • コードパッケージがインストールされている

  • Fusion HAT+ がインストールされ、設定されている

  • OpenCV がインストールされている

詳細については 0. OpenCV のセットアップ を参照してください。

  1. ターミナルを開き、次のコマンドを入力します:

    cd ~/ai-lab-kit/opencv_python
    python3 cv_3_camera.py
    
  2. プログラムを実行すると、OpenCV のウィンドウが 2 つ表示されます:

    • BGR Frame – カメラのカラー映像を表示

    • GRAY Frame – 同じ映像をグレースケールで表示

    プログラムを終了する方法は次の 2 つです:

    • キーボードの q キーを押す

    • ウィンドウの閉じるボタン(X)をクリックする

    終了すると、カメラのストリーミングが停止し、すべての OpenCV ウィンドウが閉じられます。

3. サンプルコード

以下は、この章で使用する完全な Python サンプルコード( cv_3_camera.py )です:

# Import Picamera2 for Raspberry Pi Camera
from picamera2 import Picamera2
import cv2
import time

# Create a Picamera2 object
picam2 = Picamera2()

# Create a camera configuration
# XRGB8888 is a 4-channel format (similar to BGRA)
# size sets the resolution of the camera frame
config = picam2.create_preview_configuration(
   main={"size": (640, 480), "format": "XRGB8888"}
)

# Apply the configuration to the camera
picam2.configure(config)

# Start the camera
picam2.start()

print("Streaming... press 'q' to quit")

# Window names
WINDOW_BGR = "BGR Frame"
WINDOW_GRAY = "GRAY Frame"

while True:
   # Capture one frame as a NumPy array (BGRA-like format)
   frame_bgra = picam2.capture_array()

   # Convert BGRA to BGR for normal color display
   frame_bgr = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2BGR)

   # Convert BGRA directly to grayscale
   frame_gray = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2GRAY)

   # Display the color and grayscale frames
   cv2.imshow(WINDOW_BGR, frame_bgr)
   cv2.imshow(WINDOW_GRAY, frame_gray)

   # Process GUI events and check keyboard input
   # Press 'q' to exit the loop
   key = cv2.waitKey(1) & 0xFF
   if key == ord("q"):
      break

   # Exit if the user closes any OpenCV window
   if (cv2.getWindowProperty(WINDOW_BGR, cv2.WND_PROP_VISIBLE) < 1 or
      cv2.getWindowProperty(WINDOW_GRAY, cv2.WND_PROP_VISIBLE) < 1):
      break

   # Optional: limit frame rate to reduce CPU usage (about 30 FPS)
   time.sleep(1 / 30)

# Stop the camera
picam2.stop()

# Close all OpenCV windows
cv2.destroyAllWindows()

4. コードの解説

  1. 必要なライブラリをインポートします:

    from picamera2 import Picamera2
    import cv2
    import time
    

    Picamera2 は Raspberry Pi カメラからフレームを取得するために使用し、OpenCV は画像の変換と表示に使用します。

  2. Picamera2 オブジェクトを作成し、カメラを設定します:

    picam2 = Picamera2()
    
    config = picam2.create_preview_configuration(
        main={"size": (640, 480), "format": "XRGB8888"}
    )
    
    picam2.configure(config)
    picam2.start()
    

    これにより、カメラは 640×480 の解像度で動作します。 XRGB8888 は 4 チャンネル形式のため、取得されるフレームは BGRA に近い形式になります。

  3. NumPy 配列としてフレームを取得します:

    frame_bgra = picam2.capture_array()
    

    ループごとにカメラから 1 フレームを取得します。

  4. 表示用にフレームを変換します:

    frame_bgr = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2BGR)
    frame_gray = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2GRAY)
    
    • frame_bgr は通常のカラー表示用です。

    • frame_gray は同じフレームのグレースケール版です。

  5. 2 つのウィンドウに表示します:

    cv2.imshow(WINDOW_BGR, frame_bgr)
    cv2.imshow(WINDOW_GRAY, frame_gray)
    

    OpenCV のウィンドウが 2 つ開き、1 つはカラー映像、もう 1 つはグレースケール映像を表示します。

  6. 終了条件( q キーまたはウィンドウを閉じる):

    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break
    
    if (cv2.getWindowProperty(WINDOW_BGR, cv2.WND_PROP_VISIBLE) < 1 or
        cv2.getWindowProperty(WINDOW_GRAY, cv2.WND_PROP_VISIBLE) < 1):
        break
    
    • q キーを押すとプログラムを終了します。

    • どちらかのウィンドウを閉じても安全に終了します。

  7. FPS を制限して CPU 使用率を抑える:

    time.sleep(1 / 30)
    

    小さな待機時間を入れることで、ループを約 30 FPS で実行し、Raspberry Pi の CPU 負荷を軽減できます。

  8. カメラを停止し、OpenCV ウィンドウを閉じます:

    picam2.stop()
    cv2.destroyAllWindows()
    

    プログラム終了前にカメラを解放し、すべての OpenCV ウィンドウを閉じます。

5. 色空間変換の重要性

カメラから出力される生の画像形式は、OpenCV が処理に使用する形式と必ずしも一致するとは限りません。 この例では、Picamera2 は XRGB8888(BGRA) 形式で画像を出力しますが、OpenCV では主に BGR 形式が使用されます。

そのため、次のように画像を変換する必要があります:

frame_bgr = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2BGR)

これにより、画像のチャンネル順序が OpenCV の標準である BGR 形式になり、正しく表示・処理できるようになります。

さらに、画像をグレースケールへ変換することもできます:

frame_gray = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2GRAY)

これにより、カメラから取得した画像を OpenCV の画像処理ワークフローに適した形式へ変換できます。

代表的な色空間と用途

Color Space

Characteristics

Typical Use Cases

BGR

OpenCV の標準フォーマット

画像表示、基本処理、エッジ検出

RGB

人間の知覚に近い色表現

可視化、ディープラーニングの入力画像

GRAY

単一チャンネルのグレースケール画像

物体検出、エッジ検出、処理速度の最適化

HSV

色相と明るさを分離

色検出、物体追跡、セグメンテーション

YCrCb

輝度と色差を分離

顔検出、動画圧縮、照明変化への耐性

例えば、 HSV色検出や物体追跡 に適しており、 YCrCb顔認識や照明条件が変化するシーン に強い特徴があります。

6. 拡張と練習

  • BGR から GRAY や HSV への変換を試し、結果を観察してみましょう。

    例えば次のように使用します:

    • cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2RGB)

    • cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2HSV)

    • その他

  • 異なる解像度(例:1280×720)を試し、遅延やフレームレートへの影響を確認してみましょう。

  • 前章の動画再生コードと組み合わせて、カメラ映像と動画ソースを切り替える機能を実装してみましょう。