如何使用 ORB 获得良好的 Homography?

Posted

技术标签:

【中文标题】如何使用 ORB 获得良好的 Homography?【英文标题】:How do I get good Homography with ORB? 【发布时间】:2015-07-12 10:07:09 【问题描述】:

在this answer 中,我了解“// 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);

a) 如果我使用基本矩阵,我可以使用 findHomography 和 perspectiveTransform 吗?

b) 以上几行有什么问题吗?

【问题讨论】:

【参考方案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);

它应该也适合你。

【讨论】:

以上是关于如何使用 ORB 获得良好的 Homography?的主要内容,如果未能解决你的问题,请参考以下文章

Homography 知多少?

如何使用 Homography 在 OpenCV 中转换图片?

找到与已知 Homography 的平面平行的平面的 Homography

从Homography分解中寻找最合适的旋转和平移

通过不同的线程使用多个 ORB(多线程多 ORB 客户端应用程序) - 如何?

在不使用 opencv 的情况下在 python 中应用 Homography 变换