Python
 Computer >> コンピューター >  >> プログラミング >> Python

Tkinterウィンドウにウェブカメラ映像を表示する方法

Pythonのライブラリはそれぞれ独立しており、目的に応じて自由に組み合わせて使うことができます。特定の機能を持つアプリケーションを構築する際にも、複数のライブラリを連携させることで柔軟な開発が可能です。この記事では、OpenCVTkinterを組み合わせて、Tkinterウィンドウ内にウェブカメラの映像をリアルタイム表示するアプリケーションを作成します。

OpenCVは、コンピュータビジョンや画像処理関連のタスクを扱うための代表的なPythonライブラリです。一方、TkinterはPython標準搭載のGUIツールキットで、シンプルなデスクトップアプリケーションの画面構築に適しています。

必要なパッケージのインストール

アプリケーションを作成するには、ローカル環境にOpenCVとPillowがインストールされている必要があります。以下のコマンドを実行してインストールしてください。

pip install opencv-python
pip install Pillow

仕組みの概要

このアプリケーションの基本的な流れは次のとおりです。

まず、OpenCVのVideoCaptureを使ってウェブカメラを開き、フレームを連続的に取得します。取得した各フレームはBGR形式のNumPy配列であるため、RGB形式に変換した上で、Python Pillow(PIL)を使って画像オブジェクトに変換します。さらにImageTk.PhotoImageに変換することで、TkinterのLabelウィジェットに表示できるようになります。after()メソッドで一定間隔ごとに処理を繰り返すことで、静止画が連続的に切り替わり、動画のように表示される仕組みです。

サンプルコード

# 必要なライブラリをインポート
from tkinter import *
from PIL import Image, ImageTk
import cv2

# Tkinterウィンドウのインスタンスを作成
win = Tk()

# ウィンドウサイズを設定
win.geometry("700x350")

# 映像フレームを表示するためのラベルを作成
label = Label(win)
label.grid(row=0, column=0)
cap = cv2.VideoCapture(0)

# フレームを表示する関数を定義
def show_frames():
    # 最新のフレームを取得し、BGRからRGBに変換
    cv2image = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2RGB)
    img = Image.fromarray(cv2image)
    # 画像をPhotoImageに変換
    imgtk = ImageTk.PhotoImage(image=img)
    label.imgtk = imgtk
    label.configure(image=imgtk)
    # 20ミリ秒ごとに再実行して連続表示を実現
    label.after(20, show_frames)

show_frames()
win.mainloop()

コードのポイント

  • cv2.VideoCapture(0):番号「0」はデフォルトのカメラデバイスを指します。外部カメラを使用する場合は番号を変更してください。
  • cv2.cvtColor(..., cv2.COLOR_BGR2RGB):OpenCVはBGR形式で画像を扱うため、PillowやTkinterで正しく表示するにはRGBへの変換が必要です。
  • label.imgtk = imgtk:参照を保持しないとガベージコレクションで画像が消えてしまうため、この行は重要です。
  • label.after(20, show_frames):約20ミリ秒間隔(毎秒50フレーム相当)で更新を行い、滑らかな映像を実現します。

実行結果

上記のコードを実行すると、ウェブカメラが起動し、キャプチャされた映像がTkinterウィンドウ内にリアルタイムで表示されます。

Tkinterウィンドウにウェブカメラ映像を表示する方法

  1. Python Tkinterでキャンバス上の画像を中央に配置する方法

    Tkinterを使ってGUIアプリケーションを開発している際、Tkinterのキャンバス(Canvas)上に画像を読み込みたいケースはよくあります。本記事では、その画像をキャンバスの中央に配置する方法を解説します。anchorパラメータとはデフォルトでは、キャンバスは画像を自身の幅と高さに従って配置します。しかし、anchor(アンカー)パラメータに方向の値を渡すことで、画像の位置を任意の方向(N:北、S:南、E:東、W:西、NS、EWなど)に操作できます。アンカーは画像関数と一緒に呼び出されるパラメータで、キャンバス内における画像の方向や位置を定義します。このanchorパラメータを活用すれ

  2. tkinterでウィンドウを閉じる方法|destroy()メソッドの使い方を解説

    tkinterを使えば、Pythonで手軽にGUIアプリケーションを作成できます。しかし、タイトルバー右上の×ボタン以外の方法でウィンドウやフレームを閉じたい場合、どのように実装すればよいか悩むこともあるでしょう。そのようなときに役立つのが、ウィンドウを破棄して閉じるための .destroy() メソッドです。tkinterの各ウィジェットや属性は互いに独立しているため、「ウィンドウを閉じる処理」を専用の関数として分離して定義できます。これにより、ボタンのクリックイベントからウィンドウを閉じる動作を自由に制御可能です。サンプルコード# ライブラリをインポート from tkinter impo