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-两张图像来自同一全景
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;