Snippets

Ethan Morris SignIt

Created by Ethan Morris
import numpy as np
import cv2
import tkinter as tk
from clarifai.rest import ClarifaiApp
import json, time
from PIL import Image, ImageTk
from datetime import datetime
from tkinter import messagebox
from tkinter import Text
from tkinter import END, N, S, E, W
from tkinter import Scrollbar
from tkinter import simpledialog
from tkinter import Canvas
# Set up GUI
window = tk.Tk()  # Makes main window
window.wm_title("SignIt")
window.config(background="#FFFFFF")
window.resizable(width=False, height=False)
window.iconbitmap('favicon.ico')

# Graphics window
imageFrame = tk.Frame(window, width=600, height=500)
imageFrame.grid(row=0, column=0, padx=10, pady=2)

chart = ImageTk.PhotoImage(Image.open("chart.jpg"))
panel = tk.Canvas(imageFrame, width=115, height=500)
panel.grid(row=0,column=0)
panel.create_image(0,0,image=chart, anchor="nw")
# Capture video frames
lmain = tk.Label(imageFrame)
lmain.grid(row=0, column=1,columnspan = 6)

txtbox = Text(imageFrame, height = 32, width = 13)
txtbox.grid(row=0, column = 7, rowspan = 2)

scroll = Scrollbar(imageFrame)
scroll.grid(row = 0, column = 8, rowspan = 2, sticky=N+S+E+W)#, rowspan = 2)
scroll.config(command=txtbox.yview)
txtbox.config(yscrollcommand=scroll.set)
cap = cv2.VideoCapture(0)

app = ClarifaiApp(api_key='f97dc808cf8c47358e733321533f725c')
model = app.models.get('sign')
lmain.frameCount = 0
lmain.paused = 0
lmain.Guess = ''

def get_image():
    return cap.read()[1]

lmain.frame = get_image()
lmain.timer = 4
lmain.timeInit = time.time()

def show_frame():
    lmain.frame = get_image()
    cv2image = cv2.flip(lmain.frame, 1)
    font = cv2.FONT_HERSHEY_SIMPLEX
    height, width, channels = cv2image.shape
    timeCurr = time.time()
    if lmain.paused == 0:
        timeDiff = timeCurr - lmain.timeInit
    else:
        timeDiff = 0

    cv2.rectangle(cv2image,(170,90),(470,390),(0,0,0),2)
    cv2.putText(cv2image, lmain.Guess, (0,38), font, 1.5, (0, 255, 0), 2, cv2.LINE_AA)
    cv2.putText(cv2image, str(lmain.timer-timeDiff), (570,475), font, 1, (0, 255, 0), 2, cv2.LINE_AA)
    cv2image = cv2.cvtColor(cv2image, cv2.COLOR_BGR2RGBA)
    if lmain.paused == 0:
        if timeDiff > lmain.timer:
            lmain.timeInit = time.time()
            check_frame()
        img = Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img)
        lmain.imgtk = imgtk
        lmain.configure(image=imgtk)
    lmain.after(10, show_frame)


def check_frame():
    if lmain.frameCount == 0:
        clear_text()
    capt = "Data/Capture_frame.png".format(lmain.frameCount)
    cropped = lmain.frame[65:405,155:510]
    cv2.imwrite(capt, cropped)
    lmain.frameCount += 1
    data = model.predict_by_filename("Data/Capture_frame.png", None, False, 0, 1, select_concepts=None)
    lmain.Log = dict(data, sort_keys=True, indent=4)
    confidence = lmain.Log["outputs"][0]["data"]["concepts"][0]["value"]
    if confidence > 0.4:
        newStr = lmain.Log["outputs"][0]["data"]["concepts"][0]["name"]
        txtbox.insert(END, ">"+newStr+"\n")
    else:
        newStr = "No sign detected"
    lmain.Guess = newStr
    txtbox.see(END)
    #if len(lmain.Guess)> 23:
    #    lmain.Guess = newStr #lmain.Guess[len(newStr):]
    #else:
    #    lmain.Guess += newStr

def clear_text():
    lmain.Guess = ''

def pause():
    lmain.paused = 1
def play():
    lmain.paused = 0

def positive_feedback():
    concept = lmain.Log["outputs"][0]["data"]["concepts"][0]["id"]
    filename = "Data/Positive/{:s}/capture-{:%Y%m%d_%H%M%S}.png".format(concept,datetime.now())
    cropped = lmain.frame[65:405,155:510]
    cv2.imwrite(filename, cropped)
    app.inputs.create_image_from_filename(filename, concepts=[concept])
    model.train()


def negative_feedback():
    concept = lmain.Log["outputs"][0]["data"]["concepts"][0]["id"]
    filename = "Data/Negative/{:s}/capture-{:%Y%m%d_%H%M%S}.png".format(concept,datetime.now())
    cropped = lmain.frame[65:405,155:510]
    cv2.imwrite(filename, cropped)
    lmain.paused = 1
    userConcept = simpledialog.askstring("", "Correct concept:", parent=window)
    app.inputs.create_image_from_filename(filename, concepts=[userConcept], not_concepts=[concept])
    model.train()
    lmain.paused = 0
    #messagebox.showinfo("", "Image saved as {:s}".format(filename))

correctButton = tk.Button(imageFrame, text="Correct :)", command = positive_feedback)
correctButton.grid(row=1, column=1, sticky=N+S+E+W)
incorrectButton = tk.Button(imageFrame, text="Wrong :(", command = negative_feedback)
incorrectButton.grid(row=1,column=6, sticky=N+S+E+W)
pauseButton = tk.Button(imageFrame, text="Pause", command = pause)
pauseButton.grid(row=1,column=3, sticky=N+S+E+W)
playButton = tk.Button(imageFrame, text="Play", command = play)
playButton.grid(row=1,column=4, sticky=N+S+E+W)
#readButton = tk.Button(imageFrame, text="Read", command = check_frame)
#readButton.grid(row=1, column=2)
#clearButton = tk.Button(imageFrame, text="Clear", command = clear_text)
#clearButton.grid(row=1, column=3)
#quitButton = tk.Button(imageFrame, text="Quit!", command=quit)
#quitButton.grid(row=1, column = 4)
show_frame()  # Display 2
window.mainloop()  # Starts GUI

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.