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

9、Stitcher类图像拼接方法用到的算法较多,内容较复杂,可能对于一些人来说用起来过于繁琐,因此Opencv把拼接算法封装到了Stitcher类中,这样就不必理会拼接算法中的具体实现过程。下面我们就简单介绍一下Stitcher类中的一些常用的函数: 用系统缺省值创建图像拼接器stitcher:Stitcher Stitcher::createDefault(bool try
摘要由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());  
  • 11
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值