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」のキーを押して閉じる