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

已知3D圆的圆心、半径、法向量等参数,如何投影至2D图像平面?

3D圆投影为2D圆/椭圆的直接计算方法

首先明确:仅当3D圆所在平面与图像平面平行时,投影结果才是标准圆;其余场景下,3D圆的投影大概率是椭圆。以下是无需遍历圆周点的直接计算方案:

核心计算逻辑

1. 投影3D圆心到2D平面

先通过给定的旋转矩阵 ( R )、平移向量 ( T )(相机外参)将3D圆心 ( C_{3D} ) 转换到相机坐标系,再用内参矩阵 ( K ) 投影到2D图像平面:

  • 相机坐标系下的圆心:( C_{cam} = R \times C_{3D} + T )
  • 透视投影下的2D圆心:( C_{2D} = K \times (C_{cam} / C_{cam,z}) )(( C_{cam,z} ) 为相机坐标系下的z轴分量,代表圆心到相机平面的距离)
  • 平行投影下直接去掉除法:( C_{2D} = K \times C_{cam} )

2. 计算投影后的形状参数

平行投影场景

  • 若3D平面与图像平面平行:投影半径 = 3D半径 × 投影方向与平面的缩放因子
  • 若不平行:投影为椭圆,长/短半轴分别是3D半径在图像平面两个正交方向上的投影长度

透视投影场景

  1. 生成3D圆的两个正交方向向量:
    取两个垂直于法向量 ( N ) 且互相正交的向量 ( U )、( V ),长度均设为3D半径 ( r )(确保覆盖圆的所有方向)
  2. 将这两个向量投影到2D平面:
    向量 ( U )、( V ) 经外参转换到相机坐标系后,再通过内参投影到2D,得到 ( U_{2D} )、( V_{2D} )
  3. 判断投影形状:
    • 若 ( U_{2D} ) 和 ( V_{2D} ) 长度相等且正交,投影为圆,半径为其中一个向量的长度
    • 否则为椭圆,两个向量的长度就是椭圆的长/短半轴,向量方向即为椭圆轴的方向

伪代码实现

import numpy as np

# 已知参数:3D圆心C_3D,半径r,法向量N,旋转矩阵R,平移向量T,内参矩阵K
C_3D = np.array([x, y, z])
r = 1.0
N = np.array([nx, ny, nz])
R = np.array([[r11, r12, r13], [r21, r22, r23], [r31, r32, r33]])
T = np.array([tx, ty, tz])
K = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])

# 1. 转换到相机坐标系并投影2D圆心
C_cam = R @ C_3D + T
C_2D = K @ (C_cam / C_cam[2])  # 透视投影

# 2. 生成3D圆的正交方向向量
# 找一个不与N平行的临时向量,叉乘得到第一个方向U
if abs(N[0]) < abs(N[1]) and abs(N[0]) < abs(N[2]):
    temp = np.array([1, 0, 0])
elif abs(N[1]) < abs(N[2]):
    temp = np.array([0, 1, 0])
else:
    temp = np.array([0, 0, 1])
U = np.cross(N, temp)
U = (U / np.linalg.norm(U)) * r  # 归一化后乘以半径
V = np.cross(N, U)
V = (V / np.linalg.norm(V)) * r  # 保证U、V正交且长度为r

# 3. 投影方向向量到2D
U_cam = R @ U
U_2D = K @ (U_cam / C_cam[2])
V_cam = R @ V
V_2D = K @ (V_cam / C_cam[2])

# 4. 判断投影形状并输出参数
u_len = np.linalg.norm(U_2D)
v_len = np.linalg.norm(V_2D)
dot_product = np.dot(U_2D, V_2D)

if np.isclose(u_len, v_len) and np.isclose(dot_product, 0):
    print(f"投影为圆:圆心{tuple(C_2D[:2])},半径{u_len:.4f}")
else:
    print(f"投影为椭圆:圆心{tuple(C_2D[:2])},长半轴{u_len:.4f},短半轴{v_len:.4f}")

关键注意事项

  • 透视投影下,3D圆的投影几乎都是椭圆,仅当圆所在平面与图像平面平行时才会是圆;若平面过相机光心,投影会退化为直线
  • 生成正交方向向量时,需确保向量与法向量严格垂直,否则会导致投影参数误差
  • 所有方向向量计算前必须归一化,避免长度偏差影响最终结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:41:31