Opencv2.4.9源码分析——Stitching(一)

本文详细介绍了Opencv2.4.9中图像拼接的过程,首先强调了全景图像拼接的必要性,然后分析了计算特征点的步骤,包括SURF和ORB算法的应用。通过源码解析,展示了SurfFeaturesFinder和OrbFeaturesFinder类在检测特征点中的作用。
摘要由CSDN通过智能技术生成

相机镜头所呈现出的景物要比人类的视觉系统所看到的景物要狭小得多,因此一幅图像不可能捕获到我们所看到的整个景物。全景图像拼接给出了这个问题的解决办法,它是把图像间重叠部分拿出来拼接起来,从而得到一幅更大的图像。这种算法也可以用于把一幅图像插入到另一幅图像中。

图1 图像拼接执行过程及方法

要想完成图像拼接,所要用到的算法较多,Opencv把这些算法用一张图呈现了处理,如图1所示。下面我们就详细图像拼接算法。

 

1、计算特征点

 

1.1 原理

图像拼接的第一步是计算图像的特征,并得到它们的描述符。好的特征检测的算法有SIFT和SURF,但它们都受到专利的保护,使用上有一定的限制。而ORB算法是一种很好的替代方法,它是利用FAST检测特征,并生成BRIEF描述符。

关于局部特征检测方面的内容,我前面的文章中有一些算法的介绍,在这里就不再做过多的讲解。

 

1.2 源码

Opencv中应用的是SURF算法和ORB算法,详细的内容为:

class detail::FeaturesFinder表示寻找图像特征的类:

class CV_EXPORTS FeaturesFinder
{
public:
    virtual ~FeaturesFinder() {}
    //寻找给定图像的特征
    void operator ()(const Mat &image, ImageFeatures &features);
    void operator ()(const Mat &image, ImageFeatures &features, const std::vector<cv::Rect> &rois);
    virtual void collectGarbage() {}    //释放已被分配、但还没有被使用的内存

protected:
    //虚函数,根据用户所选取的特征类别,调用不同子类的find函数,目前只实现了SURF特征和ORB特征
    virtual void find(const Mat &image, ImageFeatures &features) = 0;
};

在FeaturesFinder类中,重载( )运算符主要的任务是调用find函数来检测图像特征。而find是虚函数,具体是执行FeaturesFinder类的两个子类——SurfFeaturesFinder和OrbFeaturesFinder中的find函数。下面我们就来介绍这两个子类,它们分别表示SURF特征和ORB特征。

 

SurfFeaturesFinder类的构造函数:

SurfFeaturesFinder::SurfFeaturesFinder(double hess_thresh, int num_octaves, int num_layers,
                                       int num_octaves_descr, int num_layers_descr)
//hess_thress表示Hessian矩阵行列式响应值的阈值,默认值为300
//num_octaves表示特征点所用到的图像堆的组数,默认值为3
//num_layers表示特征点所用到的图像堆中每组中的中间层数,默认值为4
//num_octaves_descr表示描述符所用到的图像堆的组数,默认值为3
//num_layers_descr表示描述符所用到的图像堆中每组中的中间层数,默认值为4
{
    //如果特征点和描述符所用到的组数和层数都相同,则只需一个Feature2D数据类型来表示特征点和描述符即可,默认就是这种情况
    if (num_octaves_descr == num_octaves && num_layers_descr == num_layers)
    {
        //surf为Feature2D数据类型的指针变量,它被创建为SURF特征点
        surf = Algorithm::create<Feature2D>("Feature2D.SURF"
opencv是一个开源的计算机视觉库,opencv2.4.9是其中的一个版本。在opencv2.4.9中,有一个模块叫做stitching,用于图像拼接。 图像拼接是将多张图像按照一定的顺序和方式进行合并,形成一张更大视野覆盖范围的图像。拼接的过程需要解决图像间的重叠区域匹配、图像变换与叠加等问题。 在opencv2.4.9stitching模块中,主要有以下几个重要的类: 1. Stitcher类:拼接器类,用于执行拼接的主要操作。它提供了一系列的方法,如设置拼接的模式、添加要拼接的图像等。 2. FeaturesFinder类:特征点检测类,用于在图像中寻找特征点。该类利用SIFT、SURF等算法来检测图像中的关键点,以便进行匹配。 3. FeaturesMatcher类:特征点匹配类,用于对图像中的特征点进行匹配。该类使用KNN算法进行特征点的匹配,并利用RANSAC算法进一步筛选特征点,剔除误匹配。 4. Estimator类:变换估计类,用于估计图像间的变换参数。该类可以通过特征点的对应关系,计算图像间的旋转矩阵、平移矩阵等变换参数。 5. Blender类:图像融合类,用于将拼接后的图像进行融合。该类可以进行多种融合方式,如线性融合、多频融合等。 通过以上的类和方法,opencv2.4.9stitching模块能够完成图像拼接的过程。整个过程包括特征点检测、特征点匹配、变换参数估计和图像融合等步骤。 需要指出的是,本文只是对opencv2.4.9stitching模块进行了初步的介绍,具体的源码分析需要深入研究。整个源码工程庞大,包含很多细节和算法,需要对计算机视觉和图像处理有较深入的理解才能进行分析和改进。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值