注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。
参加する理由
専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。
学習と共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。
限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。
特別割引: 最新製品を特別割引でお楽しみいただけます。
季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。
👉 一緒に発見し、創造する準備はできましたか? [こちら] をクリックして、今すぐ参加しましょう!
2. 動画の再生
この章では、OpenCV を使って動画ストリームを読み込み再生する方法と、フレーム処理時間を利用して再生速度を制御する方法を学びます。
1. プロジェクト概要
このセクションでは、次のことを行います:
cv2.VideoCaptureを使用して動画ファイルを開く動画をフレームごとに読み込み表示する
動画が終了した場合に自動的に先頭から再生する
処理時間の計算を利用して再生フレームレートを制御する
qキーを押して再生を終了する
2. コードの実行
重要
開始する前に、次の項目を確認してください:
パンチルトが組み立てられている
Raspberry Pi のデスクトップにアクセスできる
コードパッケージがインストールされている
Fusion HAT+ がインストールされ、設定されている
OpenCV がインストールされている
詳細については 0. OpenCV のセットアップ を参照してください。
ターミナルを開き、次のコマンドを入力します:
cd ~/ai-lab-kit/opencv_python python3 cv_2_video.py
スクリプトを実行すると、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. コードの解説
動画ファイルを開く:
cap = cv2.VideoCapture("sample2.mp4")
これは動画ファイルを開き、フレームを読み取るための
VideoCaptureオブジェクトを作成します。動画から 1 フレームを読み込む:
ret, frame = cap.read()
retはフレームの読み込みに成功した場合Trueになります。動画が終了した場合や読み込みに失敗した場合は
Falseになります。frameは画像データ(NumPy 配列)です。
動画が終了したらループ再生する:
if not ret: cap.set(cv2.CAP_PROP_POS_FRAMES, 0) continue
動画が終了した場合、再生位置を最初のフレームに戻して再生を再開します。
フレームサイズを変更する:
frame = cv2.resize(frame, (640, 480))
各フレームを 640×480 にリサイズすることで、Raspberry Pi 上でも滑らかに表示でき、CPU 使用率を抑えることができます。
フレームを表示する:
cv2.imshow("Video", frame)
Videoという名前のウィンドウに現在のフレームを表示します。再生速度の制御とキーボード入力の取得:
key = cv2.waitKey(30) & 0xFF
フレーム間で約 30 ms 待機し(約 30 FPS)、GUI イベントを処理します。
qを押して終了する:if key == ord("q"): break
qキーを押すとプログラムを終了します。ウィンドウが閉じられた場合に終了する:
if cv2.getWindowProperty("Video", cv2.WND_PROP_VISIBLE) < 1: break
ウィンドウがまだ表示されているかどうかを確認します。 ユーザーがウィンドウを閉じた場合、プログラムは安全に終了します。
動画キャプチャオブジェクトを解放する:
cap.release()
動画ファイルのリソースを解放します。
すべての OpenCV ウィンドウを閉じる:
cv2.destroyAllWindows()
すべての OpenCV ウィンドウを閉じ、GUI リソースを解放します。
5. さらに試してみよう
ウィンドウサイズを変更し、画質への影響を確認してみましょう。
別の動画ファイルに置き換えて互換性を確認してみましょう。
フレームごとの処理時間を出力し、FPS と再生遅延の関係を理解してみましょう。