首页 > 解决方案 > Opencv:如何在图像上绘制圆形轮廓

问题描述

我写了一个 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)

现在,当我将 theta 指定在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需要以弧度而不是度数给出。哎呀。

最终结果如下所示: 折线

标签: pythonopencvimage-processingvideo-processing

解决方案


发生的事情是,您在discretized_circle_contour.

如果我正确理解您的问题,那么您真正想要的只是一个跨越半径 1/10 的拱门。您已经有了 [0, 36] 度的拱形点,只需将其绘制为折线即可:

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

推荐阅读