使用opencv在c ++中将3d点从相机空间转换为对象空间

时间:2017-06-27 09:41:49

标签: c++ opencv

在计算机视觉中,当我需要将cv :: mat从对象(世界)空间坐标转换为相机空间或以相机为中心的坐标时,我使用以下内容 代码:(其中rvectvec是相机的旋转和平移向量)

cv::Mat R; //holds rotation matrix
cv::Rodrigues(rvec, R); // converts a rotation vector to a 3x3 matrix
R = R.t();  // rotation of inverse
tvec2 = -R * tvec; // translation of inverse

tvec2作为相机空间坐标。

我目前的问题恰恰相反。我在相机空间中有一个3d点阵列,我需要将它们转换为世界空间。上述函数的反函数是什么样的?

谢谢。

1 个答案:

答案 0 :(得分:1)

我建议你做的是有一个4x4投影矩阵。实际上,您可以更轻松地将您的点从世界坐标系统(WCS)转换为相机坐标系。实际上,让我们假设您在{0,0,0}的WCS中有一个点,而在{10,0,0}处的相机在Y轴上旋转45度。你可以做的就是创建你的投影矩阵

rot = 45度= 0,785398 rad。

轮换:(3x3)

enter image description here

翻译:(1x3)

enter image description here

您的投影矩阵将是:(4x4)

enter image description here

使用投影矩阵,让我们说你在WCS中有一个观点:

enter image description here

只需将其更改为:

enter image description here

然后你可以做些什么来改变它CCS是:

php.ini

在WCS中返回只需使用矩阵逆:

PointInCCS = projectionMatrix * PointInWCS;