我一直在使用 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,但没有任何改变。