注釈

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

参加する理由

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

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

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

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

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

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

2. 動画の再生

この章では、OpenCV を使って動画ストリームを読み込み再生する方法と、フレーム処理時間を利用して再生速度を制御する方法を学びます。

1. プロジェクト概要

このセクションでは、次のことを行います:

  • cv2.VideoCapture を使用して動画ファイルを開く

  • 動画をフレームごとに読み込み表示する

  • 動画が終了した場合に自動的に先頭から再生する

  • 処理時間の計算を利用して再生フレームレートを制御する

  • q キーを押して再生を終了する

Video playback interface illustration

2. コードの実行

重要

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

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

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

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

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

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

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

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

    cd ~/ai-lab-kit/opencv_python
    python3 cv_2_video.py
    
  2. スクリプトを実行すると、OpenCV は Video というタイトルのウィンドウを開き、動画フレームをリアルタイムで表示します。

    動画が最後まで再生されると、自動的に先頭から再生が再開されます。

    プログラムを停止するには、次の方法があります:

    • キーボードで q を押して再生を終了する

    • ウィンドウの閉じるボタンをクリックして閉じる

    ウィンドウが閉じられると、OpenCV のすべてのリソースが解放され、プログラムは終了します。

3. 完全なコード

import cv2

# Open the video file
cap = cv2.VideoCapture("sample2.mp4")

while True:
    # Read one frame from the video
    ret, frame = cap.read()

    # If the video ends, restart from the beginning
    if not ret:
        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
        continue

    # Resize the frame for better display performance
    frame = cv2.resize(frame, (640, 480))

    # Display the frame in a window named "Video"
    cv2.imshow("Video", frame)

    # Wait 30 ms between frames (~30 FPS)
    # This also processes GUI events (keyboard and window events)
    key = cv2.waitKey(30) & 0xFF

    # Press 'q' to exit the program
    if key == ord("q"):
        break

    # Exit if the user closes the window (click the close button)
    if cv2.getWindowProperty("Video", cv2.WND_PROP_VISIBLE) < 1:
        break

# Release the video capture object
cap.release()

# Close all OpenCV windows
cv2.destroyAllWindows()

4. コードの解説

  1. 動画ファイルを開く:

    cap = cv2.VideoCapture("sample2.mp4")
    

    これは動画ファイルを開き、フレームを読み取るための VideoCapture オブジェクトを作成します。

  2. 動画から 1 フレームを読み込む:

    ret, frame = cap.read()
    
    • ret はフレームの読み込みに成功した場合 True になります。

    • 動画が終了した場合や読み込みに失敗した場合は False になります。

    • frame は画像データ(NumPy 配列)です。

  3. 動画が終了したらループ再生する:

    if not ret:
        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
        continue
    

    動画が終了した場合、再生位置を最初のフレームに戻して再生を再開します。

  4. フレームサイズを変更する:

    frame = cv2.resize(frame, (640, 480))
    

    各フレームを 640×480 にリサイズすることで、Raspberry Pi 上でも滑らかに表示でき、CPU 使用率を抑えることができます。

  5. フレームを表示する:

    cv2.imshow("Video", frame)
    

    Video という名前のウィンドウに現在のフレームを表示します。

  6. 再生速度の制御とキーボード入力の取得:

    key = cv2.waitKey(30) & 0xFF
    

    フレーム間で約 30 ms 待機し(約 30 FPS)、GUI イベントを処理します。

  7. q を押して終了する:

    if key == ord("q"):
        break
    

    q キーを押すとプログラムを終了します。

  8. ウィンドウが閉じられた場合に終了する:

    if cv2.getWindowProperty("Video", cv2.WND_PROP_VISIBLE) < 1:
        break
    

    ウィンドウがまだ表示されているかどうかを確認します。 ユーザーがウィンドウを閉じた場合、プログラムは安全に終了します。

  9. 動画キャプチャオブジェクトを解放する:

    cap.release()
    

    動画ファイルのリソースを解放します。

  10. すべての OpenCV ウィンドウを閉じる:

    cv2.destroyAllWindows()
    

    すべての OpenCV ウィンドウを閉じ、GUI リソースを解放します。

5. さらに試してみよう

  • ウィンドウサイズを変更し、画質への影響を確認してみましょう。

  • 別の動画ファイルに置き換えて互換性を確認してみましょう。

  • フレームごとの処理時間を出力し、FPS と再生遅延の関係を理解してみましょう。