如何基于两个圆周点绘制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
相关产品推荐
相关产品推荐

