0

我目前正在尝试通过获取两个摄像机都可以看到的跟踪模式的位置来获取两个 Kinect v2 的相对位置。不幸的是,我似乎无法获得模式原点的正确位置。

这是我当前获取图案相对于相机位置的代码:

std::vector<cv::Point2f> centers;
cv::findCirclesGrid( registeredColor, m_patternSize, centers, cv::CALIB_CB_ASYMMETRIC_GRID );
cv::solvePnPRansac( m_corners, centers, m_camMat, m_distCoeffs, m_rvec, m_tvec, true );

// calculate the rotation matrix 
cv::Matx33d rotMat;
cv::Rodrigues( m_rvec, rotMat );

// and put it in the 4x4 transformation matrix
transformMat = matx3ToMatx4(rotMat);

for( int i = 0; i < 3; ++i )
    transformMat(i,3) = m_tvec.at<double>(i);

transformMat = transformMat.inv();

cv::Vec3f originPosition( transformMat(0,3), transformMat(1,3), transformMat(2,3) );

不幸的是,当我比较originPosition点云中与屏幕空间中的原点相对应的点(保存在centers.at(0)上面)时,我得到了一个非常不同的结果。下面的屏幕截图显示了来自 kinect 的点云,其中红色圆圈中图案原点的屏幕空间位置的点为红色,originPosition浅蓝色圆圈中的点为浅蓝色。屏幕截图是从图案的正前方截取的。originPosition也更靠前一些 。在屏幕空间中找到的图案原点为红色圆圈中的红点,solvePnP 3D 位置为浅蓝色圆圈中的浅蓝色点

如您所见,红点完美地位于图案的第一个圆圈中,而对应的蓝点originPosition甚至没有靠近。特别是它绝对不仅仅是从相机到原点的矢量缩放问题。此外,findCirclesGrid在注册的彩色图像上完成,并且从相机本身获取内在参数,以确保图像和点云计算之间没有差异。

4

1 回答 1

1

你有由 R|T 给出的变换 P->P',要得到由 R'|T' 给出的逆变换 P'->P,只需执行以下操作:

R' = R.t();
T' = -R'* T;

接着

P = R' * P' + T'
于 2017-10-02T10:01:03.333 回答