7

I am trying to get deep into stitching. I am using cv::detail.

I am trying to follow this example:

I roughly understand the stitching pipeline.

there is a function matchesGraphAsString() which return a graph. I am wondering how does it even compute this graph. Further, what is the dfination of confidence interval in this case.

The output is in DOT format and a sample graph looks like

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"];
}

What does label, Nm, and Ni mean here? The official document seems to be lacking these details.

4

2 回答 2

7

这确实是一个非常有趣的问题。正如@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;

提到的论文 在第 3.2 节(“图像匹配验证的概率模型”)中有更多关于这意味着什么的细节。

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

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

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

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

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

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

于 2014-10-17T20:38:10.493 回答
2

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

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

我的假设基于OpenCV 源代码版本 2.4.2中modules/stitching/src/motion_estimators.cpp中matchGraphAsString正文的片段。IE

        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术语的信息。

于 2014-10-17T18:56:06.523 回答