Обнаружение кругов в OpenCV - PullRequest
0 голосов
/ 23 марта 2019

Хотя я понимаю, что для OpenCV HoughCircles нет настройки "один размер подходит всем", у меня возникли некоторые проблемы с поиском хотя бы одного разумного набора параметров.

Мое входное изображение - это следующее фото, на котором есть несколько довольно заметных больших черных кругов, а также шум вокруг него:

Original input photo

Я попытался поиграть с аргументами p1 и p2, чтобы попытаться точно определить четыре обнаруженных черных круга (и, необязательно, рулон ленты сверху - это не требуется, но я бы не стал возражать, если оно совпало или).

import numpy as np
import cv2

gray = frame = cv2.imread('testframe2.png')

gray = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray,(5,5),0)
# gray = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 2)

p1 = 200
p2 = 55

while True:
    out = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)

    circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 10, param1=p1, param2=p2, minRadius=10, maxRadius=0)

    if circles is not None:
        for (x, y, r) in circles[0]:
            cv2.rectangle(out, (int(x - r), int(y - r)), (int(x + r), int(y + r)), (255, 0, 0))
            cv2.putText(out, "r = %d" % int(r), (int(x + r), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (255, 0, 0))

    cv2.putText(out, "p: (%d, %d)" % (p1, p2), (0, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 4)
    cv2.imshow('debug', out)

    if cv2.waitKey(0) & 0xFF == ord('x'):
        break
    elif cv2.waitKey(0) & 0xFF == ord('q'):
        p1 += 5
    elif cv2.waitKey(0) & 0xFF == ord('a'):
        p1 -= 5
    elif cv2.waitKey(0) & 0xFF == ord('w'):
        p2 += 5
    elif cv2.waitKey(0) & 0xFF == ord('s'):
        p2 -= 5

cv2.destroyAllWindows()

Кажется, лучшее, что я могу сделать, это обнаружить большой круг несколько раз, но совсем не маленький, или получить лот ложных срабатываний:

Best parameter setting: detects big circle multiple times but not the small one

Я прочитал руководство F **, но оно не помогает мне дальше: как мне несколько надежнее обнаружить круги и ничего кроме кругов на этом изображении?

1 Ответ

0 голосов
/ 28 марта 2019

Было немного ручной настройки параметров HoughCircles, но это дает результат, который вы ищете.Я использовал библиотеку OpenCV Wrapper , которая просто упрощает некоторые вещи.

import cv2
import opencv_wrapper as cvw
import numpy as np

frame = cv2.imread("tape.png")

gray = cvw.bgr2gray(frame)
thresh = cvw.threshold_otsu(gray, inverse=True)
opened = cvw.morph_open(thresh, 9)

circles = cv2.HoughCircles(
    opened, cv2.HOUGH_GRADIENT, 1, 10, param1=100, param2=17, minRadius=5, maxRadius=-1
)

if circles is not None:
    circles = np.around(circles).astype(int)
    for circle in circles[0]:
        cv2.floodFill(thresh, None, (circle[0], circle[1]), 155)

only_circles = thresh.copy()
only_circles[only_circles != 155] = 0

contours = cvw.find_external_contours(only_circles)
cvw.draw_contours(frame, contours, (255, 0, 255), thickness=2)

cv2.imwrite("tape_result.png", frame)

Я использовал HoughCircles, чтобы найти только центры, как предложено в документации примечание.

Затем я использовал floodFill, чтобы заполнить круги.Обратите внимание, что крайний левый круг находится очень близко к краю.Если изображение было размытым, заливка заливалась бы фоном.

Раскрытие информации: я являюсь автором OpenCV Wrapper.Еще не добавлены крутые круги и заливка.

...