Надежное обнаружение квадратов с помощью OpenCV & Python - PullRequest
0 голосов
/ 29 мая 2020

Я пытался обнаружить квадраты в python с помощью OpenCV. Я хотел просто различать и обнаруживать заполненные цветом квадраты, чтобы избежать ложных срабатываний (например, рисунок в форме квадрата i sh). В этом случае я попытался просто обнаружить квадраты красной формы. Для этого сначала я выполняю цветовую сегментацию. Затем я пытаюсь определить контуры и получаю только те, которые имеют квадратную форму. Из обнаруженных квадратов я печатаю круг, проходящий через все их края.

Изображение здесь: https://i.imgur.com/PN310oq.png (пожалуйста, не обращайте внимания на желтые круги)

# Color segmentation
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower_red = np.array([0, 50, 50])
upper_red = np.array([5, 255, 255])
mask = cv2.inRange(hsv, lower_red , upper_red )
res = cv2.bitwise_and(image, image, mask=mask)

# Contour exctraction
imgray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(imgray, (5, 5), 0)
ret, thresholded = cv2.threshold(blurred, 50, 255, 0)
contours, h = cv2.findContours(thresholded, 1, 2)

# Square detection
for cnt in contours:
    approx = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True)
    if (len(approx) == 4) & (cv2.contourArea(cnt)>25): #to discard noise from the color segmentation
        contour_poly = cv2.approxPolyDP(cnt, 3, True)
        center, radius = cv2.minEnclosingCircle(contour_poly)
        color=(0,0,255)
        cv2.circle(image, (int(center[0]), int(center[1])), int(radius), color, 2)

Однако мой код не очень надежен. Вместо того, чтобы обнаруживать их на статическом c изображении, я делаю это в каждом кадре из видеопотока. При обнаружении квадратов наблюдается сильное мерцание (квадраты обнаруживаются не в каждом кадре, а очень редко), а меньшие квадраты очень трудно обнаружить. В идеале я хотел бы постоянно обнаруживать как можно меньшие квадраты в большинстве кадров.

Есть ли у вас какие-либо идеи или предложения о том, как я могу улучшить свой код?

Вот один из неизмененные фреймы: https://i.imgur.com/K8deR8D.png

...