使用 SIFT Detector
和 Extractor
,使用 FlannBased Matcher
,并为 设置
像这样:Dictionary
>BOWKMeansTrainer
TermCriteria termCrit(CV_TERMCRIT_ITER, 100, 0.001);
int dictionarySize = 15; // -- Same as number of images given in
int retries = 1;
int flags = KMEANS_PP_CENTERS;
BOWKMeansTrainer trainBowTrainer(dictionarySize, termCrit, retries, flags);
Clustered Extracted Keypoints 的数组大小将显示为 [128 x 15]
。
然后,当使用 BOWImgDescriptorExtractor
作为 Extractor
对一组不同的 15 张图像进行处理时,将先前提取的数组作为其 Vocabulary
,数组出现在 [15 x 15]
。
为什么?
我找不到太多关于这一切实际如何运作的信息,而只是将它放在哪里以及赋予什么值(value)。
最佳答案
如果您有 n
个图像且 k=15
,结果应始终为 [n x 15]
。
但在第一次运行中,您查看的是词汇,而不是第一张图像的特征表示。您看到的 128
是 SIFT 维度;这些是 15 个“典型”SIFT vector ;它们不是您图片的描述。
您需要阅读 BoW 模型,以及为什么结果应该是长度为 k
的 vector (可能是稀疏的,即有很多 0)图像。我的印象是您希望这种方法为每个图像生成一个 128 维特征向量。另外,k=15 可能太小了;而且训练数据集也太小了。
关于c++ - OpenCV 聚类词袋 K-Means,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27508947/