現在は直接プログラム中に画像検査の値を設定していますが、それを設定ファイルから読み込みようにします。
環境は下記になります。
Hardware:Raspberry pi4B
OS:Raspbian 10/buster
Python:3.7.3
まずは設定ファイルを作ります。
config.ini(設定ファイル)
# 画像検査設定値
[system]
exa = 0.8
今回はconfig.iniはpythonファイルと同じディレクトリに配置する前提になります。
# Config読み込み
config = configparser.ConfigParser()
config.read('config.ini')#iniファイルの読み込み
testvalue = config.get('system', 'exa')#項目の読み込み
testvalue1 = float(testvalue) #数値変換
config.readでファイルを読み込んで、config.getで項目を指定して読み込みます。
取得したデータは数値ではfloat()で数値に変換しています。
全体のソースコードは以下になります。
import tkinter as tk
import os
import time
import datetime
import picamera
import cv2
import glob
import tkinter.filedialog
import tkinter.messagebox
import shutil
from tkinter import *
from PIL import Image, ImageTk
import configparser
#ウィンドウの作成
base = tk.Tk()
base.geometry("750x300")
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)
# 結果で表示するために画像を読み込む
img = Image.open(latest_file)
img_width, img_height = img.size
lastimage = ImageTk.PhotoImage(img)
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)
# Config読み込み
config = configparser.ConfigParser()
config.read('config.ini')#iniファイルの読み込み
testvalue = config.get('system', 'exa')#項目の読み込み
testvalue1 = float(testvalue) #数値変換
# 判定
if testvalue1 < comphist:
# サブウィンドウ
subwindow = tk.Toplevel()
subwindow.title("成否判定") # ウィンドウタイトル
subwindow.geometry("1200x800") # ウィンドウサイズ(幅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=20)
# キャンバス作成
canvas = tk.Canvas(subwindow, bg="#f0f8ff", width=img_width, height=img_height)
canvas.pack(padx=30, pady=30)
canvas.create_image(0 , 0 ,anchor = tk.NW,image=lastimage)
# モーダルにする設定
subwindow.grab_set() # モーダルにする
subwindow.focus_set() # フォーカスを新しいウィンドウをへ移す
base.wait_window(subwindow)
else:
# サブウィンドウ
subwindow = tk.Toplevel()
subwindow.title("成否判定") # ウィンドウタイトル
subwindow.geometry("1200x800") # ウィンドウサイズ(幅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=20)
# キャンバス作成
canvas = tk.Canvas(subwindow, bg="#f0f8ff", width=img_width, height=img_height)
canvas.pack(padx=30, pady=30)
canvas.create_image(0 , 0 ,anchor = tk.NW,image=lastimage)
# モーダルにする設定
subwindow.grab_set() # モーダルにする
subwindow.focus_set() # フォーカスを新しいウィンドウをへ移す
base.wait_window(subwindow)
def ori(): #---クリックイベント比較
#ファイルを開く
fimg = [("", "*.jpg")]
iDir = os.path.abspath(os.path.dirname(__file__))
file = tkinter.filedialog.askopenfilename(filetypes = fimg,initialdir = iDir)
#ファイルを設定する
if not file:
print('キャンセル')
else:
file_oldname = file
file_newname_newfile = "Originalcap.jpg"
newFileName=shutil.move(file_oldname, file_newname_newfile)
#ウィジェットの作成
label = tk.Label(text = "ボタンを押して撮影する")
button1 = tk.Button(base, text='開始', width=20, command=clk)
button2 = tk.Button(base, text='検査', width=20, command=com)
button3 = tk.Button(base, text='検査画像設定', width=20, command=ori)
# 配置
label.pack()
button1.pack(fill = 'x',padx=20, side = 'left')
button2.pack(fill = 'x',padx=20, side = 'left')
button3.pack(fill = 'x',padx=20, side = 'left')
base.mainloop()