lego 5 years ago
parent
commit
47a157af0a
2 changed files with 33 additions and 23 deletions
  1. 17 19
      cmarkers.py
  2. 16 4
      server.py

+ 17 - 19
cmarkers.py

@@ -2,30 +2,23 @@ import cv2
 import numpy as np
 import math
 
-validcheck = [[False, True, False, False],
-[False, True, True, False],
-[False, False, True, False],
-[True, False, True, True],
-[True, False, True, False],
-[True, True, False, False],
-[True, True, False, True],
-[True, False, False, True]]
-
-
 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, 125, 10)
-
+    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)
     img2 = cv2.morphologyEx(img3, cv2.MORPH_CLOSE, kernel)
+    print("close", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
 
     # 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())
     # Setup SimpleBlobDetector parameters.
     params = cv2.SimpleBlobDetector_Params()
     params.filterByInertia = False
@@ -38,7 +31,7 @@ def getCMarkers (img):
 
     # Filter by Area.
     params.filterByArea = True
-    params.minArea = 20
+    params.minArea = 10
     params.minDistBetweenBlobs = 1
 
     # Filter by Circularity
@@ -52,6 +45,7 @@ def getCMarkers (img):
     # Filter by Inertia
     params.filterByInertia = True
     params.minInertiaRatio = 0.2
+    params.filterByColor = False
 
     # Create a detector with the parameters
     detector = cv2.SimpleBlobDetector_create(params)
@@ -60,11 +54,15 @@ def getCMarkers (img):
     # Detect blobs.
     keypoints = detector.detect(img2)
 
+
+    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 = [] 
+    kk = []
+    #print(len(keypoints))
     for point  in keypoints:
         count = []
         for p  in keypoints:
@@ -76,6 +74,7 @@ def getCMarkers (img):
             k.append((point.pt, count))
             kk.append(point)
 
+    print("near", (cv2.getTickCount() - e1)/ cv2.getTickFrequency())
     for point in k:
         p, near = point
         # distance open the angre and 90 degree
@@ -101,8 +100,7 @@ def getCMarkers (img):
                     trans = get_transform_matrix_points(conners, [10, 10], 10)
                     code = cv2.warpPerspective(gray, trans, dsize=(100, 100))
 
-
-                    number = getNumber(code, 150)
+                    number = getNumber(code, 130)
                     if number == False:
                         continue
 
@@ -128,8 +126,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

+ 16 - 4
server.py

@@ -176,7 +176,7 @@ if __name__ == "__main__":
  
     # The size of the board in inches, measured between the two
     # robot boundaries:
-    board_size = [90, 90]
+    board_size = [140, 125]
     point = []
  
     # Number of pixels to display per inch in the final transformed image. This
@@ -199,8 +199,9 @@ if __name__ == "__main__":
         if camera:
             img_orig = get_frame(dev)
         else:
-            time.sleep(0.1)
+            time.sleep(0.5)
 
+        start = time.time()
         if img_orig is not None: # if we did get an image
             img = img_orig
             if camera:
@@ -210,7 +211,12 @@ if __name__ == "__main__":
                     transform = get_transform_matrix_points(centers, board_size, dpi)
 
                 img = cv2.warpPerspective(img_orig, transform, dsize=transform_size)
+                e1 = cv2.getTickCount()
+                # your code execution
                 markers = getCMarkers(img)
+                e2 = cv2.getTickCount()
+                tt = (e2 - e1)/ cv2.getTickFrequency()
+                print("mk", tt)
 
                 for i in markers:
                     idd, p, head = i
@@ -229,12 +235,18 @@ if __name__ == "__main__":
                     cv2.line(img, (p1[0], p1[1]), (p2[0], p2[1]), color)
             if server.paused:
                 cv2.putText(img, "PAUSE", (0,30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255))
-            cv2.imshow("warped", img)
+            res = cv2.resize(img,None,fx=.5, fy=.5)
+            end = time.time()
+            seconds = end - start
+            fps  = 1.0 / seconds
+            start = time.time()
+            cv2.putText(res, str(fps), (0,60), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255))
+            cv2.imshow("warped", res)
  
         else: # if we failed to capture (camera disconnected?), then quit
             break
  
-        k = cv2.waitKey(33)
+        k = cv2.waitKey(1)
         if k == 115: # s
             server.startGame()
         elif k == 112: # p