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