Я написал функцию 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 °.Я полагал, что этот код должен работать, но по какой-то причине, когда я его запускаю, результат выглядит так:
Что здесь происходит?Кто-нибудь может сказать?
Как вы указали: вместо рисования маленьких кружков / точек я также мог бы использовать 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.
Окончательный результат выглядит так: