5

对于一个项目,我需要计算相机相对于已知物体的真实位置和方向。我有一组照片,每张照片都从不同的角度展示了一个棋盘。使用 CalibrateCamera 和 solvePnP 我能够在 2d 中重新投影点,以获得 AR 的东西。所以我的情况是这样的:

  • 内在参数是已知的

  • 失真系数是已知的

  • 每张照片都知道平移向量和旋转向量。

我根本无法弄清楚如何计算相机的位置。我的猜测是:

  • 反转平移向量。(=t')

  • 将旋转向量转换为度数(似乎是弧度)并反转

  • 在旋转矢量上使用罗德里格斯

  • 计算 RotationMatrix * t'

但结果不知何故完全不对......基本上我想为世界坐标中的每个像素计算一条射线。如果需要有关我的问题的更多信息,我很乐意快速回答。

我不明白……不知何故,光线仍然熄灭。这是我的代码顺便说一句:

Mat image1CamPos = tvecs[0].clone(); //From calibrateCamera
Mat rot = rvecs[0].clone(); //From calibrateCamera
Rodrigues(rot, rot);
rot = rot.t();

//Position of Camera
Mat pos = rot * image1CamPos;

//Ray-Normal (( (double)mk[i][k].x) are known image-points)
float x = (( (double)mk[i][0].x) / fx) - (cx / fx);
float y = (( (double)mk[i][0].y) / fy) - (cy / fy);
float z = 1;
float mag = sqrt(x*x + y*y + z*z);
x /= mag;
y /= mag;
z /= mag;

Mat unit(3, 1, CV_64F);
unit.at<double>(0, 0) = x;
unit.at<double>(1, 0) = y;
unit.at<double>(2, 0) = z;

//Rotation of Ray
Mat rot = stof1 * unit;

但是当绘制这个时,光线是关闭的:/

4

1 回答 1

8

物体相对于相机的平移 t(3x1 向量)和旋转 R(3x3 矩阵)等于从物体到相机空间的坐标变换,由下式给出:

v' = R * v  + t

旋转矩阵的求逆就是简单的转置:

R^-1 = R^T

知道了这一点,您可以轻松地将转换(第一个 eq.)解析为 v:

v = R^T * v' - R^T * t

这是从相机到物体空间的转换,即相机相对于物体的位置(旋转 =R^T和平移 = -R^T * t)。

您可以从中简单地得到一个 4x4 齐次变换矩阵:

T = ( R^T  -R^T * t )
    (  0       1    )

如果您现在在相机坐标中有任何点,则可以将其转换为对象坐标:

p' = T * (x, y, z, 1)^T

因此,如果您想从坐标为 (a,b) 的像素投射光线(可能您需要将图像的中心,即 报告的主点定义CalibrateCamera为 (0,0)) - - 让那个像素成为P = (a,b)^T。它在相机空间中的 3D 坐标为P_3D = (a,b,0)^T。让我们在正 z 方向上投影一条 100 像素的射线,即到点Q_3D = (a,b,100)^T。您需要做的就是使用转换矩阵 T 将两个 3D 坐标转换为对象坐标系,您应该能够在对象空间中的两个点之间画一条线。但是,请确保您不要混淆单位:CalibrateCamera 将报告像素值,而您的对象坐标系可能以 cm 或 mm 为单位进行定义。

于 2012-12-19T17:23:44.387 回答