【问题标题】:How to find correspondence of 3d points and 2d points如何找到3d点和2d点的对应关系
【发布时间】:2015-06-14 18:59:31
【问题描述】:

我在世界坐标中有一组 3d 点,并与图像中的 2d 点分别对应。我想找到一个矩阵,让我在这些点之间进行转换。如何在 OpenCV 中做到这一点?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    cv::solvePnP() 是您正在寻找的东西,它从 3D-2D 点对应关系中找到对象姿势并生成旋转向量 (rvec),与平移向量 (tvec) 一起,将点从模型坐标系到相机坐标系。

    【讨论】:

    • 谢谢!但是我将如何反转这种转换呢?即我如何将图像点投影到 3d 世界? (假设一些固定的 z 坐标)
    • 但是我如何将该图像投影到 3d 空间或反之亦然?
    【解决方案2】:

    您可以为此使用solvePnP

        // camMatrix based on img size
        int max_d = std::max(img.rows,img.cols);
        Mat camMatrix = (Mat_<double>(3,3) <<
            max_d,   0, img.cols/2.0,
            0,   max_d, img.rows/2.0,
            0,   0,     1.0);
    
        // 2d -> 3d correspondence
        vector<Point2d> pts2d = ...
        vector<Point3d> pts3d = ...
        Mat rvec,tvec;
        solvePnP(pts3d, pts2d, camMatrix, Mat(1,4,CV_64F,0.0), rvec, tvec, false, SOLVEPNP_EPNP);
        // get 3d rot mat
        Mat rotM(3, 3, CV_64F);
        Rodrigues(rvec, rotM);
    
        // push tvec to transposed Mat
        Mat rotMT = rotM.t();
        rotMT.push_back(tvec.reshape(1, 1));
    
        // transpose back, and multiply
        return camMatrix * rotMT.t();
    

    【讨论】:

    • 我怎样才能将我的图像投影到那个 3d 空间上?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    相关资源
    最近更新 更多