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