gpt4 book ai didi

c++ - 使用 OpenCV 的图像拼接细节

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:51 29 4
gpt4 key购买 nike

我正在尝试深入缝合。我正在使用 cv::detail

我正在尝试关注 this example :

拼接流水线大致了解

有一个返回图形的函数 matchesGraphAsString()。我想知道它是如何计算这张图的。此外,在这种情况下,置信区间的定义是什么。

输出为 DOT 格式,示例图如下所示

graph matches_graph{
"15.jpg" -- "13.jpg"[label="Nm=75, Ni=50, C=1.63934"];
"15.jpg" -- "12.jpg"[label="Nm=47, Ni=28, C=1.26697"];
"15.jpg" -- "14.jpg"[label="Nm=149, Ni=117, C=2.22011"];
"11.jpg" -- "13.jpg"[label="Nm=71, Ni=52, C=1.77474"];
"11.jpg" -- "9.jpg"[label="Nm=46, Ni=37, C=1.69725"];
"11.jpg" -- "10.jpg"[label="Nm=87, Ni=73, C=2.14076"];
"9.jpg" -- "8.jpg"[label="Nm=122, Ni=99, C=2.21973"];
}

labelNmNi 在这里是什么意思?官方文档似乎缺少这些细节。

最佳答案

这确实是一个非常有趣的问题。正如@hatboyzero 指出的那样,变量的含义相当简单:

  • Nm 是匹配的数量(在重叠区域,因此已经去除了明显的异常值)。
  • Ni 是找到与 Ransac 的单应性后的​​内点数.
  • C 是两张图片匹配的置信度。

匹配背景

通过在所有图像中找到兴趣点并为它们计算描述符来构建全景图。这些描述符,如 SIFT、SURF 和 ORB,是为了检测图像的相同部分而开发的。它们只是一个中维 vector (通常为 64 或 128 维)。通过计算两个描述符之间的 L2 或其他距离,可以找到匹配项。术语 Nm 描述了在一对图像中找到多少匹配项。

请注意,到目前为止,匹配仅通过兴趣点周围图像区域的外观 完成。通常,这些匹配中的许多都是完全错误的。这可能是因为描述符看起来相同(想想:重复的对象,例如多窗建筑物上的窗台,或树上的叶子)或者因为描述符的信息量太少。

常见的解决方案是添加几何约束:图像对是使用同一相机从相同位置拍摄的,因此在一个图像中靠近的点在另一幅图像中也必须靠近.更具体地说,所有的点都必须经过相同的转换。在相机围绕相机镜头系统的节点旋转的全景情况下,这种变换一定是二维单应性。

Ransac 是寻找最佳转换以及与此转换一致的所有匹配项的黄金标准算法。这些一致匹配的数量称为 Ni。在这种情况下,Ransac 的工作原理是随机选择 4 个匹配项(参见论文第 3.1 节)并为这四个匹配项拟合单应性。然后,计算所有可能的匹配项中有多少匹配项符合此单应性。重复 500 次(见论文),最后选择具有最多内点的模型。然后重新计算包含所有内点的模型。算法名称来源于RANdom SAmple Consensus:RanSaC。

置信度

我的问题是,关于这种神秘的自信。我很快找到了它的计算位置。

来自 stitching/sources/matches.cpp :

// These coeffs are from paper M. Brown and D. Lowe. "Automatic Panoramic Image Stitching
// using Invariant Features"
matches_info.confidence = matches_info.num_inliers / (8 + 0.3 * matches_info.matches.size());

// Set zero confidence to remove matches between too close images, as they don't provide
// additional information anyway. The threshold was set experimentally.
matches_info.confidence = matches_info.confidence > 3. ? 0. : matches_info.confidence;

mentioned paper在第 3.2 节(“图像匹配验证的概率模型”)中有更多关于这意味着什么的详细信息。

阅读本节,有几件事很突出。

  1. 他们的模型中有很多变量(主要是概率)。这些值在论文中定义,没有任何理由。下面是关键句:

Though in practice we have chosen values for p0, p1, p(m = 0), p(m = 1) and pmin, they could in principle be learnt from the data.

因此,这只是一个理论练习,因为参数是凭空提取的。请注意,原则上可以学习

  1. 论文在等式 13 中进行了置信度计算。如果阅读正确,则意味着 matches_info.confidence 表示两张图像之间的正确匹配,前提是其值大于 1。

  2. 当置信度高于 3 时,我看不出有任何理由删除匹配项(将置信度设置为 0)。这仅意味着异常值非常少。我认为程序员认为大量的匹配被证明是离群值意味着图像重叠很多,但这不是由背后的算法提供的。 (简单地说,匹配是基于特征的外观。)

关于c++ - 使用 OpenCV 的图像拼接细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26364594/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com