画像の比較結果を表示する

Posted at 2023 年 06 月 25 日

画像の判定で結果と一致率を表示させたいのでボタンを押したらサブウィンドウを表示するようにします。

環境は下記になります。

Hardware:Raspberry pi4B
OS:Raspbian 10/buster
Python:3.7.3

参考にさせて頂いた記事は以下になります。
https://imagingsolution.net/program/python/tkinter/create_windows_modal_modeless/

PythonではTkToplevel()関数を使用すればサブウィンドウを表示できます。

subwindow = tk.Toplevel()

以下サブウィンドウの各種設定です。

subwindow.title("成否判定") # ウィンドウタイトル
subwindow.geometry("500x300")  # ウィンドウサイズ(幅x高さ)     
# ラベルの作成
labelt = tk.Label(subwindow,text='○',font=("MSゴシック", "20", "bold"),foreground='#000fff000')
labelt.pack(padx=30, pady=10)
labeltc = tk.Label(subwindow,text='画像の一致率は' + str(round(comphist * 100,2)) + '%です')
labeltc.pack(padx=30, pady=10)

# モーダルにする設定
subwindow.grab_set()    # モーダルにする
subwindow.focus_set()    # フォーカスを新しいウィンドウをへ移すbase.wait_window(subwindow)


画像の一致率を100%~%で表示したいので以下のコードで100かけた数字をLabelとして設定しています。
tk.Label(subwindow,text='画像の一致率は' + str(round(comphist * 100,2)) + '%です')

また以下のコードでモーダル(元のウィンドウが操作できない状態)にしています。

subwindow.grab_set()    # モーダルにする

全体のソースコードは以下になります。

import tkinter as tk
import os
import time
import datetime
import picamera
import cv2
import glob
from tkinter import *
#from PIL import ImageTk

#ウィンドウの作成
base = tk.Tk()
base.geometry("500x300")
base.title("画像撮影")
camera = picamera.PiCamera()

# 保存先path
image_path = "./images/"

def clk():  #---クリックイベント画像撮影
     
    #現在時間を取得
    now = datetime.datetime.now()
    #画像撮影
    camera.resolution = (1024, 768)
    camera.capture(now.strftime(image_path + '%Y%m%d_%H%M%S') + 'cap.jpg')
    #プレビュー
    camera.start_preview()
    time.sleep(5)
    camera.stop_preview()
     
def com():  #---クリックイベント比較
     
    #最新ファイルの取得
    AllList = glob.glob('./images/*')
    latest_file = max(AllList, key=os.path.getctime)
    print(latest_file)
       
    # 撮影した画像を読み込む
    img1 = cv2.imread(latest_file)
    color = ('b','g','r')
       
    #ヒストグラム計算
    for i , col in enumerate(color):
      histr1 = cv2.calcHist([img1],[i],None,[256],[0,256])
         
    # 比較元画像を読み込む
    img2 = cv2.imread('Originalcap.jpg')
    color = ('b','g','r')
       
    #ヒストグラム計算
    for i , col in enumerate(color):
      histr2 = cv2.calcHist([img2],[i],None,[256],[0,256])
       
    #ヒストグラムの比較。
    comphist = cv2.compareHist(histr1, histr2, cv2.HISTCMP_CORREL) 
    print(comphist)
     
    #判定
    num = 0.8
    if num < comphist:
      subwindow = tk.Toplevel()
      subwindow.title("成否判定") # ウィンドウタイトル
      subwindow.geometry("500x300")  # ウィンドウサイズ(幅x高さ)     
      # ラベルの作成
      labelt = tk.Label(subwindow,text='○',font=("MSゴシック", "20", "bold"),foreground='#000fff000')
      labelt.pack(padx=30, pady=10)
      labeltc = tk.Label(subwindow,text='画像の一致率は' + str(round(comphist * 100,2)) + '%です')
      labeltc.pack(padx=30, pady=10)
       
      # モーダルにする設定
      subwindow.grab_set()    # モーダルにする
      subwindow.focus_set()    # フォーカスを新しいウィンドウをへ移す
      base.wait_window(subwindow)

    else:

      subwindow = tk.Toplevel()
      subwindow.title("成否判定") # ウィンドウタイトル
      subwindow.geometry("500x300")  # ウィンドウサイズ(幅x高さ)
      labelf = tk.Label(subwindow,text='☓',font=("MSゴシック", "20", "bold"),foreground='#ff0000')
      labelf.pack(padx=30, pady=10)
      labeltc = tk.Label(subwindow,text='画像の一致率は' + str(round(comphist * -100,2)) + '%です')
      labeltc.pack(padx=30, pady=10)

      # モーダルにする設定
      subwindow.grab_set()    # モーダルにする
      subwindow.focus_set()    # フォーカスを新しいウィンドウをへ移す
      base.wait_window(subwindow)
     
#ウィジェットの作成
label = tk.Label(text = "ボタンを押して撮影する")
button1 = tk.Button(base, text='開始', width=20, command=clk)
button2 = tk.Button(base, text='比較', width=20, command=com)

# 配置
label.pack()
button1.pack(fill = 'x',padx=20, side = 'left')
button2.pack(fill = 'x',padx=20, side = 'left')

base.mainloop()


以下のようにサブウィンドウが表示されると思います。