Changeset - d91db8f73233
[Not reviewed]
default
0 2 1
Laman - 6 years ago 2019-01-05 17:06:24

annotations: refactored into a separate file
3 files changed with 48 insertions and 36 deletions:
0 comments (0 inline, 0 general)
exp/annotations.py
Show inline comments
 
new file 100644
 
import sys
 
sys.path.append("../src")
 

	
 
import gzip
 
import json
 
from typing import MutableMapping
 

	
 
from analyzer.epoint import EPoint
 

	
 

	
 
class DataFile(MutableMapping):
 
	"""self._data: {filename: [EPoint,EPoint,EPoint,EPoint]}"""
 
	def __init__(self,filename):
 
		self.filename=filename
 
		try:
 
			with gzip.open(filename,mode="rt",encoding="utf8") as f:
 
				self._data=json.load(f,object_hook=self.deserialize)
 
		except OSError:
 
			self._data=dict()
 

	
 
	def save(self):
 
		with gzip.open(self.filename,mode="wt",encoding="utf8") as f:
 
			json.dump(self._data,f,default=self.serialize,indent="\t")
 

	
 
	def serialize(self,obj):
 
		if isinstance(obj,EPoint):
 
			return {"type": "EPoint", "val": [obj.x,obj.y]}
 
		raise TypeError(obj)
 

	
 
	def deserialize(self,obj):
 
		if obj.get("type")!="EPoint": return obj
 
		return EPoint(*obj["val"])
 

	
 
	def __getitem__(self, key): return self._data[key]
 
	def __setitem__(self, key, val): self._data[key]=val
 
	def __delitem__(self, key): del self._data[key]
 
	def __iter__(self): return iter(self._data)
 
	def __len__(self): return len(self._data)
 

	
 

	
 
def computeBoundingBox(corners):
 
	x1=min(p.x for p in corners)
 
	x2=max(p.x for p in corners)
 
	y1=min(p.y for p in corners)
 
	y2=max(p.y for p in corners)
 
	return (x1,y1,x2,y2)
exp/color_sampler.py
Show inline comments
 
import sys
 
sys.path.append("../src")
 

	
 
import os
 
import json
 
import gzip
 
from collections.abc import MutableMapping
 
import tkinter as tk
 
from tkinter import LEFT,N,S,E,W
 
from colorsys import rgb_to_hsv
 

	
 
from PIL import Image,ImageTk
 

	
 
from analyzer.epoint import EPoint
 
from annotations import DataFile
 
from analyzer.corners import Corners
 

	
 

	
 
class Sampler:
 
	def __init__(self,dirname,annotations):
 
		self.dirname=dirname
 
		self.annotations=DataFile(annotations)
 
		self.filenames=[f for f in sorted(os.listdir(self.dirname)) if f.endswith(".jpg")]
 
		self.k=0
 

	
 
		self.img=None
 
		self.photo=None
 

	
 
		self.letter="_"
 
		self.hsv=(0,0,0)
 
		self.pos=(0,0)
 
		self.m=0
 
		self._corners=[Corners()]
 
		self._dirty=False
 

	
 
		self._createGUI()
 

	
 
	def sample(self,e):
 
		try:
 
@@ -123,59 +120,29 @@ class Sampler:
 
		self.colorLabel=tk.Label(bar,width=20,text="HSV: (,,)")
 
		self.colorLabel.pack(side=LEFT)
 

	
 
		return bar
 

	
 
	def _markCorners(self):
 
		self.canvas.delete("mark")
 
		for corns in self._corners:
 
			for c in corns:
 
				(x,y)=(c.x,c.y)
 
				self.canvas.create_oval(x-2,y-2,x+2,y+2,fill="#00ff00",tags="mark")
 
			if corns.is_canon():
 
				(a,b,c,d)=corns
 
				dash=tuple() if corns is self.corners else (4,4)
 
				self.canvas.create_line(a.x,a.y,b.x,b.y,fill="#00ff00",dash=dash,tags="mark")
 
				self.canvas.create_line(b.x,b.y,c.x,c.y,fill="#00ff00",dash=dash,tags="mark")
 
				self.canvas.create_line(c.x,c.y,d.x,d.y,fill="#00ff00",dash=dash,tags="mark")
 
				self.canvas.create_line(d.x,d.y,a.x,a.y,fill="#00ff00",dash=dash,tags="mark")
 

	
 
	@property
 
	def corners(self):
 
		return self._corners[self.m]
 

	
 

	
 
class DataFile(MutableMapping):
 
	"""self._data: {filename: [EPoint,EPoint,EPoint,EPoint]}"""
 
	def __init__(self,filename):
 
		self.filename=filename
 
		try:
 
			with gzip.open(filename,mode="rt",encoding="utf8") as f:
 
				self._data=json.load(f,object_hook=self.deserialize)
 
		except OSError:
 
			self._data=dict()
 

	
 
	def save(self):
 
		with gzip.open(self.filename,mode="wt",encoding="utf8") as f:
 
			json.dump(self._data,f,default=self.serialize,indent="\t")
 

	
 
	def serialize(self,obj):
 
		if isinstance(obj,EPoint):
 
			return {"type": "EPoint", "val": [obj.x,obj.y]}
 
		raise TypeError(obj)
 

	
 
	def deserialize(self,obj):
 
		if obj.get("type")!="EPoint": return obj
 
		return EPoint(*obj["val"])
 

	
 
	def __getitem__(self, key): return self._data[key]
 
	def __setitem__(self, key, val): self._data[key]=val
 
	def __delitem__(self, key): del self._data[key]
 
	def __iter__(self): return iter(self._data)
 
	def __len__(self): return len(self._data)
 

	
 

	
 
if __name__=="__main__":
 
	dirname=sys.argv[1]
 
	annotations=sys.argv[2]
 

	
 
	s=Sampler(dirname,annotations)
exp/createsamples.py
Show inline comments
 
import sys
 
sys.path.append("../src")
 

	
 
import os
 
import random
 

	
 
import PIL.Image
 
import PIL.ImageDraw
 
import PIL
 

	
 
from diagram import createDiagram
 
from color_sampler import DataFile
 

	
 
from annotations import DataFile
 

	
 
finalPosCount=5000
 
empty=True
 
perspective=False
 
random.seed(361)
 
inputDir=sys.argv[1]
 
outputDir=sys.argv[2]
 
negDir=sys.argv[3]
 
negFiles=os.listdir(negDir)
 
negFiles.sort()
 

	
 
annotations=DataFile("annotations.json.gz")
 
posCount=len(annotations)
 
multiple=int(round(finalPosCount/posCount+0.5))
 

	
 

	
 
def pickRandom():
 
	file=random.choice(negFiles)
 
	return PIL.Image.open(os.path.join(negDir,file))
 

	
 

	
 
def cropBackground(bgImg,w,h):
 
	(bgw,bgh)=bgImg.size
 
	scale=min(bgw/w,bgh/h)
0 comments (0 inline, 0 general)