diff --git a/exp/color_sampler.py b/exp/color_sampler.py --- a/exp/color_sampler.py +++ b/exp/color_sampler.py @@ -1,9 +1,15 @@ +import sys +sys.path.append("../src") + import os import tkinter as tk +from tkinter import LEFT,X,N,S,E,W from colorsys import rgb_to_hsv from PIL import Image,ImageTk +from analyzer.corners import Corners + class Sampler: def __init__(self): @@ -15,16 +21,32 @@ class Sampler: self.photo=None self.letter="_" + self.hsv=(0,0,0) + self.pos=(0,0) + self.corners=Corners() + + self._createGUI() def sample(self,e): - (r,g,b)=(x/255 for x in self.img.getpixel((e.x,e.y))) + try: + (r,g,b)=(x/255 for x in self.img.getpixel((e.x,e.y))) + except IndexError: + return + (h,s,v)=map(lambda x: round(x,3), rgb_to_hsv(r,g,b)) - print("\t".join(map(str, (self.filenames[self.k],e.x,e.y,self.letter,h,s,v)))) + self.hsv=(h,s,v) + self.pos=(e.x,e.y) + self.posLabel.configure(text="({0},{1})".format(e.x,e.y)) + self.colorLabel.configure(text="HSV: ({0}, {1}, {2})".format(round(h*360),s,v)) + + def printSample(self): + print("\t".join(map(str, (self.filenames[self.k],*self.pos,self.letter,*self.hsv)))) def showImage(self): self.img=Image.open(os.path.join(self.dirname,self.filenames[self.k])) (w,h)=self.img.size self.photo=ImageTk.PhotoImage(self.img) + self.canvas.delete("all") self.canvas.create_image(0,0,image=self.photo,anchor="nw") self.canvas.configure(width=w,height=h) @@ -35,16 +57,28 @@ class Sampler: def setLetter(self,c): self.letter=c + self.letterLabel.configure(text="Letter: {0}".format(c)) - def createGUI(self): + def addCorner(self,e): + self.corners.add(e.x,e.y) + self._markCorners() + + def _createGUI(self): root=tk.Tk() frame=tk.Frame(root) - frame.pack() + frame.grid(column=0,row=0,sticky=(N,S,E,W)) + self.canvas=tk.Canvas(frame) - self.canvas.pack() + self.canvas.grid(row=1,column=0) + + bar=self._createBar(frame) + bar.grid(row=2,column=0,sticky=(E,W)) + self.showImage() - self.canvas.bind('<1>',self.sample) + self.canvas.bind('<1>',lambda e: self.printSample()) + self.canvas.bind('<3>',self.addCorner) + self.canvas.bind("",self.sample) root.bind("",lambda e: self.switchImage(-1)) root.bind("",lambda e: self.switchImage(1)) root.bind("",lambda e: self.setLetter("b")) @@ -53,6 +87,28 @@ class Sampler: root.mainloop() + def _createBar(self,frame): + bar=tk.Frame(frame,height=20,borderwidth=1,relief="sunken") + self.letterLabel=tk.Label(bar,width=8,text="Letter: _") + self.letterLabel.pack(side=LEFT) + self.posLabel=tk.Label(bar,width=16,text="(,)") + self.posLabel.pack(side=LEFT) + self.colorLabel=tk.Label(bar,width=20,text="HSV: (,,)") + self.colorLabel.pack(side=LEFT) + + return bar + + def _markCorners(self): + self.canvas.delete("mark") + for c in self.corners: + (x,y)=(c.x,c.y) + self.canvas.create_oval(x-2,y-2,x+2,y+2,fill="#00ff00",tags="mark") + if self.corners.canonizeOrder(): + (a,b,c,d)=self.corners + self.canvas.create_line(a.x,a.y,b.x,b.y,fill="#00ff00",tags="mark") + self.canvas.create_line(b.x,b.y,c.x,c.y,fill="#00ff00",tags="mark") + self.canvas.create_line(c.x,c.y,d.x,d.y,fill="#00ff00",tags="mark") + self.canvas.create_line(d.x,d.y,a.x,a.y,fill="#00ff00",tags="mark") + s=Sampler() -s.createGUI()