Python tkinter / OpenCVで読み込んだ画像を表示する方法

まくまく
まくまく
tkinter ウインドウの中にフレームを作成して、そこにOpenCVで読み込んだ画像を表示してみようと思います。



サンプルコード

#ライブラリのインポート
import tkinter as tk
import tkinter.ttk as ttk
import cv2
from PIL import Image, ImageTk

#ウインドウの作成
root = tk.Tk()
#ウインドウのタイトル
root.title("ウインドウ")
#ウインドウサイズと位置指定 幅,高さ,x座標,y座標 
root.geometry("600x400+50+50")

#フレームを入れ子で作成。「frame」の中に「frame2」を作成
frame = tk.Frame(root, width=580, height=380, padx=10, pady=10, bg="black")
frame.place(x=10, y=10)

frame2 = tk.Frame(frame, relief=tk.FLAT, bg="white", bd=2)
frame2.place(x=10, y=10, width=540, height=340)

#画像読み込み
image = cv2.imread("photo1.jpg")

#画像をリサイズ
h, w = image.shape[:2]
cvh = 450*h/w
image_bgr = cv2.resize(image, (450,int(cvh)))

#画像をBGR→RGB→PIL→ImageTkフォーマットへ変換
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
image_pil = Image.fromarray(image_rgb)
image_tk  = ImageTk.PhotoImage(image_pil)

### キャンバス作成・配置
canvas = tk.Canvas(frame2, width=500, height=310)
canvas.place(x=10, y=10)
canvas.create_image(0, 0, image=image_tk, anchor=tk.NW)

#メインループ
root.mainloop()

出力

tkinterでフレームを作成し、その中に画像を表示してみました。

黒い部分が一つ目のフレームで、白い部分が2つめのフレームです。フレームの中にフレームがある状態です。

グレーの箇所はキャンバスとなり、そのキャンバスの中に画像を表示しています。

OpenCVで読み込んだ画像はBGRなので、それをRGBに変換、さらにはPIL、ImageTkフォーマットに変換してやっと表示できます。

created by Rinker
翔泳社
タイトルとURLをコピーしました