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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(Open Source Computer Vision Library)是一个跨平台的计算机视觉库,提供了各种图像处理和计算机视觉算法的实现。其中,stitch2.49源码是OpenCV中的一个模块,用于图像拼接任务。 首先,stitch2.49源码使用了图像配准和融合的技术,将多张重叠的图像拼接成一张全景图。在进行图像配准时,该源码使用了特征点的提取与匹配算法,找到多幅图像中共同的特征点,并计算出它们之间的相似变换关系。然后,通过图像融合算法,将经过配准的图像进行融合,生成一张无缝连接的全景图。 在拼接过程中,该源码通过一系列的过滤和优化操作来提升拼接效果。例如,通过利用图像金字塔技术来对图像进行分辨率降低,以提高图像匹配的速度和准确性。同时,还对图像进行去畸变、曝光调整和色彩校正等操作,以消除图像之间的差异。此外,为了提高拼接结果的质量,该源码还使用了图像混合算法,将拼接边缘处的过渡区域进行自然平滑处理。 总体而言,stitch2.49源码是一个非常强大的图像拼接工具,能够对多张重叠图像进行自动配准和融合,生成高质量的全景图。它通过图像特征提取与匹配、图像融合和优化等技术,保证了拼接结果的准确性和美观性。这对于需要进行图像拼接任务的研究者和开发者来说,是一个非常有用的工具。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值