CV9-特征匹配3

运动估计

忽略外点,假设特征点匹配都基本正确。如何实现以下过程?
在这里插入图片描述

参数化运动模型

在这里插入图片描述

  • 齐次坐标:用 N + 1 个数来表示 N 维坐标
    在这里插入图片描述
  • 二维仿射变换:仿射变换就是线性变换 + 平移
    在这里插入图片描述
    在这里插入图片描述
  • 二维透视变换:透视变换比仿射变换多了两个参数,导致 w w w 可能不是 1
    在这里插入图片描述

常见的变换矩阵

在这里插入图片描述
在这里插入图片描述

仿射变换

改变物体的位置和形状,但保持平直性

至少需要三个点对
在这里插入图片描述
不共线的三个平面点对决定一个二维仿射变换
在这里插入图片描述
如果有大于三个点对,我们可以通过优化的方式更精准得进行估计。

  • A A A 是参数矩阵,代表点 p i p_i pi 的运动
  • p i ‘ p_i^` pi 代表另一张图像中的点,也就是 ground truth
    在这里插入图片描述

特殊仿射变换

相似变换

  • 只包含平移,旋转和等比缩放

  • 保持物体的形状
    在这里插入图片描述
    虽然 s c o s θ scos\theta scosθ s s i n θ ssin\theta ssinθ 之间存在一定的关系,但是他们仍然可以写成 a a a b b b 的形式,因为 s s s 是可以任意变化的,因此什么值都能取

刚性变换

  • 只包含平移和旋转

  • 保持物体的形状和尺寸
    在这里插入图片描述
    这里的 c o s θ cos\theta cosθ s i n θ sin\theta sinθ 不能写成 a a a , b b b 的形式,因为他们之间有自身的约束,也有相互之间的约束。

那么如何求解呢?,得到结果之后有什么用呢?

非性最小二乘问题无法构造出来一个矩形线性方程组,没有办法直接求出解析解。那我们可不可以将其转换为线性或者近似线性的呢?:泰勒一阶展开
在这里插入图片描述
下面,我们正是运用了这样的思想线性最小二乘和非线性最小二乘 - 简书 (jianshu.com)
在这里插入图片描述
最后我们通过求解 A A A 便可以得到一个更新值,之后不断更新知道直到目标

第一步到第二步的推导
在这里插入图片描述

  • SVD 分解 (没仔细看)
    在这里插入图片描述

透视变换

透视变化简单来说就是把一个平面上的图拍到另一个平面上,可以彻底改变物体的位置和形状

八个参数,至少需要四个点对

  • 平面到平面的保持直线性的映射
  • 任意一个个 3 * 3 可逆矩阵都是透视变换
  • 任意透视变换都可以表示为 3 * 3 可逆矩阵
    在这里插入图片描述

透视变换估计

  • 非线性最小二乘法(和上面仿射变换求解方法一样)
    在这里插入图片描述

  • 直接线性变换(通过点对之间的公式列方程,之后利用SVD分解求解)
    在这里插入图片描述
    在这里插入图片描述

考虑外点

实际上,特征点匹配时都可能包含大量的错误

RANSAC

Random Sample Consensus:随机抽样一致算法。是一种在包含离群点在内的数据集里,通过迭代的方式估计模型的参数的方法。有一定的概率得到一个合理的结果。

优点是它能鲁棒的估计模型参数

方法:规避外点的影响,只使用那些内点

直觉:如果一个离群的点被选择来计算当前的拟合,那么这个结果对剩下的点就不会有很好的拟合效果

流程:

  • 随机选择一组种子点(随机选取的点默认是内点)来进行基本的变换估计
  • 利用这一组种子点计算变换公式(利用随机选择的局内点拟合一个模型)
  • 找到符合这一变换公式的点,并将其标注为内点(用上面得到的模型来测试其他店)
  • 如果内点的数量足够大,那么通过所有内点重新计算上面得到的模型的最小二乘估计,来评估拟合出的模型

如果当前模型效果比当前最好模型更好,则选用其为最好模型。否则,抛弃,重新开始迭代

需要多少次取样?

  • w w w 是内点的比例,也就是一个点是内点的概率
  • n n n 个点能够定义一个模型(直线需要两个)
  • 进行了 k k k 次取样,每次取 n n n 个点

一次取样中,选出的 n n n 个点全都是内点的概率为 w n w^n wn , k k k 次取样没有哪一次正好取完 n n n 个样本点的概率为 p = ( 1 − w n ) k p = (1-w^n)^k p=(1wn)k。因此选择足够大的 k k k 使其低于期望故障率

总结

  • RANSAC将数据分成内点和离群点,并且从内点的最小集合中进行了估计(因为模型是从一开始采样的点中得到的,因此是最小内点的集合)

  • 通过对所有的内点进行估计来提升初始估计(eg:通过标准的最小二乘法)

  • 但是这可能会改变内点,所以交替拟合与重新分类为内点 / 离群点(迭代)

问题

  • 在很多实际情况中,离群点的比例是很大的(90%甚至以上)
  • 离群点的比例未知

大尺度图像匹配问题

每个图像块都有一个描述符,该描述符是高维空间中的一个点(eg:SIFT – 128维)

当在特征空间中有接近的点时,他们同样拥有相似的描述符,因为类似的描述符代表着雷瑟的局部特征
在这里插入图片描述

ORB-SLAM是一种基于特征点的视觉SLAM算法,它使用ORB特征点来进行特征匹配。ORB特征点是一种既能够快速检测又能够准确描述图像特征的算法。ORB特征点的检测和描述分别使用了FAST角点检测算法和BRIEF描述子算法。ORB-SLAM使用了基于词袋模型的方法来进行特征匹配,具体来说,ORB-SLAM将所有的ORB特征点分成若干个不同的视觉词汇,然后使用BoW(Bag of Words)模型来描述每个图像。在ORB-SLAM中,特征匹配主要分为两个步骤:词袋匹配和光流法匹配。词袋匹配是通过计算两个图像的词袋向量之间的距离来进行的,而光流法匹配则是通过计算两个图像中的特征点在相邻帧之间的运动来进行的。 以下是一个ORB-SLAM特征匹配算法的示例代码: ```c++ // ORB特征点检测和描述 cv::Ptr<cv::ORB> orb = cv::ORB::create(); std::vector<cv::KeyPoint> keypoints1, keypoints2; cv::Mat descriptors1, descriptors2; orb->detectAndCompute(img1, cv::noArray(), keypoints1, descriptors1); orb->detectAndCompute(img2, cv::noArray(), keypoints2, descriptors2); // 词袋匹配 cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create("BruteForce-Hamming"); std::vector<cv::DMatch> matches; matcher->match(descriptors1, descriptors2, matches); // 光流法匹配 std::vector<cv::Point2f> points1, points2; for (auto match : matches) { points1.push_back(keypoints1[match.queryIdx].pt); points2.push_back(keypoints2[match.trainIdx].pt); } std::vector<uchar> status; std::vector<float> err; cv::calcOpticalFlowPyrLK(img1, img2, points1, points2, status, err); // 输出匹配结果 for (int i = 0; i < matches.size(); i++) { if (status[i]) { cv::DMatch match = matches[i]; cv::Point2f pt1 = keypoints1[match.queryIdx].pt; cv::Point2f pt2 = keypoints2[match.trainIdx].pt; std::cout << "Match " << i << ": (" << pt1.x << ", " << pt1.y << ") -> (" << pt2.x << ", " << pt2.y << ")" << std::endl; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长命百岁️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值