C++ OpenCV图像拼接细节

C++ OpenCV图像拼接细节,c++,opencv,opencv-stitching,C++,Opencv,Opencv Stitching,我正在努力深入缝纫。我正在使用cv::detail 我试着遵循: 我大致了解缝合管道 有一个函数matchesgraphastring(),它返回一个图形。我想知道它是如何计算这张图的。此外,在这种情况下,置信区间的定义是什么 输出为点格式,示例图形如下所示 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=

我正在努力深入缝纫。我正在使用
cv::detail

我试着遵循:

我大致了解缝合管道

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

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

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

label
Nm
Ni
在这里是什么意思?官方文件似乎缺少这些细节。

浏览一下在线提供的OpenCV源代码,我想它们的意思如下:

  • Nm-成对匹配数
  • Ni-几何一致匹配的数量
  • C-两张图像来自同一全景
我的假设基于OpenCV源代码版本2.4.2中的matchesgraphastring主体的一个片段。即

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

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

  • Nm是匹配数(在重叠区域中,因此明显的异常值已被删除)
  • Ni是找到单应性后的内联线数
  • C是两张图像匹配的信心
背景匹配 通过在所有图像中找到兴趣点并计算它们的描述符来构建全景图。这些描述符,如SIFT、SURF和ORB,是为了能够检测到图像的相同部分而开发的。它们只是一个中等维向量(典型的是64或128维)。通过计算两个描述符之间的L2或其他距离,可以找到匹配项。在一对图像中找到多少匹配项由术语Nm描述

请注意,到目前为止,仅通过兴趣点周围图像区域的外观进行匹配。非常典型的是,这些匹配中的许多都是完全错误的。这可能是因为描述符看起来是一样的(想想:重复的对象,比如多窗口建筑上的窗台,或者树上的叶子),或者是因为描述符太缺乏信息

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

Ransac是寻找最佳变换和与此变换一致的所有匹配的金标准算法。这些一致匹配的数量称为Ni。Ransac在这种情况下通过随机选择4个匹配项(见论文第3.1节)并对这四个匹配项进行单应性拟合来工作。然后,计算所有可能匹配中有多少匹配符合此单应性。重复500次(见图纸),最后取内胆最多的模型。然后,使用所有入口重新计算模型。该算法的名称来自随机样本共识:RanSaC

置信项 我的问题是,关于这种神秘的自信。我很快就找到了计算的地方

发件人:

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

读这一节,有几件事很突出

  • 他们的模型中有很多变量(主要是概率)。这些值在文件中定义,没有任何理由。以下是关键句子:
  • 虽然在实践中,我们选择了p0、p1、p(m=0)、p(m=1)和pmin的值,但原则上可以从数据中学习它们

    所以,这只是一个理论练习,因为参数是从稀薄的空气中提取出来的。请注意,原则上可以学习

  • 本文在等式13中给出了置信度计算。如果读取正确,则表示
    匹配信息。置信度
    表示当其值大于1时,两个图像之间的匹配正确

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


  • 如果在每对图像之间计算匹配,那么它应该是一个n^2算法?真的吗?不,我不这么认为。Iirc使用使用kid树的FLANN/近似最近邻查找匹配。那就是n log n。但我必须检查一下才能确定。阅读本文和实施文档。Autocorrect从中获益匪浅:它当然是一个kd树。
    // 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;