Changeset - d954258c9613
[Not reviewed]
default
0 1 0
Laman - 6 years ago 2018-12-16 09:34:35

color sampler extended to mark corners
1 file changed with 63 insertions and 7 deletions:
0 comments (0 inline, 0 general)
exp/color_sampler.py
Show inline comments
 
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("<Motion>",self.sample)
 
		root.bind("<Left>",lambda e: self.switchImage(-1))
 
		root.bind("<Right>",lambda e: self.switchImage(1))
 
		root.bind("<b>",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()
0 comments (0 inline, 0 general)