它与OpenCV cv::triangulatePoints()
进行三角测量。我知道它的记录很差,但可以在willowgarage(现在)找到(搜索文档2.4.9)
cv::findChessboardCorners()
cv::cornerSubPix()
cv::Point3f( k*m_squareSize, j*m_squareSize,0.0f)
(k - 棋盘宽度,j棋盘高度,反之亦然,squareSize = realworld大小)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&的关系(R | T)。 CAM2。这很好用,我用cv::stereoCalibrate()
的结果测试了它。 cv::projectPoints(object_points1[i],rvecs1[i],tvecs1[i],intrinsic1, distCoeffs1, imagePoints1);
- >工作得很好 - 我只有一个单点,从2像素差异中得到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));
抱歉,这看起来很重,但它只有rotationmatrix(rodrigues(rvecs1,R1))和translationvector 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);
消除了
这是我到目前为止所做的 - 但它不起作用。 有人知道我做错了什么吗?最后一步有什么错误的想法吗?我试过数学,但我不确定projectionMatrix P1和P2。我知道它的内置像[R | t],但它是我的tvecs和tvecs吗?它是转置还是反转?任何帮助都会很棒,但请帮我解决一些代码或明确的步骤 - 没有更多链接,我应该阅读和思考,我真的做了一个研究,我有学习OpenCV书,OpenCV2食谱,以及Hartley和Zisserman这里在我前面。但我无法达到目的。