OpenCV でビデオカメラ画像の表示(Python を使用)
【目次】
【関連する外部ページ】
- OpenCV の公式ページ: https://opencv.org
- GitHub の OpenCV のページ: https://github.com/opencv/opencv/releases
【サイト内の関連ページ】
- OpenCV について [PDF] , [パワーポイント]
- OpenCVとPythonを活用した画像・ビデオ処理プログラム: 別ページ »
【付記】 本ページのプログラムはAIのアシストを受けて作成しています
前準備
Python のインストール(Windows,Ubuntu 上)
- Windows での Python 3.10,関連パッケージ,Python 開発環境のインストール(winget を使用しないインストール): 別ページ »で説明
- Ubuntu では,システム Pythonを使うことができる.Python3 開発用ファイル,pip, setuptools のインストール: 別ページ »で説明
【サイト内の関連ページ】
- Python のまとめ: 別ページ »にまとめ
- Google Colaboratory の使い方など: 別ページ »で説明
【関連する外部ページ】 Python の公式ページ: https://www.python.org/
Python 開発環境のインストール
- Windows での Python 開発環境として,Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, spyder のインストール: 別ページ »で説明
- Windows での PyCharm のインストール: 別ページ »で説明
- Windows での PyScripter のインストール: 別ページ »で説明
OpenCV Python のインストール
Python で OpenCV を動かすためのもの.
OpenCV Python のインストールは:別ページ »で説明1~2 コマンドの実行でインストールできる.
カメラ画像の表示
ビデオカメラを準備し,パソコンに接続しておく.
Python プログラムの実行
- Windows では python (Python ランチャーは py)
- Ubuntu では python3
【サイト内の関連ページ】 Python のまとめ: 別ページ »
【プログラムの機能】
カメラからリアルタイムで映像を取得し,指定した幅(640ピクセル)にリサイズして表示する.アスペクト比を保持しながらフレームをリサイズする.'q'キーで終了する.
【プログラムの説明】
OpenCVを使用したリアルタイムカメラ映像のリサイズと表示
- opencv-python の使用
opencv-python は,OpenCV を Python から利用するためのもの
- リサイズを行う resize_frame 関数
resize_frame関数は,入力された画像を指定した幅にリサイズする.この際,アスペクト比を保持するように高さを計算する.
- メインループ
while True ループ内で以下の処理を繰り返す.
- カメラから1フレーム読み取り
- フレームをリサイズ
- リサイズしたフレームを表示
- キー入力のチェック('q'キーで終了)」
- エラー処理
カメラが開けない場合や,フレームの読み取りに失敗した場合にはエラーメッセージを表示し,プログラムを終了する.
- リソースの解放
プログラム終了時には,v.release()でカメラを解放し,cv2.destroyAllWindows()で作成したウィンドウを閉じる.
- カスタマイズ
resize_width変数を変更することで,リサイズする幅を調整できる.また,cv2.VideoCapture(0)の0を変更することで,異なるカメラを選択できる.
【プログラムの実行法】
このプログラムを実行すると,カメラの映像が表示され,'q'キーで終了できる. 注意点として,カメラへのアクセス権限が必要で,既定(デフォルト)ではインデックス0のカメラを使用する.リサイズ幅はプログラムを書き換えることで調整可能である.また,プログラムは適切にリソースを解放するが,強制終了時('q'キーで終了しなかった場合)にはカメラが解放されない場合がある.
import cv2 import numpy as np # リサイズする幅を指定(例:640ピクセル) resize_width = 640 def resize_frame(frame, width): height = int(frame.shape[0] * (width / float(frame.shape[1]))) return cv2.resize(frame, (width, height), interpolation=cv2.INTER_AREA) v = cv2.VideoCapture(0) if not v.isOpened(): print("カメラを開けませんでした。") exit() while True: r, f = v.read() if not r: print("フレームの読み取りに失敗しました。") break # フレームをリサイズ resized_frame = resize_frame(f, resize_width) cv2.imshow("カメラ映像", resized_frame) # 'q'キーで終了 if cv2.waitKey(1) & 0xFF == ord('q'): break v.release() cv2.destroyAllWindows()
止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる
カメラ,動画ファイルの表示
ビデオカメラを準備し,パソコンに接続しておく.
Python プログラムの実行
- Windows では python (Python ランチャーは py)
- Ubuntu では python3
【サイト内の関連ページ】 Python のまとめ: 別ページ »
【プログラムの機能】
このプログラムは,カメラからリアルタイムで映像を取得するか,複数のビデオファイルを再生するかを選択できる.映像は指定した幅(640ピクセル)にリサイズされ,アスペクト比を保持しながら表示される.'q'キーで終了する.
【プログラムの実行法】
このプログラムを実行すると,まずカメラ(0)かビデオファイル(1)かの選択肢が表示される.カメラを選択した場合はカメラの映像が表示され,ビデオファイルを選択した場合はファイル選択ダイアログが開く.ビデオファイルは複数選択可能で,選択したファイルが順番に再生される.いずれの場合も'q'キーでプログラムを終了できる. 注意点として,カメラ使用時はアクセス権限が必要で,既定(デフォルト)ではインデックス0のカメラを使用する.リサイズ幅はresize_width変数を変更することで調整可能である.プログラムは適切にリソースを解放するが,強制終了時('q'キーで終了しなかった場合)にはカメラが解放されない場合がある.対応するビデオファイル形式は.mp4,.avi,.movである.
import cv2 import numpy as np import tkinter as tk from tkinter import filedialog resize_width = 640 def resize_frame(frame, width): height = int(frame.shape[0] * (width / float(frame.shape[1]))) return cv2.resize(frame, (width, height), interpolation=cv2.INTER_AREA) def select_video_files(): root = tk.Tk() root.withdraw() file_paths = filedialog.askopenfilenames(filetypes=[("Video files", "*.mp4 *.avi *.mov")]) return list(file_paths) # タプルをリストに変換 print("0: カメラ") print("1: ビデオファイル") choice = input("選択してください (0/1): ") if choice == "0": v = cv2.VideoCapture(0) if not v.isOpened(): print("カメラを開けませんでした。") exit() video_files = [] elif choice == "1": video_files = select_video_files() if not video_files: print("ビデオファイルが選択されませんでした。") exit() v = cv2.VideoCapture(video_files[0]) else: print("無効な選択です。") exit() current_video_index = 0 while True: if choice == "1" and (not v.isOpened() or not v.read()[0]): current_video_index += 1 if current_video_index >= len(video_files): print("すべてのビデオファイルの再生が終了しました。") break v.release() v = cv2.VideoCapture(video_files[current_video_index]) if not v.isOpened(): print(f"ファイル {video_files[current_video_index]} を開けませんでした。") continue r, f = v.read() if not r: if choice == "0": print("フレームの読み取りに失敗しました。") break else: continue resized_frame = resize_frame(f, resize_width) cv2.imshow("映像", resized_frame) if cv2.waitKey(1) & 0xFF == ord('q'): break v.release() cv2.destroyAllWindows()
止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる