diff --git a/exp/kerokero/prepare_data.py b/exp/kerokero/prepare_data.py --- a/exp/kerokero/prepare_data.py +++ b/exp/kerokero/prepare_data.py @@ -1,6 +1,7 @@ import os import sys import re +import math import random import logging as log @@ -48,6 +49,19 @@ class Sample: grid=list(map(lambda p: list(2*p/self.SIDE-EPoint(1,1)), grid)) return (img,grid) + def rectify(self): + x1=self.SIDE*0.1 + x2=self.SIDE*0.9 + abcd=list(map(list,self.grid)) + destPoints=[(x1,x1),(x1,x2),(x2,x2),(x2,x1)] + abcd_=list(map(list, (EPoint(x,y)+self._createNoise() for (x,y) in destPoints))) + m=cv.getPerspectiveTransform(np.float32(abcd),np.float32(abcd_)) + img=cv.warpPerspective(self.img,m,(self.SIDE,self.SIDE)) + img=np.uint8(img) + grid=Corners(c.transform(m) for c in self.grid) + grid=list(map(lambda p: list(2*p/self.SIDE-EPoint(1,1)), grid)) + return (img,grid) + def _getCenter(self): (a,b,c,d)=self.grid p=Line.fromPoints(a,c) @@ -63,6 +77,11 @@ class Sample: scale=getScale(self.SIDE/(wg*(1+left+right)), self.SIDE/(hg*(1+top+bottom))) return np.matmul(scale,t2) + def _createNoise(self): + alpha=random.uniform(0,math.pi*2) + d=random.uniform(0,self.SIDE*0.05) + return EPoint(math.cos(alpha)*d, math.sin(alpha)*d) + def show(self): img=cv.cvtColor(self.img,cv.COLOR_GRAY2BGR) for c in self.grid: @@ -91,14 +110,15 @@ def harvestDir(path): for f in files: grade=annotations.get(f.name,[Board()])[0].grade Stats.counts[grade]+=1 - if not Board.UNSET