cv2 orb 图像拼接_图像拼接Opencv源码重构

请看赵春江https://me.csdn.net/zhaocj的主页,他已经对Opencv图像拼接流程中的代码做了很详细的解释。前人栽树,后人乘凉。

一.本文所做的事

1.重构了Opencv图像拼接的源代码,整个代码是面向过程的;

2.在赵春江源码分析基础上,对一些细节部分进行说明。

代码链接:https://github.com/mhhai/ImageStitch

二.特征点检测

一切起源于这段代码

Ptr finder;    //定义特征寻找器
finder = new  OrbFeaturesFinder();    //应用ORB方法寻找特征
vector features(num_images);    //表示图像特征
for (int i = 0; i < num_images; i++)
     (*finder)(imgs[i], features[i]);    //特征检测

finder =newOrbFeaturesFinder(); 这段代码生成了一个OrbFeaturesFinder对象,其构造函数为:

OrbFeaturesFinder::OrbFeaturesFinder(Size _grid_size, int n_features, float scaleFactor, int nlevels)
{
    
    grid_size = _grid_size;
    orb = ORB::create(n_features * (99 + grid_size.area())/100/grid_size.area(), scaleFactor, nlevels);
}

可以看出这里面创建了一个ORB类。关于这一点,看OrbFeaturesFinder类的继承结构

cv2 orb 图像拼接_图像拼接Opencv源码重构_第1张图片

真正实现ORB算法是在orb.cpp中的ORB_Impl类,其他的都是一些函数调用过程,这也是opencv难以看懂的部分。OrbFeaturesFinder类声明(在matchers.hpp)如下:

class CV_EXPORTS OrbFeaturesFinder : public FeaturesFinder
{
    
public:
    OrbFeaturesFinder(Size _grid_size = Size(3,1), int nfeatures=1500, float scaleFactor=1.3f, int nlevels=5);

private:
    void find(InputArray image, ImageFeatures &features) CV_OVERRIDE;

    Ptr orb;
    Size grid_size;
};

可以看出OrbFeaturesFinder是没有重载()的,那么它为什么可以使用

你可能感兴趣的:(cv2,orb,图像拼接)