Opencv: как нарисовать контур круга на изображении - PullRequest
0 голосов
/ 28 мая 2019

Я написал функцию python, которая должна рисовать окружность на изображении, где центральная точка окружности была определена с помощью обратного вызова мыши:

def draw_circle_contour(frame, pt, radius):
    cv2.circle(frame, center=pt, radius=3, color=(255,0,0), thickness=-1)
    discretized_circle_contour_x = [pt[0] + radius*np.cos(theta) for theta in np.linspace(0, 36, 36)]
    discretized_circle_contour_x = map(int, discretized_circle_contour_x)
    discretized_circle_contour_y = [pt[1] + radius*np.sin(theta) for theta in np.linspace(0, 36, 36)]
    discretized_circle_contour_y = map(int, discretized_circle_contour_y)
    discretized_circle_contour = zip(discretized_circle_contour_x, discretized_circle_contour_y)
    for el in discretized_circle_contour:
        cv2.circle(frame, center=el, radius=2, color=(255,0,0), thickness=-1)

Теперь это работаетпрекрасно, когда я указываю, что тета находится в пределах np.linspace(0,360,360).Однако сейчас я хочу нарисовать только 1/10 круга.Т.е. я хочу нарисовать контур круга, где угол наклона составляет 36 °.Я полагал, что этот код должен работать, но по какой-то причине, когда я его запускаю, результат выглядит так:

myCircle

Что здесь происходит?Кто-нибудь может сказать?

Как вы указали: вместо рисования маленьких кружков / точек я также мог бы использовать cv2.polylines для рисования отрезка круга.Это просто требует, чтобы последние две строки были заменены на:

for el in discretized_circle_contour:
        help.append(list(el))
    cv2.polylines(frame, [np.asarray(help)], isClosed=False, color=(255,0,0), thickness=1) 

Однако, я все еще сталкиваюсь с проблемой, что этот сегмент рисуется несколько раз, хотя я хочу, чтобы он рисовался только один раз между [0, 36] градусов!

... и я только что нашел причину этого: угол theta нужно указывать в радианах, а не в градусах.Whops.

Окончательный результат выглядит так: polyline

1 Ответ

1 голос
/ 28 мая 2019

Что происходит, вы рисуете заполненный круг с радиусом 2 (который выглядит как точка, потому что радиус очень мал) в каждой точке discretized_circle_contour.

Если я правильно понимаю ваш вопрос, то, что вы на самом деле хотите, это просто арка, охватывающая 1/10 радиуса. У вас уже есть точки для арки в [0, 36] градусах, просто нарисуйте ее в виде ломаной линии:

cv2.polylines(frame, [discretized_circle_contour], False, 1)
...