新着情報
2-2. Canvas Widgetを用いたwebカメラによる動画像の表示とエッジ動画の表示
tkinterライブラリーのキャンバスwidgetを用いた内臓webカメラによる動画の表示とCanny法によるエッジ動画の同時表示を実現するプログラムtkCanvas2Videos.pyを以下に掲示する。
プログラムの基本構造は前の記事2-1.と同じである。下記のプログラムでは、Macの画面をroot画面に取り、そこにCanvast画面(横700画素、縦250画素)を設定している。Canvas widgetのサイズ(700×250)の範囲に、webカメラ撮影された瞬間映像1枚のサイズを(300×200画素)に設定すれば、瞬間処理映像のサイズも同じく(300×200画素)なので、Canvas内にモニター映像とその処理映像の2枚を配置する事ができる。webカメラの瞬間撮影映像をCanvas内の右から160画素、上から100画素の位置に貼り付け表示し、同時に瞬間撮影映像を濃淡化し、Canny法によるエッジ化した映像をCanvas内の右から500画素、上から100画素の位置に貼り付け表示する。その後、10ミリ秒毎にこの処理を返し実行することによりモニター動画像とそのリアルタイム処理動画を見る事ができる。2-1. では2枚のFrame枠を設定し、それぞれに瞬間映像とその処理映像を貼り付けたLabel widgetをFrame枠内に表示させることを行なっており、Canvas widgetを用いる方がより簡単である。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Sun Mar 24 21:43:49 2019 @author: PBK-***** """ # -*- coding: utf8 -*- import tkinter as tk import cv2 from PIL import Image, ImageTk import subprocess global imgtk1,imgtk2 width, height = 300, 200 cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, width) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height) root = tk.Tk() root.title("Two Views") canvas = tk.Canvas(root, height = 250, width = 700) canvas.pack() root.bind('<Escape>', lambda e: root.quit()) def show_frame(): global imgtk1,imgtk2 _, frame = cap.read() cv2image1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) framerv = cv2.flip(frame, 1) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) img1 = Image.fromarray(cv2image1) imgtk1 = ImageTk.PhotoImage(img1) img2 = cv2.Canny(gray,100,200) img2 = Image.fromarray(img2) imgtk2 = ImageTk.PhotoImage(img2) canvas.create_image(160,100,image=imgtk1) canvas.create_text(150,230,text='Captured Video') canvas.create_image(500,100,image=imgtk2) canvas.create_text(510,230,text='Canny Edge Video') #canvas.image=imgtk2 canvas.after(10, show_frame) show_frame() root.mainloop()