opencv三角剖分三维重建中的几个问题 我目前在一个立体视觉项目中,我应该从每个相机视图中发现的对应点来重建3D点,为此我使用OpenCV 2.4.7作为C++。

opencv三角剖分三维重建中的几个问题 我目前在一个立体视觉项目中,我应该从每个相机视图中发现的对应点来重建3D点,为此我使用OpenCV 2.4.7作为C++。,opencv,3d,triangulation,Opencv,3d,Triangulation,我能够正确地校准两台摄像机,计算基本矩阵,计算重投影矩阵,并校正图像 我的问题在于项目的最后一部分,即从二维点对应计算三维世界坐标。我已经尝试过使用cv::triangulatePoints,但是无论输入点是什么,结果都是坐标为0、0、0的点。我还尝试了Hartley&Strum的线性三角剖分算法,但也没有给我好的结果 谁能给我一个提示,我应该使用什么函数?或者是一些关于如何正确实施我所说的建议。我最大的问题是在互联网上找到好的文档,所以我决定在这里提问 谢谢大家! 我也尝试了cv::trian

我能够正确地校准两台摄像机,计算基本矩阵,计算重投影矩阵,并校正图像

我的问题在于项目的最后一部分,即从二维点对应计算三维世界坐标。我已经尝试过使用cv::triangulatePoints,但是无论输入点是什么,结果都是坐标为0、0、0的点。我还尝试了Hartley&Strum的线性三角剖分算法,但也没有给我好的结果

谁能给我一个提示,我应该使用什么函数?或者是一些关于如何正确实施我所说的建议。我最大的问题是在互联网上找到好的文档,所以我决定在这里提问


谢谢大家!

我也尝试了cv::triangulatePoints,它可以计算垃圾。我被迫手动实现线性三角剖分方法,该方法返回给定立体像素对应关系的三角剖分3D点:

Mat triangulate_Linear_LS(Mat mat_P_l, Mat mat_P_r, Mat warped_back_l, Mat warped_back_r)
{
    Mat A(4,3,CV_64FC1), b(4,1,CV_64FC1), X(3,1,CV_64FC1), X_homogeneous(4,1,CV_64FC1), W(1,1,CV_64FC1);
    W.at<double>(0,0) = 1.0;
    A.at<double>(0,0) = (warped_back_l.at<double>(0,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,0) - mat_P_l.at<double>(0,0);
    A.at<double>(0,1) = (warped_back_l.at<double>(0,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,1) - mat_P_l.at<double>(0,1);
    A.at<double>(0,2) = (warped_back_l.at<double>(0,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,2) - mat_P_l.at<double>(0,2);
    A.at<double>(1,0) = (warped_back_l.at<double>(1,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,0) - mat_P_l.at<double>(1,0);
    A.at<double>(1,1) = (warped_back_l.at<double>(1,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,1) - mat_P_l.at<double>(1,1);
    A.at<double>(1,2) = (warped_back_l.at<double>(1,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,2) - mat_P_l.at<double>(1,2);
    A.at<double>(2,0) = (warped_back_r.at<double>(0,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,0) - mat_P_r.at<double>(0,0);
    A.at<double>(2,1) = (warped_back_r.at<double>(0,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,1) - mat_P_r.at<double>(0,1);
    A.at<double>(2,2) = (warped_back_r.at<double>(0,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,2) - mat_P_r.at<double>(0,2);
    A.at<double>(3,0) = (warped_back_r.at<double>(1,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,0) - mat_P_r.at<double>(1,0);
    A.at<double>(3,1) = (warped_back_r.at<double>(1,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,1) - mat_P_r.at<double>(1,1);
    A.at<double>(3,2) = (warped_back_r.at<double>(1,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,2) - mat_P_r.at<double>(1,2);
    b.at<double>(0,0) = -((warped_back_l.at<double>(0,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,3) - mat_P_l.at<double>(0,3));
    b.at<double>(1,0) = -((warped_back_l.at<double>(1,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,3) - mat_P_l.at<double>(1,3));
    b.at<double>(2,0) = -((warped_back_r.at<double>(0,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,3) - mat_P_r.at<double>(0,3));
    b.at<double>(3,0) = -((warped_back_r.at<double>(1,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,3) - mat_P_r.at<double>(1,3));
    solve(A,b,X,DECOMP_SVD);
    vconcat(X,W,X_homogeneous);
    return X_homogeneous;
}

输入参数是两个3x4摄影机投影矩阵和左/右对应的齐次像素坐标。

您可能将错误的输入传递给了triangulatePoints方法。检查另一个问题:帮你自己一个忙,使用Mat_uu进行这种冒险,然后你可以跳过at部分,访问是一个不错的b1,0。可读性/清晰度的巨大提升我哪天会试试看你能解释一下吗,例如,为什么在翘曲1,0/翘曲2,0*mat\u r.at2,3-mat\u r.at1,3 r1,0除以r2,0*P2,3中?该算法是线性三角剖分,供参考,请阅读Andrew Zisserman免费在线书籍《计算机视觉中的多视图几何》第12.2章。其思想是在方程X=PX中推断X,X为像素坐标,P为相机矩阵,X为空间坐标。因为左项和右项相等,所以它们的叉积为零,可以将其重塑为AX=0。上面的方法在从x和P创建一个后解这个方程。