|
@@ -0,0 +1,77 @@
|
|
|
|
+import cv2
|
|
|
|
+import zmq
|
|
|
|
+import numpy as np
|
|
|
|
+
|
|
|
|
+cv2.namedWindow("Image", cv2.WINDOW_GUI_NORMAL)
|
|
|
|
+cv2.namedWindow("Mask", cv2.WINDOW_GUI_NORMAL)
|
|
|
|
+
|
|
|
|
+context = zmq.Context()
|
|
|
|
+socket = context.socket(zmq.SUB)
|
|
|
|
+socket.setsockopt(zmq.SUBSCRIBE, b"")
|
|
|
|
+port = 5055
|
|
|
|
+socket.connect(f"tcp://192.168.0.113:{port}")
|
|
|
|
+
|
|
|
|
+n = 0
|
|
|
|
+while True:
|
|
|
|
+ bts = socket.recv()
|
|
|
|
+ n += 1
|
|
|
|
+ arr = np.frombuffer(bts, np.uint8)
|
|
|
|
+ image = cv2.imdecode(arr, cv2.IMREAD_COLOR)
|
|
|
|
+ hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
|
|
|
|
+ _, thresh = cv2.threshold(hsv[:, :, 1], 70, 255, cv2.THRESH_BINARY)
|
|
|
|
+ distance_map = cv2.distanceTransform(thresh, cv2.DIST_L2, 5)
|
|
|
|
+ ret, dist_tresh = cv2.threshold(
|
|
|
|
+ distance_map, 0.6 * np.max(distance_map), 255, cv2.THRESH_BINARY
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+ confuse = cv2.subtract(thresh, dist_tresh.astype("uint8"))
|
|
|
|
+ ret, markers = cv2.connectedComponents(dist_tresh.astype("uint8"))
|
|
|
|
+ markers += 1
|
|
|
|
+ markers[confuse == 255] = 0
|
|
|
|
+
|
|
|
|
+ segments = cv2.watershed(image, markers)
|
|
|
|
+ cnts, hierrachy = cv2.findContours(
|
|
|
|
+ segments, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+ n_circ = 0
|
|
|
|
+ n_rect = 0
|
|
|
|
+ for i in range(len(cnts)):
|
|
|
|
+ if hierrachy[0][i][3] == -1:
|
|
|
|
+ rect = cv2.minAreaRect(cnts[i])
|
|
|
|
+ box = cv2.boxPoints(rect)
|
|
|
|
+ box = np.int0(box)
|
|
|
|
+ width, height = rect[1]
|
|
|
|
+ if abs(width - height) < 10:
|
|
|
|
+ n_circ += 1
|
|
|
|
+ else:
|
|
|
|
+ n_rect += 1
|
|
|
|
+ cv2.drawContours(image, [box], 0, (0, 255, 0), 10)
|
|
|
|
+
|
|
|
|
+ cv2.putText(
|
|
|
|
+ image,
|
|
|
|
+ f"Circles: {n_circ}",
|
|
|
|
+ (10, 20),
|
|
|
|
+ cv2.FONT_HERSHEY_SIMPLEX,
|
|
|
|
+ 0.5,
|
|
|
|
+ (0, 0, 255),
|
|
|
|
+ 2,
|
|
|
|
+ )
|
|
|
|
+ cv2.putText(
|
|
|
|
+ image,
|
|
|
|
+ f"Rects: {n_rect}",
|
|
|
|
+ (10, 40),
|
|
|
|
+ cv2.FONT_HERSHEY_SIMPLEX,
|
|
|
|
+ 0.5,
|
|
|
|
+ (0, 0, 255),
|
|
|
|
+ 2,
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+ key = cv2.waitKey(10)
|
|
|
|
+ if key == ord("q"):
|
|
|
|
+ break
|
|
|
|
+
|
|
|
|
+ cv2.imshow("Image", image)
|
|
|
|
+ cv2.imshow("Mask", confuse)
|
|
|
|
+
|
|
|
|
+cv2.destroyAllWindows()
|