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

本文介绍了OpenCV的Stitcher类,它是图像拼接的封装工具,简化了拼接过程。通过Stitcher类的estimateTransform和composePanorama函数实现图像匹配和合成。此外,文章提到了Stitcher类如何通过调整尺度提高效率和节省内存,并列举了其默认使用的一系列算法,如SURF特征检测、2-NN匹配、射线发散法等。
摘要由CSDN通过智能技术生成

9、Stitcher类

图像拼接方法用到的算法较多,内容较复杂,可能对于一些人来说用起来过于繁琐,因此Opencv把拼接算法封装到了Stitcher类中,这样就不必理会拼接算法中的具体实现过程。

下面我们就简单介绍一下Stitcher类中的一些常用的函数:

 

用系统缺省值创建图像拼接器stitcher:

Stitcher Stitcher::createDefault(bool try_use_gpu)
//try_use_gpu表示是否应用图像处理器
{
    Stitcher stitcher;    //实例化Stitcher类
    //设置全局变量registr_resol_为0.6,registr_resol_表示图像配准分辨率
    stitcher.setRegistrationResol(0.6);
    //设置全局变量seam_est_resol_为0.1,seam_est_resol_表示接缝分辨率
    stitcher.setSeamEstimationResol(0.1);
    //ORIG_RESOL = -1,设置全局变量compose_resol_为ORIG_RESOL,compose_resol_表示合成分辨率
    stitcher.setCompositingResol(ORIG_RESOL);
    //设置全局变量conf_thresh_为1,conf_thresh_表示匹配置信度,即式25
    stitcher.setPanoConfidenceThresh(1);
    //设置全局变量do_wave_correct_为true,do_wave_correct_表示是否进行波形校正
    stitcher.setWaveCorrection(true);
    //设置全局变量wave_correct_kind_为WAVE_CORRECT_HORIZ,wave_correct_kind_表示波形校正的方式,这里是用的水平校正
    stitcher.setWaveCorrectKind(detail::WAVE_CORRECT_HORIZ);
    //设置全局变量features_matcher_为BestOf2NearestMatcher(),features_matcher_表示特征匹配方法,这里是用2-NN方法
    stitcher.setFeaturesMatcher(new detail::BestOf2NearestMatcher(try_use_gpu));
    //设置全局变量bundle_adjuster_为BundleAdjusterRay(),bundle_adjuster_表示光束平差法,这里用的是射线发散方法
    stitcher.setBundleAdjuster(new detail::BundleAdjusterRay());

#if defined(HAVE_OPENCV_GPU) && !defined(DYNAMIC_CUDA_SUPPORT)
    if (try_use_gpu && gpu::getCudaEnabledDeviceCount() > 0)
    {
#if defined(HAVE_OPENCV_NONFREE)
        stitcher.setFeaturesFinder(new detail::SurfFeaturesFinderGpu());
#else
        stitcher.setFeaturesFinder(new detail::OrbFeaturesFinder());
#endif
        stitcher.setWarper(new SphericalWarperGpu());
        stitcher.setSeamFinder(new detail::GraphCutSeamFinderGpu());
    }
    else
#endif
    {
#ifdef HAVE_OPENCV_NONFREE    //表示可以使用NONFREE
        //设置全局变量features_finder_为SurfFeaturesFinder(),features_finder_表示特征检测的方法,在这里是用SURF算法
        stitcher.setFeaturesFinder(new detail::SurfFeaturesFinder());
#else    //表示不可以使用NONFREE
        //设置全局变量features_finder_为OrbFeaturesFinder(),在这里用的是ORB算法
        stitcher.setFeaturesFinder(new detail::OrbFeaturesFinder());
#endif
        //设置全局变量warper_为SphericalWarper(),warper_表示图像投影变换的方法,在这里是球面投影方法
        stitcher.setWarper(new SphericalWarper());
        //设置全局变量seam_finder_为GraphCutSeamFinderBase::COST_COLOR,seam_finder_表示寻找接缝线的算法,在这里是图割法,而且误差表面函数是直接法
        stitcher.setSeamFinder(new detail::GraphCutSeamFinder(detail::GraphCutSeamFinderBase::COST_COLOR));
    }
    //设置全局变量exposure_comp_为BlocksGainCompensator(),exposure_comp_表示曝光补偿方法,在这里是分块增益补偿方法
    stitcher.setExposureCompensator(new detail::BlocksGainCompensator());
    //设置全局变量blender_为MultiBandBlender(),blender_表示融合算法,在这里是多频段融合方法
    stitcher.setBlender(new detail::MultiBandBlender(try_use_gpu));

    return stitcher;    //返回Stitcher类
}

estimateTransform函数用于匹配图像,并评估相机的旋转参数:

Stitcher::Status Stitcher::estimateTransform(InputArray images)
//images表示待拼接的输入图像
{
    //调用另一种形式的estimateTransform函数
    return estimateTransform(images, vector<vector<Rect> >());
}
Stitcher::Status Stitcher::estimateTransform(InputArray images, const vector<vector<Rect> > &rois)
//images表示待拼接的输入图像
//rois表示输入图像中感兴趣的矩形区域,即只对该区域进行拼接
{
    images.getMatVector(imgs_);    //图像赋值
    rois_ = rois;    //赋值

    Status status;
    //调用matchImages函数,用于匹配图像,该函数在后面给出介绍
    if ((status = matchImages()) != OK)
        return status;
    //调用estimateCameraParams函数,用于评估相机参数,该函数在后面给出介绍
    estimateCameraParams();

    return OK;
}

composePanorama函数用于合并拼接图像:

Stitcher::Status Stitcher::composePanorama(OutputArray pano)
//pano表示最终得到的全景图像
{
    //调用另一种形式的composePanorama函数
    return composePanorama(vector<Mat>(), pano);
}
Stitcher::Status Stitcher::composePanorama(InputArray images, OutputArray pano)
//images表示经过变形处理后的图像
//pano表示最终得到的全景图像
{
    LOGLN("Warping images (auxiliary)... ");

    vector<Mat> imgs;
    images.getMatVector(imgs);    //赋值
    //如果imgs不为空,即输入参数images有值,则需要把images的相关值赋予imgs_
    if (!imgs.empty())    //如果imgs不为空,即有值
    {
        CV_Assert(imgs.size() == imgs_.size());  
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模块进行了初步的介绍,具体的源码分析需要深入研究。整个源码工程庞大,包含很多细节和算法,需要对计算机视觉和图像处理有较深入的理解才能进行分析和改进。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值