OpenCV でビデオカメラ画像の表示(Python を使用)

目次

【関連する外部ページ】

【サイト内の関連ページ】

前準備

Python のインストール(Windows,Ubuntu 上)

サイト内の関連ページ

関連する外部ページPython の公式ページ: https://www.python.org/

Python 開発環境のインストール

OpenCV Python のインストール

Python で OpenCV を動かすためのもの.

OpenCV Python のインストールは:別ページ »で説明1~2 コマンドの実行でインストールできる.

カメラ画像の表示

ビデオカメラを準備し,パソコンに接続しておく.

Python プログラムの実行

【サイト内の関連ページ】 Python のまとめ: 別ページ »

プログラムの機能

カメラからリアルタイムで映像を取得し,指定した幅(640ピクセル)にリサイズして表示する.アスペクト比を保持しながらフレームをリサイズする.'q'キーで終了する.

プログラムの説明

OpenCVを使用したリアルタイムカメラ映像のリサイズと表示

プログラムの実行法

このプログラムを実行すると,カメラの映像が表示され,'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 プログラムの実行

【サイト内の関連ページ】 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」のキーを押して閉じる