3

也很难找到我问题的确切答案,这就是为什么我想在这里问它,即使在其他地方解释得不好。我尝试在代码中添加解决方案,以便每个人都可以返回我的结果。但首先必须解决它。

它与 OpenCV 进行三角测量cv::triangulatePoints()。我知道它的记录很差,但可以在 willowgarage(现在)找到它(搜索文档 2.4.9)

  1. 我用于棋盘校准 22 个不同角度的立体图像(两个凸轮)等。为稳定的内在参数。
  2. 得到了棋盘角cv::findChessboardCorners()
  3. 可选的 -cv::cornerSubPix()
  4. 在所有棋盘点上创建 objectPoints cv::Point3f( k*m_squareSize, j*m_squareSize,0.0f)(k - 棋盘宽度,j 棋盘高度,反之亦然,squareSize = 真实世界大小)
  5. 做2.-4。对于每张图片
  6. 把所有东西都放在这里:cv::calibrateCamera(object_points1, image_points1, image.size(), intrinsic1, distCoeffs1, rvecs1, tvecs1);这个功能就像我想要的那样完美,我也在用第二个相机图像来做。经过长时间的研究,我发现了这一点:
  7. cv::Mat R12 = R2*R1.t(); cv::Mat T12 = T2-R*T1;这是针对 cam1 和 cam2 之间的关系 (R|T)。这工作得很好,我已经用cv::stereoCalibrate().
  8. 在这一步,我想使用我的 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 在这里在我前面。但我无法做到。

4

0 回答 0