# HG changeset patch # User Laman # Date 2019-01-14 17:04:05 # Node ID 90d22d070710e86269d3a40c9ced9a440f30b1a4 # Parent 92f4748d07b3d092eabcd36e6c5c24afa15a7ef9 refactored line reconstruction diff --git a/exp/stone_detect.py b/exp/stone_detect.py --- a/exp/stone_detect.py +++ b/exp/stone_detect.py @@ -17,10 +17,14 @@ from analyzer.epoint import EPoint random.seed(361) -class NeighboringPoint(EPoint): - def __init__(self,x,y): - super().__init__(x,y) - self.neighbours=[] +class Line(): + def __init__(self,a,b): + self.a=a + self.b=b + self.points={a,b} + + def getSortedPoints(self): + return tuple(sorted(self.points)) def kmeans(img): @@ -81,13 +85,13 @@ def groupLines(points,minCount,tolerance for (i,a) in enumerate(sample): for (j,b) in enumerate(sample): if j<=i: continue - incidentPoints=[a,b] + ab=Line(a,b) for c in points: if c is a or c is b: continue if point2lineDistance(a,b,c)<=tolerance: - incidentPoints.append(c) - if len(incidentPoints)>=minCount: - yield incidentPoints + ab.points.add(c) + if len(ab.points)>=minCount: + yield ab if __name__=="__main__": @@ -131,24 +135,25 @@ if __name__=="__main__": for (p,c) in stoneLocs: cv.drawMarker(linesImg,(int(p.x),int(p.y)),(255,0,0),cv.MARKER_CROSS) - lineSet=set() + lineDict=dict() minCount=min(max(math.sqrt(len(stoneLocs))-2,3),7) print("min count:",minCount) - for points in groupLines([point for (point,contour) in stoneLocs],minCount,2): - points=tuple(sorted(tuple(p) for p in points)) - lineSet.add(points) + for line in groupLines([point for (point,contour) in stoneLocs],minCount,2): + key=line.getSortedPoints() + if key in lineDict: # we already have a line with the same incident points + continue + lineDict[line.getSortedPoints()]=line obsolete=set() - pointSet=set(points) - for line in lineSet: - lineS=set(line) - if points is line: continue - if pointSeta.x or (self.x==a.x and self.y>a.y) + def __ge__(self,a): return self.x>a.x or (self.x==a.x and self.y>=a.y) + def __eq__(self,a): return self.x==a.x and self.y==a.y + def __ne__(self,a): return self.x!=a.x or self.y!=a.y + def __str__(self): return "({0},{1})".format(round(self.x,3),round(self.y,3)) def __repr__(self): return "EPoint({0},{1})".format(round(self.x,3),round(self.y,3))