You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于两个圆周点绘制OpenCV圆?

基于OpenCV用两个圆周点绘制圆的实现方案

仅通过两个圆周上的点无法唯一确定一个圆,所有过这两点的圆的圆心都落在两点连线的垂直平分线上,半径随圆心位置变化。如果有额外约束条件,就可以完成绘制,以下是常见场景的实现方法:

场景1:两个点为圆的直径端点(最常用)

这种是最常见的需求,此时圆的参数可以唯一确定:

  • 圆心坐标:两点x坐标的平均值、y坐标的平均值
  • 半径:两点之间欧氏距离的1/2

Python OpenCV示例代码:

import cv2
import numpy as np

# 两个圆周点(直径端点)
p1 = (100, 200)
p2 = (300, 400)

# 计算圆心
center = ((p1[0] + p2[0]) // 2, (p1[1] + p2[1]) // 2)
# 计算半径
radius = int(np.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2) / 2)

# 假设你要在大小为600*600的空白图上画圆
img = np.zeros((600, 600, 3), dtype=np.uint8)
# 绘制圆,颜色为绿色,线宽为2
cv2.circle(img, center, radius, (0, 255, 0), 2)

cv2.imshow("Circle", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

场景2:已知圆的半径,求对应圆心

如果已经确定了圆的半径,那么可以得到两个符合要求的圆心,对应两个不同的圆:

import cv2
import numpy as np

p1 = (100, 200)
p2 = (300, 400)
r = 150 # 已知半径

# 计算两点中点
mid_x, mid_y = (p1[0] + p2[0])/2, (p1[1] + p2[1])/2
# 两点距离的一半
d_half = np.sqrt((p2[0]-p1[0])**2 + (p2[1]-p1[1])**2)/2

# 检查半径是否合法,必须大于等于d_half
if r < d_half:
    raise ValueError("给定半径小于两点距离的一半,不存在符合要求的圆")

# 计算垂直平分线上的偏移量
h = np.sqrt(r**2 - d_half**2)
# 两点连线的方向向量
dx = p2[0] - p1[0]
dy = p2[1] - p1[1]
# 垂直方向的单位向量
vx = -dy / (d_half * 2)
vy = dx / (d_half * 2)

# 两个可能的圆心
center1 = (int(mid_x + vx * h), int(mid_y + vy * h))
center2 = (int(mid_x - vx * h), int(mid_y - vy * h))

# 绘制两个圆
img = np.zeros((600, 600, 3), dtype=np.uint8)
cv2.circle(img, center1, r, (0, 255, 0), 2)
cv2.circle(img, center2, r, (255, 0, 0), 2)

cv2.imshow("Two Circles", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

如果你是在ArUco标记制作的场景下使用,通常标记上的圆形特征点的直径是固定的,你可以提前将半径参数写入代码,就可以直接调用第二种场景的代码实现绘制。
你用到的地图如下:
我的地图

内容的提问来源于stack exchange,提问作者The Oracle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:24:03