-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpiece.py
More file actions
63 lines (53 loc) · 2.17 KB
/
piece.py
File metadata and controls
63 lines (53 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import math
import cv2
from segment import Segment
class Piece:
def __init__(self, contour):
self.contour = contour
self.points = [tuple(x[0]) for x in contour.tolist()]
self.center = self.getCenter()
self.corners = self.getCorners()
self.segments = self.getSegments()
def getCenter(self):
M = cv2.moments(self.contour)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
return cx, cy
def getExtremePoints(self):
# get contour points which are further from center than their neighbors
distances = [math.dist(self.center, p) for p in self.points]
extremes = []
lookupSize = 20
for i in range(len(self.points)):
isExtreme = True
for j in range(i - lookupSize, i + lookupSize):
if distances[j % len(distances)] > distances[i]:
isExtreme = False
break
if isExtreme:
extremes.append(self.points[i])
return extremes
def getCorners(self):
extremes = self.getExtremePoints()
furthestExtreme = max(extremes, key=lambda p: math.dist(self.center, p))
mirrorPoint = (2*self.center[0] - furthestExtreme[0], 2*self.center[1] - furthestExtreme[1])
closestToMirrorPointExtreme = min(extremes, key=lambda p: math.dist(mirrorPoint, p))
extremes.remove(furthestExtreme)
extremes.remove(closestToMirrorPointExtreme)
return extremes
def getSegments(self):
current = []
segments = []
for i in range(len(self.points)):
current.append(self.points[i])
if self.points[i] in self.corners:
segments.append(current)
current = []
if len(current) > 0:
segments[0] = current + segments[0]
return [Segment(self, segment) for segment in segments]
def setSegmentIndex(self):
sorted(self.segments, key=lambda segment: (segment.center[1], segment.center[0]))
# iterate and set index to segment.index
for i in range(len(self.segments)):
self.segments[i].index = i