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

基于OpenCV相机标定数据,由2D图像点求解对应3D点的问询

问题解答

一、现有标定数据是否足够?

不足以计算出唯一的3D点。单张图像中的一个2D点,对应3D空间中一条从相机光心出发的射线——这条射线上的所有3D点投影到图像上都是同一个2D点。只有当你额外知道该3D点的深度信息(比如该点到相机的垂直距离Z,单位与外参tvec一致),才能确定唯一的3D坐标。

你的标定数据包含了完整的内参(相机矩阵、畸变系数)和外参(旋转向量rvec、平移向量tvec),这些是计算的基础,但缺少深度信息就无法得到唯一解。


二、已知深度时,计算3D点的步骤

先整理你的标定数据,方便后续使用:

1. 标定数据整理

  • 内参矩阵K:
[
 [1743.4479, 0.0, 934.5202],
 [0.0, 1735.1566, 444.3988],
 [0.0, 0.0, 1.0]
]
  • 畸变系数dist(k1, k2, p1, p2, k3):
[-0.4325, 0.6106, 0.0082, 0.0019, -0.6924]
  • 旋转向量rvec:
[1.7591, 0.4671, -0.3317]
  • 平移向量tvec:
[-525.8942, 45.4076, 986.7235]

2. 具体计算步骤

假设已知图像2D点为(u, v),该点的深度为Z_c(相机坐标系下的Z值,单位与tvec一致):

步骤1:对2D点去畸变

使用相机内参和畸变系数,将图像上的畸变点转换为归一化平面上的无畸变点(u', v')。
用OpenCV实现的代码示例:

import cv2
import numpy as np

# 输入的2D点(格式为Nx1x2的numpy数组)
img_point = np.array([[[u, v]]], dtype=np.float32)
# 去畸变
undistorted_point = cv2.undistortPoints(img_point, K, dist)
u_prime, v_prime = undistorted_point[0][0]

步骤2:转换为相机坐标系下的3D点

归一化点(u', v')乘以深度Z_c,得到相机坐标系下的3D点P_c = (X_c, Y_c, Z_c):

X_c = u' * Z_c
Y_c = v' * Z_c
Z_c = Z_c  # 已知的深度值

步骤3:转换为世界坐标系下的3D点

首先将旋转向量rvec转换为旋转矩阵R:

R, _ = cv2.Rodrigues(rvec)

然后通过外参将相机坐标系下的点转换到世界坐标系P_w = (X_w, Y_w, Z_w),公式为:

P_w = R.T @ (P_c - tvec)

(注:R.T是旋转矩阵的转置,对应相机到世界的逆变换;@表示矩阵乘法)

代码实现:

P_c = np.array([X_c, Y_c, Z_c], dtype=np.float32)
P_w = R.T @ (P_c - tvec)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:35:35