gpt4 book ai didi

c++ - OpenCV 计算相机位置和旋转

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:52 31 4
gpt4 key购买 nike

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

  • 内参已知

  • 失真系数已知

  • 每张照片已知平移 vector 和旋转 vector 。

我根本不知道如何计算相机的位置。我的猜测是:

  • 反转翻译 vector 。 (=t')

  • 将旋转 vector 转换为度数(好像是弧度)并反转

  • 在旋转 vector 上使用 rodriguez

  • 计算旋转矩阵 * 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;

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

最佳答案

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

v' = R * v  + t

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

R^-1 = R^T

了解这一点,您可以轻松解决转换(第一个等式)到 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 等单位定义。

关于c++ - OpenCV 计算相机位置和旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13957150/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com