python - 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
需要以弧度而不是度数给出。哎呀。
解决方案
发生的事情是,您在discretized_circle_contour
.
如果我正确理解您的问题,那么您真正想要的只是一个跨越半径 1/10 的拱门。您已经有了 [0, 36] 度的拱形点,只需将其绘制为折线即可:
cv2.polylines(frame, [discretized_circle_contour], False, 1)
推荐阅读
- vba - VBA:从 SourceSheet 复制行并使用动态行粘贴到 DestSheet
- php - 更新到数据库时 Codeigniter 中的 Crud 不受影响
- activemq - 如何在另一个现有的 DLQ 上创建 DLQ 并设置重新投递策略等?
- windows - 奇偶校验同步暂停很长时间
- java - 更改 Audit4j 中的文件名
- amazon-web-services - 如何在 AWS 控制台中每天为 EMR 中的“n”个应用程序完成指标设置警报
- php - 数据库连接数如何计算?
- vba - VBa - 用户窗体在两个页面上显示相同的组合框
- django - 以 10 为底的 int() 的 Django 通知无效文字
- html - 轮播指示器不工作