我有一台灰度相机,我已经用标准校准方法计算了其内部参数。然后,我将相机放置在特定的固定装置中,并在相机前面放置一个带有 8 个标记点的板。我使用以下公式计算了相对于这些标记的坐标系的相机姿势:
cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)
,
其中 rotM 是旋转矩阵,tvec 是使用 opencv 的 cv.solvePnP
获得的平移向量
我想检查计算出的相机位姿有多准确,但遇到了一个问题,即我不知道,cameraPosition向量指向哪个物理点。
我一开始以为它指向图像平面的中心,但现在我读到它指向投影点的中心。
是哪一个?如果它确实是投影中心,我如何计算它位于我的相机中的位置(使用特定的相机设置)?
谢谢
-np.matrix(rotM).T * np.matrix(tvec)
是将世界坐标中的点 (xw yw zw) 转换为相机坐标的逆操作,当该点在相机系统中为 (0,0,0) 时。
[R R R tx][xw]
[R R R ty][yw]
[R R R tz][zw]
[0 0 0 1 ][1 ]
是
Xc = rotM@Xw + tvec
(Xw=[xw,yw,zw], tvec=[tx,ty,tz], rotM=R)
所以逆运算是
Xw = RotM⁻¹@(Xc-tvec)
又名 Xw = RotM.T@(Xc-tvec)
,因为对于旋转矩阵,逆运算和转置是相同的。
如果 Xc=[0,0,0],则 Xw=-rotM.T@tvec
因此,确实,它指向以世界坐标表示的投影中心(相机坐标系的原点)。它告诉您相机在您的世界坐标中的位置(您用于在 3D 世界中定位物理点的坐标)
为了最终到达图像的中心,需要进行投影(规范投影矩阵,乘以固有矩阵),这将导致 [cx,cy],相机方向在图像中的位置(通常是图像的中间)图像,但不一定)。但世界上唯一无法投影的点恰好是投影的中心。因此,要实现这一点,您首先需要向 Zc 添加一些内容(任何内容)
所以,我不知道您打算如何使用“以世界坐标表示的投影中心”来检查您的投影。也许是为了验证,在您的世界坐标中,该点确实指向物理相机的位置? (实际上,不完全是:那是投影中心。它是镜头创建的虚拟点。但是,它应该距离相机“内部”的点不远,与镜头的焦距相同。