OpenCV solvePnPRansac始终返回0

时间:2017-06-14 12:24:50

标签: opencv opencv-solvepnp

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

enter image description here

这是我的代码

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和inlier的结构。另外,我还修改了代码,使用FLANN匹配SURF,SIFT而不是ORB,但没有任何改变。

0 个答案:

没有答案