OpenCV图像拼接(2)基于羽化(feathering)技术的图像融合算法拼接类cv::detail::FeatherBlender

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::detail::FeatherBlender 是 OpenCV 中用于图像拼接的一个类,它属于 stitching 模块的一部分。这个类实现了基于羽化(feathering)技术的图像融合算法,用于平滑地混合重叠区域中的图像,从而生成无缝的全景图。

主要特点

  • 羽化技术:通过在图像的重叠部分应用加权平均来实现平滑过渡,权重通常是根据距离边缘的距离来确定的。
  • 简单且高效:适用于大多数基本的图像拼接需求,尽管可能不如一些更复杂的缝合方法(如基于图割的缝合器)那样精确,但它的计算效率更高。

成员函数

  • 构造函数

    FeatherBlender(double sharpness = 0.01): 构造函数允许指定羽化的锐度(sharpness),默认值为0.01。锐度参数影响羽化效果的平滑程度,较小的值产生更广泛的羽化。

  • setSharpness

    void setSharpness(double sharpness): 设置羽化的锐度。较高的锐度值会导致较窄的羽化区域,反之亦然。

  • prepare

    void prepare(const std::vector &corners, const std::vector &sizes): 根据输入图像的角点位置和尺寸准备羽化混合器。这个函数通常在开始拼接过程前调用,以便确定如何处理每个图像的重叠区域。

  • apply

    void apply(int idx, const Mat &img, const Mat &mask, Mat &result_mask): 将指定索引的图像应用到结果中,并根据当前设置的羽化参数进行混合。idx 表示要应用的图像的索引,img 是该图像,mask 是对应的掩码,而 result_mask 是输出结果的掩码。

  • blend

    void blend(const std::vector &src, const std::vector &masks, Mat &dst): 执行最终的图像混合操作。src 包含所有待拼接的源图像,masks 包含对应于每张源图像的掩码,dst 是输出的拼接后的图像。

代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <opencv2/stitching.hpp>

int main() {
    // 加载图像
    std::vector<cv::Mat> imgs;
    imgs.push_back(cv::imread("/media/dingxin/data/study/OpenCV/sources/images/stich1.png"));
    imgs.push_back(cv::imread("/media/dingxin/data/study/OpenCV/sources/images/stich2.png"));
    if (imgs[0].empty() || imgs[1].empty()) {
        std::cerr << "Error loading images!" << std::endl;
        return -1;
    }

    // 创建并配置 FeatherBlender
    double feather_width = 5; // 羽化宽度
    cv::Ptr<cv::detail::FeatherBlender> blender = cv::makePtr<cv::detail::FeatherBlender>(feather_width);

    // 创建拼接器,并设置为使用 FeatherBlender
    cv::Ptr<cv::Stitcher> stitcher = cv::Stitcher::create(cv::Stitcher::PANORAMA);
    stitcher->setBlender(blender);

    // 执行拼接
    cv::Mat pano;
    cv::Stitcher::Status status = stitcher->stitch(imgs, pano);
    if (status != cv::Stitcher::OK) {
        std::cerr << "Can't stitch images, error code = " << int(status) << std::endl;
        return -1;
    }

    // 显示结果
    cv::imshow("原始图1", imgs[0]);
    cv::imshow("原始图2", imgs[1]);
    cv::imshow("Panorama", pano);
    cv::waitKey(0);
    return 0;
}

运行结果

拼接的相当完美,(o)/

相关推荐
T型码农要学习36 分钟前
开源项目5|FileBrowser:免费在线文件管理器!随时随地管控服务器文件
运维·服务器·人工智能·开源
智恒百亿1 小时前
8 卡 RTX 5090 服务器深度实测:256GB 显存能否支撑 70B 模型微调?选型参考
大数据·运维·服务器·人工智能
ai小陈3 小时前
PyTorch DataLoader数据加载性能排查:GPU利用率低的实操指南
人工智能·pytorch·python·深度学习·ai·gpu算力
测试者家园5 小时前
为什么意图驱动测试是自动化测试的下一站,而不是替代品
自动化测试·软件测试·人工智能·持续测试·ai赋能·智能化测试·软件测试变革
D202020206 小时前
TikTok Shop禁止AI语音直播落地后,跨境卖家如何通过达秘合规调整带货内容
人工智能
像风一样自由20206 小时前
20.Milvus常见问题检索不到维度错误和数据一致性
人工智能·大模型·milvus
现代野蛮人6 小时前
【深度学习实验】—— 基于 LSTM 与 Optuna 调参的丙型肝炎预测
人工智能·深度学习·lstm
支支დ6 小时前
VO by Vercel 前端特定优势:为什么它是构建 AI 应用的新范式
前端·人工智能
ZGIAI7 小时前
ZGI 让那些"等你去处理"的事,真正跑起来
人工智能·架构
ZGIAI7 小时前
ZGI:别再做Agent Demo了,先问问它在业务里能不能撑过下周三
人工智能·架构