1

我一直在使用 ORB 功能来匹配两个视频帧,这两个视频帧预先假设有一些共同的特征。后来,solvePnPRansac 估计了一个转换,它在今天进行一些修改之前工作得相对较好。我今天将一个函数分成两部分(2 个独立函数),其中一个提取特征,另一个执行匹配。solvePnPRansac 可以毫无问题地返回转换结果,但经过这样的修改后它只给出零矩阵,我可以弄清楚这有什么问题。

在此处输入图像描述

这是我的代码

PNP_RESULT retmotion(pts_obj, pts_img)
{
    float camera_matrix_data[3][3] = {
        { camera.fx, 0, camera.cx },
        { 0, camera.fy, camera.cy },
        { 0, 0, 1 }
    };

    std::cout << "-> solving pnp" << std::endl;
    // Camera matrix.
    const cv::Mat cameraMatrix = cv::Mat(3, 3, CV_64F, camera_matrix_data);
    cv::Mat rmat, tmat, inliers;

    // Solve PnP.
    //cv::solvePnP(pts_obj, pts_img, cameraMatrix, cv::Mat(), rmat, tmat, false, CV_ITERATIVE);
    cv::solvePnPRansac(pts_obj, pts_img, cameraMatrix, cv::Mat(), rmat, tmat, false, 100, 1.0, 100, inliers);

    PNP_RESULT ret1;
    ret1.rvec = rmat;
    ret1.tvec = tmat;
    std::cout << "Rot in SovPnP: " << rmat << std::endl;
    std::cout << "Trsl in SovPnP: " << tmat << std::endl;

    ret1.inliers = inliers.rows;

    return ret1;
}

PNP_RESULT 被简单地定义为包含 rvec、tvec 和 inliers 的结构。此外,我还修改了该代码以使用 FLANN 匹配 SURF、SIFT 而不是 ORB,但没有任何改变。

4

0 回答 0