2018/08/18
Python版OpenCV用GUIを作る
Ubuntu18.04にOpenCVの実行環境を作成し、以前のブログで2回に分けてお話しました(1回目の話はこちらで2回目はこちら)。今回はカラー画像を読み込んで、グレー化、二値化の一連の流れを、Ubuntu環境下でPythonを用いてtkinterでGUI実装し、実行してみました。動作確認だけで、厳密なエラー処理等は行っていませんのでご参考まで。プログラムはGUI部分とOpenCV処理部分を分けて作成しました。GUI部分のコードは以下の通りです。
import tkinter6行目で以下のOpenCVのコードをインポートしています。
import tkinter.filedialog as tkdialog
from tkinter import font
from PIL import Image, ImageTk
import os
import image_proc
class AppForm(tkinter.Frame):
def __init__(self, master=None):
super().__init__(master, height=500, width=660)
self.pack()
self.create_widgets()
self.menubar_create()
def create_widgets(self):
self.canvas = tkinter.Canvas(
root,
width = 640,
height = 480,
relief= tkinter.RIDGE,
bd=0
)
self.canvas.place(x=10, y=10)
def menubar_create(self):
self.menubar = tkinter.Menu(root)
filemenu = tkinter.Menu(self.menubar, tearoff=0)
filemenu.add_command(label="Open", command=self.File_open)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
self.menubar.add_cascade(label="File", menu=filemenu)
editmenu = tkinter.Menu(self.menubar, tearoff=0)
editmenu.add_command(label="Grayscale", command=self.Proc_grayscale)
editmenu.add_command(label="Binarize", command=self.Proc_binarize)
self.menubar.add_cascade(label="Processing", menu=editmenu)
root.config(menu=self.menubar)
root.config()
def Disp_image(self, im_temp):
self.img_temp = ImageTk.PhotoImage(Image.fromarray(im_temp))
self.canvas.create_image(
0,
0,
image = self.img_temp,
anchor = tkinter.NW
)
def File_open(self):
fname = tkdialog.askopenfilename(filetypes=[("bmp files","*.bmp"),("png files","*.png")],initialdir=os.getcwd())
self.im = image_proc.Image_read(fname)
self.Disp_image(self.im)
def Proc_grayscale(self):
self.im_gray = image_proc.Image_grayscale(self.im)
self.Disp_image(self.im_gray)
def Proc_binarize(self):
self.ret, self.im_bin = image_proc.Image_binarize(self.im_gray)
self.Disp_image(self.im_bin)
root = tkinter.Tk()
root.title("OpenCV Developer")
root.option_add('*font', ('MS Sans Serif', 16))
app = AppForm(master=root)
app.mainloop()
import cv2こちらは基本的にOpenCVに特化した単純なコードです。画像処理を手直しする際にはこちらのプログラムだけで済みます。
def Image_read(img_name):
im = cv2.imread(img_name)
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
return im
def Image_save(img_name, img_temp):
if img_temp.ndim == '3': # color image (gray image : 2)
img_temp = cv2.cvtColor(img_temp, cv2.COLOR_RGB2BGR)
cv2.imwrite(img_name, img_temp)
def Image_grayscale(img_temp):
im_gray = cv2.cvtColor(img_temp, cv2.COLOR_BGR2GRAY)
return im_gray
def Image_binarize(img_temp):
ret, im_bin = cv2.threshold(img_temp, 60, 255, cv2.THRESH_BINARY)
return ret, im_bin
以下、実行結果。起動画面はこんな感じです。






