私は ORB 機能を使用して、いくつかの共通機能を事前に持っていると思われる 2 つのビデオ フレームのマッチングを行ってきました。その後、いくつかの変更が今日与えられる前に、比較的うまく機能する solvePnPRansac によって変換が推定されます。今日は関数を 2 つの部分 (2 つの独立した関数) に分割して、そのうちの 1 つに特徴を抽出させ、もう 1 つにマッチングを実行させました。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 を含む構造体として単純に定義されます。さらに、ORB の代わりに SURF、SIFT に一致する FLANN を使用するようにそのコードを変更しましたが、何も変更されていません。