我对 OpenCV 或 SIFT 功能不太熟悉,但这应该足够通用,对所有编程语言都有用。我还将在下面仅描述 BoW 方法。
假设我们有N 图像。对于每个图像i,我们有F 个特征数,每个特征有D 个维度。我们可以把所有的特征放到一个数组feats,这样就变成了这样:
[1, 2, ..., D]
[..., ..., ..., D]
[N*F, ..., ..., D]
feats 的每一行都是一个特征,有D 个维度,我们一共有N*F 个特征。
在 k-means 中,我们采用所有这些特征并将它们分组到 k 集群中。因此,每一个特征都被分配给一个集群。大多数 k-means 函数通常会返回大小为 k x D 的矩阵 C,它表示集群的质心。这个矩阵C 是 k-means 算法的“码本”或“字典”。有些还返回一个大小为N*F 的向量,它显示每个特征被分配到哪个集群(在OpenCv 中,这由此链接中的labels 变量表示:http://www.developerstation.org/2012/01/kmeans-clustering-in-opencv-with-c.html)。
由于我们已经有了所有特征的分配,每个图像i 都有F 特征,可以简单地用它们所属的聚类来表示。例如,如果原始图像表示为
[1, 2, ..., D]
[..., ..., ..., D]
[F, ..., ..., D]
那么图像也可以简单地表示为向量:
[1] % Assignment of feature 1
[...]
[F] % Assignment of feature F
因此,您可以采用此向量并形成所表示的集群的直方图h。此直方图是图像的特征向量,您可以稍后在 SVM 中使用。
附:如果您需要任何进一步的说明和/或示例,请告诉我!