【问题标题】:Image Stitching details with OpenCV使用 OpenCV 进行图像拼接细节
【发布时间】:2014-10-14 15:28:35
【问题描述】:

我正在尝试深入缝合。我正在使用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 在这里是什么意思?官方文档似乎缺少这些细节。

【问题讨论】:

    标签: c++ opencv opencv-stitching


    【解决方案1】:

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

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

    匹配的背景

    通过在所有图像中找到兴趣点并为它们计算描述符来构建全景图。开发这些描述符,如 SIFT、SURF 和 ORB,以便可以检测到图像的相同部分。它们只是一个中等维度的向量(典型的是 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. 他们的模型中有很多变量(主要是概率)。这些值在论文中定义,没有任何理由。以下是关键句:

    虽然在实践中我们选择了 p0、p1、p(m = 0)、p(m = 1) 和 pmin 的值,但原则上它们可以从数据中学习。

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

    1. 论文在公式 13 中有置信度计算。如果读取正确,则意味着matches_info.confidence 表示两个图像之间的正确匹配,如果其值大于 1。

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

    【讨论】:

    • 如果在每对图像之间计算匹配,似乎它应该是一个 n^2 算法?真的吗?
    • 不,我不这么认为。 Iirc 使用使用孩子树的 FLANN/近似最近邻居找到匹配项。那将是 n log n。但我必须检查才能确定。阅读论文和实施文档。
    • 自动更正比那条评论更好:它当然是一个 kd-tree。
    【解决方案2】:

    浏览在线提供的 OpenCV 源代码,我认为它们的含义如下:

    • Nm - 成对匹配的数量
    • Ni - 几何一致匹配的数量
    • C - 确信两张图片来自同一张全景图

    我的假设基于来自 OpenCV 源代码版本 2.4.2 的 modules/stitching/src/motion_estimators.cppma​​tchesGraphAsString 的主体的 sn-p。即

            str << "\"" << name_src << "\" -- \"" << name_dst << "\""
                << "[label=\"Nm=" << pairwise_matches[pos].matches.size()
                << ", Ni=" << pairwise_matches[pos].num_inliers
                << ", C=" << pairwise_matches[pos].confidence << "\"];\n";
    

    此外,我还在查看detail::MatchesInfo 的文档以获取有关 NiC 术语的信息。

    【讨论】:

      猜你喜欢
      • 2013-03-07
      • 1970-01-01
      • 2012-05-30
      • 2011-08-26
      • 2012-04-14
      • 2019-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      相关资源
      最近更新 更多