|
@@ -6,19 +6,21 @@ def getCMarkers (img):
|
|
|
e1 = cv2.getTickCount()
|
|
|
markers = []
|
|
|
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
|
- img3 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 10)
|
|
|
- #cv2.imshow("m3", img3)
|
|
|
- print("threshold", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
|
|
|
- kernel = np.ones((6,6),np.uint8)
|
|
|
+ img3 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, 10)
|
|
|
+
|
|
|
+ ####print("threshold", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
|
|
|
+ kernel = np.ones((2,2),np.uint8)
|
|
|
img2 = cv2.morphologyEx(img3, cv2.MORPH_CLOSE, kernel)
|
|
|
- print("close", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
|
|
|
-
|
|
|
+ ####print("close", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
|
|
|
+ # cv2.imshow("m3", img2)
|
|
|
# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
|
|
|
# img2 = cv2.dilate(img2,kernel,iterations = 2)
|
|
|
|
|
|
- kernel = np.ones((3,3),np.uint8)
|
|
|
- img2 = cv2.dilate(img2,kernel, 2)
|
|
|
- print("dilate", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
|
|
|
+ kernel = np.ones((2,2),np.uint8)
|
|
|
+ img2 = cv2.dilate(img2,kernel, 1)
|
|
|
+
|
|
|
+ # cv2.imshow("m3", img2)
|
|
|
+ ####print("dilate", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
|
|
|
# Setup SimpleBlobDetector parameters.
|
|
|
params = cv2.SimpleBlobDetector_Params()
|
|
|
params.filterByInertia = False
|
|
@@ -31,16 +33,16 @@ def getCMarkers (img):
|
|
|
|
|
|
# Filter by Area.
|
|
|
params.filterByArea = True
|
|
|
- params.minArea = 10
|
|
|
+ params.minArea = 5
|
|
|
params.minDistBetweenBlobs = 1
|
|
|
|
|
|
# Filter by Circularity
|
|
|
params.filterByCircularity = True
|
|
|
- params.minCircularity = 0.2
|
|
|
+ params.minCircularity = 0.5
|
|
|
|
|
|
# # Filter by Convexity
|
|
|
- # params.filterByConvexity = True
|
|
|
- # params.minConvexity = 0.90
|
|
|
+ params.filterByConvexity = True
|
|
|
+ params.minConvexity = 0.70
|
|
|
|
|
|
# Filter by Inertia
|
|
|
params.filterByInertia = True
|
|
@@ -55,14 +57,14 @@ def getCMarkers (img):
|
|
|
keypoints = detector.detect(img2)
|
|
|
|
|
|
|
|
|
- print("blob", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
|
|
|
+ ####print("blob", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
|
|
|
|
|
|
# Draw detected blobs as red circles.
|
|
|
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures
|
|
|
# the size of the circle corresponds to the size of blob
|
|
|
k = []
|
|
|
kk = []
|
|
|
- #print(len(keypoints))
|
|
|
+ #####print(len(keypoints))
|
|
|
for point in keypoints:
|
|
|
count = []
|
|
|
for p in keypoints:
|
|
@@ -74,11 +76,11 @@ def getCMarkers (img):
|
|
|
k.append((point.pt, count))
|
|
|
kk.append(point)
|
|
|
|
|
|
- print("near", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
|
|
|
+ ####print("near", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
|
|
|
for point in k:
|
|
|
p, near = point
|
|
|
# distance open the angre and 90 degree
|
|
|
- midistance = math.pi/10.0
|
|
|
+ midistance = math.pi/30.0
|
|
|
bottom = []
|
|
|
rigth = []
|
|
|
for p1 in near:
|
|
@@ -88,7 +90,7 @@ def getCMarkers (img):
|
|
|
u = np.array([p1[0]-p[0], p1[1]-p[1]])
|
|
|
v = np.array([p2[0]-p[0], p2[1]-p[1]])
|
|
|
angle = np.math.atan2(np.linalg.det([u,v]),np.dot(u,v))
|
|
|
- if abs(angle-math.pi/2.0) < math.pi/10.0:
|
|
|
+ if abs(angle-math.pi/2.0) < math.pi/30.0:
|
|
|
bottom = p1
|
|
|
rigth = p2
|
|
|
|
|
@@ -99,12 +101,13 @@ def getCMarkers (img):
|
|
|
conners = [p-addu-addv, bottom+addu-addv, rigth-addu+addv, conner+addu+addv]
|
|
|
trans = get_transform_matrix_points(conners, [10, 10], 10)
|
|
|
code = cv2.warpPerspective(gray, trans, dsize=(100, 100))
|
|
|
+ # code = cv2.adaptiveThreshold(code, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 1)
|
|
|
|
|
|
- number = getNumber(code, 130)
|
|
|
+ number = getNumber(code, 160)
|
|
|
if number == False:
|
|
|
+ # cv2.imshow("m2", code)
|
|
|
continue
|
|
|
|
|
|
- #cv2.imshow("m2", code)
|
|
|
|
|
|
uu = np.array([0, 1])
|
|
|
angle = np.math.atan2(np.linalg.det([v,uu]),np.dot(v,uu))
|
|
@@ -113,8 +116,8 @@ def getCMarkers (img):
|
|
|
if number != 0:
|
|
|
markers.append([number, mid, angle])
|
|
|
|
|
|
- #img2 = cv2.drawKeypoints(img2, kk, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
|
|
|
- #cv2.imshow("m3", img2)
|
|
|
+ img2 = cv2.drawKeypoints(img2, kk, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
|
|
|
+ cv2.imshow("m3", img2)
|
|
|
return markers
|
|
|
|
|
|
def getNumber(img, threshold):
|
|
@@ -126,8 +129,8 @@ def getNumber(img, threshold):
|
|
|
for hs in hsplit:
|
|
|
m.append(np.mean(hs))
|
|
|
mean.append(m)
|
|
|
- #print(np.array(mean).astype(np.uint8))
|
|
|
- #print(mean)
|
|
|
+ # print(np.array(mean).astype(np.uint8))
|
|
|
+ #####print(mean)
|
|
|
mean = np.array(mean) >= threshold
|
|
|
valid = mean[0, 0] == False
|
|
|
valid = valid and mean[0, 3] == False
|