矩阵列拼接_单应性矩阵应用之图像拼接

本文介绍了如何使用单应性矩阵进行图像拼接。通过提取ORB特征点,匹配并使用RANSAC筛选正确匹配,计算得到单应性矩阵H。接着对右图应用H变换,结合距离加权融合处理重叠区域,最终实现图像的无缝拼接。提供的实战案例详细展示了这一过程。
摘要由CSDN通过智能技术生成

上一篇文章单应性矩阵的计算,本文主要介绍如何把单应性矩阵应用于图像拼接中。

这里用手机拍摄了一幅画,分左图和右图。

5036549de54fb9a1ac52fbadb8d64f6c.png

左图

8c2e0d04ea35661853067ce519759dee.png

右图

具体的操作步骤:

  1. 提取两幅图中的特征点和描述子,常用的有ORB、SURF和SIFT。

  2. 对描述子进行匹配,OpenCV 提供了BFMatcher 和 FLANNMatcher

  3. 对匹配的特征点,会存在错误的匹配,通过RANSAC (Random Sample Consensus)筛选出正确的匹配。

  4. 对匹配的点对,计算单应性矩阵H

  5. 对右图应用H变换,然后进行重叠区域融合

实战

  1. 提取SIFT特征点和描述子

 cv::Ptr sift = xfeatures2d::SIFT::create(); sift->detectAndCompute(img1, noArray(), kpts1, desc1);

       2. 特征点粗匹配

void match(const Mat& desc1, const Mat& desc2, std::vector& matches){
        cv::Ptr matcher = FlannBasedMatcher::create();    std::vector<std::vector> pair_matches;    matcher->knnMatch(desc1, desc2, pair_matches, 2);    for (int i = 0; i < pair_matches.size(); ++i) {
            if(pair_matches[i].size()<2) continue;        DMatch& m0 = pair_matches[i][0];        DMatch& m1 = pair_matches[i][1];        if (m0.distance < 0.6 * m1.distance){
                matches.push_back(m0);        }    }}

5978ab5ed4de0b6ebafb28510417347e.png

粗匹配,可以看到有一些是错误的匹配

  3. 通过RANSAC筛选出正确的匹配和H矩阵 findHomography 已经包括了cv::RANSAC,mask 掩膜用来表示哪些点是goodmatch .

M H = findHomography(srcpts, dstpts,mask, cv::RANSAC, 5);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值