我目前正在尝试通过获取两个摄像机都可以看到的跟踪模式的位置来获取两个 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
也更靠前一些
。
如您所见,红点完美地位于图案的第一个圆圈中,而对应的蓝点originPosition
甚至没有靠近。特别是它绝对不仅仅是从相机到原点的矢量缩放问题。此外,findCirclesGrid
在注册的彩色图像上完成,并且从相机本身获取内在参数,以确保图像和点云计算之间没有差异。