使用RANSAC估计两组点之间的二维转换

7
据我所知,OpenCV使用RANSAC来解决findHomography问题,并返回一些有用的参数,如homograph_mask
然而,如果我想估计只有2D变换,也就是仿射矩阵,是否有一种方法可以使用与findHomography相同的RANSAC方法并返回相应的掩码?

相关:http://answers.opencv.org/question/6747/is-there-a-way-to-compute-a-ransac-based-affine-transformation/ - Miki
这里提到要使用estimateRigidTransform,它似乎在内部使用RANSAC。 - Miki
1
如果您知道如何从3个点对计算2D变换,那么您可以轻松编写自己的简单RANSAC代码。据我所知,estimateRigidTransform使用RANSAC,但不幸的是您无法对其进行参数化... - Micka
好的,谢谢。所以没有现成的解决方案。 - Humam Helfawi
2个回答

12
您可以直接使用 estimateAffinePartial2D: https://docs.opencv.org/4.0.0/d9/d0c/group__calib3d.html#gad767faff73e9cbd8b9d92b955b50062d

cv::Mat cv::estimateAffinePartial2D (   
    InputArray  from,
    InputArray  to,
    OutputArray     inliers = noArray(),
    int     method = RANSAC,
    double  ransacReprojThreshold = 3,
    size_t  maxIters = 2000,
    double  confidence = 0.99,
    size_t  refineIters = 10 
)   

例如:

        src_pts = np.float32([pic1.key_points[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
        dst_pts = np.float32([pic2.key_points[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)

        # Find the transformation between points, standard RANSAC
        transformation_matrix, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)

        # Compute a rigid transformation (without depth, only scale + rotation + translation) and RANSAC
        transformation_rigid_matrix, rigid_mask = cv2.estimateAffinePartial2D(src_pts, dst_pts)

7

estimateRigidTransform 内部使用了 RANSAC,尽管目前的参数是固定的 - 可以在此处查看代码 - https://github.com/opencv/opencv/blob/master/modules/video/src/lkpyramid.cpp

cv::Mat cv::estimateRigidTransform( InputArray src1, InputArray src2, bool fullAffine )
{
    const int RANSAC_MAX_ITERS = 500;
    const int RANSAC_SIZE0 = 3;
    const double RANSAC_GOOD_RATIO = 0.5;

    // ...

    // RANSAC stuff:
    // 1. find the consensus
    for( k = 0; k < RANSAC_MAX_ITERS; k++ )
    {
        int idx[RANSAC_SIZE0];
        Point2f a[RANSAC_SIZE0];
        Point2f b[RANSAC_SIZE0];

        // choose random 3 non-complanar points from A & B
        for( i = 0; i < RANSAC_SIZE0; i++ )
        {
            for( k1 = 0; k1 < RANSAC_MAX_ITERS; k1++ )
            {

1
代码已经改变了,自从你复制粘贴之后。现在它直接调用estimateAffinePartial2D函数。 - ZettaCircl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接