Stitching模块中对特征提取的封装解析(以ORB特性为例)

时间:2023-03-10 04:49:47
Stitching模块中对特征提取的封装解析(以ORB特性为例)
titching模块中对特征提取的封装解析(以ORB特性为例)
    OpenCV中Stitching模块(图像拼接模块)的拼接过程可以用PipeLine来进行描述,是一个比较复杂的过程。在这个过程中,特征提取是重要的一个部分。由于OpenCV发展到了3.X以后,Stitching模块的相关函数进行了重新封装,所以对于学习研究造成了一定困难。这里通过解析代码,研究Stitching模块中的特征提取部分,并且和直接进行特征提取的相关函数进行比对。
采用的图片为 parliament2.bmp 和 parliament3.bmp
  Stitching模块中对特征提取的封装解析(以ORB特性为例)

Stitching模块中对特征提取的封装解析(以ORB特性为例)

一、直接的特征提取
结果图片
Stitching模块中对特征提取的封装解析(以ORB特性为例)
可以看到很明显,右图中绘制出来了左图通过放射变换后所在的位置。目测是比较准确的。
代码:
#, CV_32F);
    ; i) ; i; i)]); 
    }
    Mat result;
    drawMatches(img1, keyImg1, img2, keyImg2, bestMatches, result);
    std; i );
    std);
    obj_corners[] ,); 
    obj_corners[]  );
    obj_corners[] ] , img1.rows );
    perspectiveTransform( obj_corners, scene_corners, H);
    );
    line( result, scene_corners[] ] , , ),  );
    line( result, scene_corners[] ] , , ),  );
    line( result, scene_corners[] ] , , ),  );
    line( result, scene_corners[] ] , , ),  );
    imshow("result", result);
    waitKey();
}
    
这段代码主要参考的是OpenCV自带的"matchmethod_orb_akaze_brisk.cpp"。需要注意的是3.X版本中ORB函数的定义和之前也是不一样的。
二、使用Stitching模块
Stitching模块中对特征提取的封装解析(以ORB特性为例)
代码:
#));
    Mat MatSub , img1.cols);
    img1.copyTo(MatSub);
    MatSub );
    ]);
    (]);
    finder.);
    std);
    obj_corners[] ,); 
    obj_corners[]  );
    obj_corners[] ] , img1.rows );
    ;i )
        {
            H );
    line( result, scene_corners[] ]  , , ),  );
    line( result, scene_corners[]  ]  , , ),  );
    line( result, scene_corners[] ]  , , ),  );
    line( result, scene_corners[]   ]  , , ),  );
    imshow("result",  result);
    imwrite("result.jpg",result);
    waitKey();
}
    
对后面这段代码重点解析。
1、首先为了能够最后方便显示,首先就是将两幅图片合成了一副图片,采用的是copyto+mask参数的方法。这种方法是我在AskOpenCV上面学到的。
 ));
    Mat MatSub , img1.cols);
    img1.copyTo(MatSub);
    MatSub *img1.cols);
    img2.copyTo(MatSub);
2、创建特征提取函数
  );
    ]);
    (]);
    finder->collectGarbage();
直接创建OrbFeaturesFinder的智能指针对象,调用指针函数,寻找到特征到
ImageFeatures的数据结构中去。
这里,如果进行代码跟踪,就会发现对于同一幅图方法二找到ORB特征和方法一找到的是不一样的。
方法二在这里,将特征点的寻找,和特征向量的提取计算全部集成封装,需要注意。
struct CV_EXPORTS ImageFeatures
{
    int img_idx;
    Size img_size;
    std::vector<KeyPoint> keypoints;
    UMat descriptors;
};
可以看到,ImageFeatures结构中不经包括了keypoints的vector,而且包括了UMat的descriptors,一步到位
3、特征匹配和提存
 vector.3f);
    (*matcher)(features, pairwise_matches);
    matcher->collectGarbage();
这里的封装应该说更多。在方法一种,在这里经过了BruteForce特征匹配,排序,Ransac
提纯3个步骤,那么在Stitching模块中,只是用了一个方法。如果根据函数中去,可以发
现其实实现步骤和方法一类似,但是也有自己不同地方
4、仿射变换、绘制结果
 );
    std);
    obj_corners[] ,); 
    obj_corners[]  );
    obj_corners[] ] , img1.rows );
    ;i )
        {
            H );
    line( result, scene_corners[] ]  , , ),  );
    line( result, scene_corners[]  ]  , , ),  );
    line( result, scene_corners[] ]  , , ),  );
    line( result, scene_corners[]   ]  , , ),  );
    imshow("result",  result);
    imwrite("result.jpg",result);
这里和方法一类似,需要注意的地方就是由于H等数据结构都已经集成
在pairwise_matches的数据结构中,所以通过一个循环找到自己需要的H。
小结:这里初步对Stitching模块中对特征提取的封装解析进行了分析,为下一步图像拼接的深入研究做技术准备。值得注意的是目前看上去,Stitching模块中对特征提取的封
装实现的结果不如原生的方法好,这里是由于我操作的原因,还是因为本身设计的原因还要继续研究。