Как получить хорошую гомографию с помощью ORB?

в этот ответ я все понимаю до непосредственно перед "// 5. Проверить совпадения с помощью RANSAC".

В своем коде я использую этот код, за исключением части ransacTest. Я сталкиваюсь с проблемой, что я получаю слишком много неправильных "совпадений" и/или иногда прямоугольник вокруг объекта, который находит мой код, слишком искажен.

//Template image's corners 
obj_corners[0] = cvPoint( 0, 0); 
obj_corners[1] = cvPoint( best_img.cols, 0 );
obj_corners[2] = cvPoint( best_img.cols, best_img.rows ); 
obj_corners[3] = cvPoint( 0, best_img.rows );

obj.clear();
scene.clear();
for ( int i = 0; i < best_matches.size(); i++ )
{
    //Get the keypoints from the good matches
    obj.push_back( best_img_keypoints[ best_matches[i].queryIdx ].pt ); // Template image
    scene.push_back( frame_keypoints[ best_matches[i].trainIdx ].pt ); // Frame 
}

// -----Find homography----- //
std::vector<uchar> outlier_mask; //I don't use this line
cv::Mat H = findHomography( obj, scene, CV_RANSAC, reprojThres, outlier_mask);
cv::perspectiveTransform(obj_corners, scene_corners, H);

а) Если я использую фундаментальную матрицу, смогу ли я использовать findHomography и перспективное преобразование?

б) Есть ли что-то неправильное в приведенных выше строках?


person AchiPapakon    schedule 12.07.2015    source источник


Ответы (1)


У меня была такая же проблема, как у вас. Я решил проблему, рассматривая symMatches как good_matches (best_matches) и после

if (good_matches.size() > 3){
    //-- Localize the object
    std::vector<Point2f> obj;
    std::vector<Point2f> scene;

    for (int i = 0; i < good_matches.size(); i++)
    {
        //-- Get the keypoints from the good matches
        obj.push_back(keypoints_object[good_matches[i].queryIdx].pt);
        scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt);
    }

    Mat H = findHomography(obj, scene, CV_RANSAC);

    //-- Get the corners from the image_1 ( the object to be "detected" )
    std::vector<Point2f> obj_corners(4);
    obj_corners[0] = cvPoint(0, 0); 
    obj_corners[1] = cvPoint(img_object.cols, 0);
    obj_corners[2] = cvPoint(img_object.cols, img_object.rows); 
    obj_corners[3] = cvPoint(0, img_object.rows);
    std::vector<Point2f> scene_corners(4);

    perspectiveTransform(obj_corners, scene_corners, H);

Это должно сработать и для вас.

person Vahid    schedule 13.07.2016