|
@@ -8,7 +8,7 @@ def getCMarkers (img):
|
|
|
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
|
img3 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 125, 10)
|
|
|
|
|
|
- kernel = np.ones((3,3),np.uint8)
|
|
|
+ kernel = np.ones((6,6),np.uint8)
|
|
|
img2 = cv2.morphologyEx(img3, cv2.MORPH_CLOSE, kernel)
|
|
|
|
|
|
|
|
@@ -16,7 +16,6 @@ def getCMarkers (img):
|
|
|
|
|
|
kernel = np.ones((3,3),np.uint8)
|
|
|
img2 = cv2.dilate(img2,kernel, 2)
|
|
|
- cv2.imshow("m2", img2)
|
|
|
|
|
|
|
|
|
params = cv2.SimpleBlobDetector_Params()
|
|
@@ -51,12 +50,12 @@ def getCMarkers (img):
|
|
|
|
|
|
|
|
|
keypoints = detector.detect(img2)
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
k = []
|
|
|
+ kk = []
|
|
|
for point in keypoints:
|
|
|
count = []
|
|
|
for p in keypoints:
|
|
@@ -66,11 +65,16 @@ def getCMarkers (img):
|
|
|
count.append(p.pt)
|
|
|
if len(count) >= 2:
|
|
|
k.append((point.pt, count))
|
|
|
+ kk.append(point)
|
|
|
+
|
|
|
+
|
|
|
+ img2 = cv2.drawKeypoints(img2, kk, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
|
|
|
+ cv2.imshow("m3", img2)
|
|
|
|
|
|
for point in k:
|
|
|
p, near = point
|
|
|
|
|
|
- midistance = math.pi/12.5
|
|
|
+ midistance = math.pi/10.0
|
|
|
bottom = []
|
|
|
rigth = []
|
|
|
for p1 in near:
|
|
@@ -81,16 +85,18 @@ def getCMarkers (img):
|
|
|
v = np.array([p2[0]-p[0], p2[1]-p[1]])
|
|
|
c = np.dot(u,v)/norm(u)/norm(v)
|
|
|
angle = np.arccos(c)
|
|
|
- if abs(angle-math.pi/2.0) < midistance:
|
|
|
+ if abs(angle) > midistance:
|
|
|
bottom = p1
|
|
|
rigth = p2
|
|
|
midistance = abs(angle-math.pi/2.0)
|
|
|
|
|
|
- if midistance == math.pi/12.5:
|
|
|
+ if midistance == math.pi/10:
|
|
|
continue
|
|
|
|
|
|
u = np.array([bottom[0]-p[0], bottom[1]-p[1]])
|
|
|
v = np.array([rigth[0]-p[0], rigth[1]-p[1]])
|
|
|
+ if u[1] > v[1]:
|
|
|
+ u,v = v,u
|
|
|
conner = rigth+u
|
|
|
addu = u*1.0/6.0
|
|
|
addv = v*1.0/6.0
|
|
@@ -98,41 +104,11 @@ def getCMarkers (img):
|
|
|
trans = get_transform_matrix_points(conners, [10, 10], 10)
|
|
|
code = cv2.warpPerspective(gray, trans, dsize=(100, 100))
|
|
|
|
|
|
-
|
|
|
-
|
|
|
- vsplit = np.vsplit(code, 4)
|
|
|
- mean = []
|
|
|
- for vs in vsplit:
|
|
|
- m = []
|
|
|
- hsplit = np.hsplit(vs, 4)
|
|
|
- for hs in hsplit:
|
|
|
- m.append(np.mean(hs))
|
|
|
- mean.append(m)
|
|
|
-
|
|
|
- mean = np.array(mean) >= 100.0
|
|
|
- valid = mean[0, 0] == False
|
|
|
- valid = valid and mean[0, 3] == False
|
|
|
- valid = valid and mean[0, 3] == False
|
|
|
- valid = valid and mean[1, 0] == True
|
|
|
- valid = valid and mean[0, 1] == True
|
|
|
- valid = valid and mean[2, 0] == True
|
|
|
- valid = valid and mean[0, 2] == True
|
|
|
- valid = valid and mean[3, 3] == True
|
|
|
- valid = valid and mean[1, 3] == True
|
|
|
- valid = valid and mean[3, 1] == True
|
|
|
- valid = valid and mean[2, 3] == True
|
|
|
- valid = valid and mean[3, 2] == True
|
|
|
- if valid == False:
|
|
|
+ cv2.imshow("m2", code)
|
|
|
+
|
|
|
+ number = getNumber(code, 150)
|
|
|
+ if number == False:
|
|
|
continue
|
|
|
- number = 0
|
|
|
- if not mean[1, 1]:
|
|
|
- number += 1
|
|
|
- if not mean[1, 2]:
|
|
|
- number += 2
|
|
|
- if not mean[2, 1]:
|
|
|
- number += 4
|
|
|
- if not mean[2, 2]:
|
|
|
- number += 8
|
|
|
|
|
|
uu = np.array([0, 1])
|
|
|
vv = np.array([p[0]-bottom[0], p[1]-bottom[1]])
|
|
@@ -143,6 +119,42 @@ def getCMarkers (img):
|
|
|
markers.append([number, mid, angle])
|
|
|
return markers
|
|
|
|
|
|
+def getNumber(img, threshold):
|
|
|
+ vsplit = np.vsplit(img, 4)
|
|
|
+ mean = []
|
|
|
+ for vs in vsplit:
|
|
|
+ m = []
|
|
|
+ hsplit = np.hsplit(vs, 4)
|
|
|
+ for hs in hsplit:
|
|
|
+ m.append(np.mean(hs))
|
|
|
+ mean.append(m)
|
|
|
+
|
|
|
+
|
|
|
+ mean = np.array(mean) >= threshold
|
|
|
+ valid = mean[0, 0] == False
|
|
|
+ valid = valid and mean[0, 3] == False
|
|
|
+ valid = valid and mean[0, 3] == False
|
|
|
+ valid = valid and mean[1, 0] == True
|
|
|
+ valid = valid and mean[0, 1] == True
|
|
|
+ valid = valid and mean[2, 0] == True
|
|
|
+ valid = valid and mean[0, 2] == True
|
|
|
+ valid = valid and mean[3, 3] == True
|
|
|
+ valid = valid and mean[1, 3] == True
|
|
|
+ valid = valid and mean[3, 1] == True
|
|
|
+ valid = valid and mean[2, 3] == True
|
|
|
+ valid = valid and mean[3, 2] == True
|
|
|
+ if valid == False:
|
|
|
+ return False
|
|
|
+ number = 0
|
|
|
+ if not mean[1, 1]:
|
|
|
+ number += 1
|
|
|
+ if not mean[1, 2]:
|
|
|
+ number += 2
|
|
|
+ if not mean[2, 1]:
|
|
|
+ number += 4
|
|
|
+ if not mean[2, 2]:
|
|
|
+ number += 8
|
|
|
+ return number
|
|
|
|
|
|
def get_transform_matrix_points(corners, board_size, dpi):
|
|
|
|