什么是 openCV features2D 中的`query`和`train`
Posted
技术标签:
【中文标题】什么是 openCV features2D 中的`query`和`train`【英文标题】:What is `query` and `train` in openCV features2D 【发布时间】:2012-06-01 15:57:24 【问题描述】:在features2D
类的任何地方,我都能看到术语query
和train
。例如matches
有trainIdx
和queryIdx
,而Matchers
有train()
方法。
我知道英文train
和query
这两个词的定义,但是我看不懂这个属性或方法的含义。
附:我明白,这是个非常愚蠢的问题,但也许是因为英语不是我的母语。
【问题讨论】:
【参考方案1】:为了完成sansuiso的回答,我想选择这些名称的原因应该是在某些应用程序中我们事先有一组图像(训练图像),例如在您的办公室内拍摄的10张图像。可以提取特征并且可以为这些图像计算特征描述符。并在运行时将图像提供给系统以查询经过训练的数据库。因此查询图像是指该图像。我真的不喜欢他们命名这些参数的方式。如果您有一对立体图像并且想要匹配特征,这些名称没有意义,但您必须选择一个约定,即始终将左侧图像称为查询图像,将右侧图像称为训练图像。我在计算机视觉方面获得了博士学位,OpenCV 中的一些命名约定对我来说似乎真的很混乱/愚蠢。因此,如果您发现这些令人困惑或愚蠢,您并不孤单。
【讨论】:
更简单地说,train 是你事先学习的图像(提取的特征),query 是你试图与训练的图像匹配的图像。 我以前用另一种方式称呼这些东西:我将train
称为ethalon
,将query
称为sample
。
@Shambool,我有一个问题,看起来很傻,但让我很困惑。如果我将 2 个 trainDescripters trainA 和 trainB 放入 flann matcher 进行火车。然后是查询图像queryC,是否会使用queryC对trainA和trainB执行匹配算法?
同意,愚蠢的名字。最好是srcIdx
、dstIdx
或firstIdx
、secondIdx
。【参考方案2】:
我以一种非常幼稚但有用的方式理解“查询”和“训练”: “train”:对数据或图像进行预处理以获取数据库 “查询”:将在我们之前训练的数据库中查询的输入数据或图像。 希望对你也有帮助。
【讨论】:
这不是天真,就是这样。或者它应该是什么......这意味着一个单一的火车点可以分配给多个查询点,一方面。您也可以分配所有查询点,但可能永远不会分配一些火车点。【参考方案3】:train
:此函数构建分类器内部状态以使其可操作。例如,考虑训练一个 SVM,或者从参考数据构建一个 kd-tree。也许您会感到困惑,因为这一步在文献中通常被称为学习。
query
是查找一组点的最近邻居的操作,并且通过扩展它还指您想要最近邻居的整个点集。回想一下,您可以在同一个函数调用中(通过将特征点堆叠在矩阵中)询问 1 个点的邻居,或一大堆。
trainIdx
和queryIdx
分别指参考/查询集中的品脱索引,即您向匹配器询问最近的点(存储在trainIdx
位置)到其他点(存储在queryIdx
位置)。当然,trainIdx
在函数调用之后是已知的。如果您的点存储在矩阵中,则索引将是所考虑特征的行。
【讨论】:
这个答案清楚地表明 trainIdx 和 queryIdx 分别指的是第一个和第二个(描述符/关键点)集。 @GregKramida 我认为情况正好相反。当使用matcher.match(descriptors1, descriptors2, matches)
获得匹配时,queryIdx
将索引到keypoints1
和trainIdx
到keypoints2
。参考文献***.com/a/13320083/2397253
@oarfish,是的,你是对的。我想知道我是否应该删除评论,以免混淆任何人。
@greg "First" 和 "second" 在什么参考框架中?在 knnMatch 方法中,第一个参数是查询,第二个是火车:docs.opencv.org/3.2.0/db/d39/…
@dividebyzero,是的。以上是关于什么是 openCV features2D 中的`query`和`train`的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV - 编译器找不到 features2d.hpp 的 drawKeypoints?
OpenCV使用二维特征点(Features2D)和单映射(Homography)寻找已知物体