也很难找到我问题的确切答案,这就是为什么我想在这里问它,即使在其他地方解释得不好。我尝试在代码中添加解决方案,以便每个人都可以返回我的结果。但首先必须解决它。
它与 OpenCV 进行三角测量cv::triangulatePoints()
。我知道它的记录很差,但可以在 willowgarage(现在)找到它(搜索文档 2.4.9)
- 我用于棋盘校准 22 个不同角度的立体图像(两个凸轮)等。为稳定的内在参数。
- 得到了棋盘角
cv::findChessboardCorners()
- 可选的 -
cv::cornerSubPix()
- 在所有棋盘点上创建 objectPoints
cv::Point3f( k*m_squareSize, j*m_squareSize,0.0f)
(k - 棋盘宽度,j 棋盘高度,反之亦然,squareSize = 真实世界大小) - 做2.-4。对于每张图片
- 把所有东西都放在这里:
cv::calibrateCamera(object_points1, image_points1, image.size(), intrinsic1, distCoeffs1, rvecs1, tvecs1);
这个功能就像我想要的那样完美,我也在用第二个相机图像来做。经过长时间的研究,我发现了这一点: cv::Mat R12 = R2*R1.t(); cv::Mat T12 = T2-R*T1;
这是针对 cam1 和 cam2 之间的关系 (R|T)。这工作得很好,我已经用cv::stereoCalibrate()
.- 在这一步,我想使用我的 tvecs 和 rvecs 重新投影 2D 太 3D 和 3D 太 2D。最后我完成了
cv::projectPoints(object_points1[i],rvecs1[i],tvecs1[i],intrinsic1, distCoeffs1, imagePoints1);
-> 工作正常 - 我从 2Pixel 差异中得到了 48 * 2 * 22 点,最多只有一个点。但是知道我不能从 2d 到 3D 的三角测量走得更远。我有!太用了cv::triangulatePoints()
。我怎么得到这个工作???
到目前为止我所做的尝试没有一个好的结果:您首先需要投影矩阵 P1 和 P2。
cv::Matx34d P1 = cv::Matx34d( R1.at<double>(0,0), R1.at<double>(0,1), R1.at<double>(0,2), tvecs1[0].at<double>(0),
R1.at<double>(1,0), R1.at<double>(1,1), R1.at<double>(1,2), tvecs1[0].at<double>(1),
R1.at<double>(2,0), R1.at<double>(2,1), R1.at<double>(2,2), tvecs1[0].at<double>(2));
抱歉,这看起来很重,但它只有旋转矩阵 (rodrigues(rvecs1,R1)) 和平移向量 tvecs1。这是错的吗?我必须反转旋转矩阵 R1 吗?
下一步:您需要左右图像中的 imagePoints(Corners)。这些 imagePoints 是我从 findChessboardCorners() 获得的未失真角。
使用cv::triangulatePoints(P1, P2, cv::Mat(undisPt_set1).reshape(1,2), cv::Mat(undisPt_set2).reshape(1,2), point3d);
point3d 后是一个“4D”点,其中第四个参数也被convertPointsHomogeneous(point3d.reshape(4, 1), point3dCam1);
这是我到目前为止所做的 - 但它不起作用。有人知道我做错了什么吗?最后一步有什么错误的想法吗?我已经尝试过数学,但我不确定投影矩阵 P1 和 P2。我知道它的构建类似于 [R|t],但它是我的 tvecs 和 tvecs 吗?它是转置的还是倒置的?任何帮助都会很好,但请帮助我提供一些代码或明确的步骤 - 而不是更多我应该阅读和思考的链接,我真的做了研究,我有学习 OpenCV 书、OpenCV2 食谱,还有 Hartley 和 Zisserman 在这里在我前面。但我无法做到。