python - OpenCV:如何在图像上绘制圆形轮廓

标签 python opencv image-processing video-processing

我已经编写了一个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。即我想绘制一个圆形轮廓,其中被遮盖的 Angular 为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角必须以弧度而不是度数给出。哎呀

最终结果如下所示:
polyline

最佳答案

发生的情况是,您在discretized_circle_contour的每个点上绘制了一个半径为2(看起来像点,因为半径很小)的实心圆。

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

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

关于python - OpenCV:如何在图像上绘制圆形轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56338183/

相关文章:

android - 如何在 Android 中集成基于 Python 的 OpenCV 项目?

java - PNGj : Row writing order

比较两个图像时查找不同区域边缘的算法或工具

python - Django QuerySet 过滤器 + order_by + 限制

python - 获取图像的 RGB channel

python - 在 Tensorflow 2.0 中卡住和导出 TensorFlow 模型

python - 如何消除光的偏转

opencv - OpenCV2.4中 "matching_to_many_images.cpp"的样例无法运行

python - 关键字匹配在 pandas 列中给出重复的单词?

python - Python中的for循环与C++有何不同?