1

私は 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 を使用するようにそのコードを変更しましたが、何も変更されていません。

4

0 に答える 0