我正在尝试使用 kmeans 函数对关键点(使用 SIFT 检测到)进行聚类,但我无法让它准备好使用。
使用以下代码将关键点保存到 xml/yml 文件中:
int _tmain(int argc, _TCHAR* argv[])
{
Mat img;
img = imread("c:\\box.png", 0);
SiftFeatureDetector detector;
vector<KeyPoint> keypoints;
detector.detect(img, keypoints);
FileStorage fs("keypoint1.xml", FileStorage::WRITE);
write(fs, "keypoints1", keypoints);
fs.release();
xml 保存用空格分隔的关键点,yml 使用逗号分隔关键点。
%YAML:1.0
keypoints1: [ 6.1368021965026855e+000, 5.2649226188659668e+000,
4.0740542411804199e+000, 2.7943280029296875e+002, 0., 9109760, -1,
6.1368021965026855e+000, 5.2649226188659668e+000,
4.0740542411804199e+000, 3.4678604125976562e+002, 0., 9109760, -1,
1.5903041076660156e+002, 2.4698186874389648e+001,
4.1325736045837402e+000, 9.7977493286132813e+001, 0., 10158336, -1,
1.6808378601074219e+002, 2.5029441833496094e+001,
4.2399377822875977e+000, 9.7380126953125000e+001, 0., 11993344, -1,
1.9952423095703125e+002, 4.4663669586181641e+001,
5.0049328804016113e+000, 5.7439949035644531e+001, 0., 7275008, -1,
3.0947158813476563e+002, 4.6865818023681641e+001,......................
kmeans函数要求每个样本输入一行。有人可以解释一下吗,我的意思是上述文件可以用作单行吗?它是否符合使用 FileStorage 读取方法的 kmeans 条件?
我想添加和读取文件的原因是假设我有 100 个关键点需要聚类的图像。我想将所有这些文件附加到一个巨大的文件中并将其聚集在一起。
谢谢