我正在尝试这个简单的测试来检查我是否可以将预先填充的索引存储到文件中并在以后加载它们。保存和加载的垫子是不同的。此外,knnSearch在匹配期间抛出段错误。我只在使用LSHIndexParams(用于二进制特征)时才看到这个问题。
void flannSaveAndLoadTest(Mat descriptor) {
// construct an index
flann::LshIndexParams lshIndexParams(20,10,2);
flann::Index kdtree(descriptor, lshIndexParams, cvflann::FLANN_DIST_HAMMING);
// save descriptors to file
writeMatToFile(descriptor, "before_index_save.dat");
// save index to file
kdtree.save("index.dat");
// load index from file
Mat mat = Mat(descriptor.rows, descriptor.cols, CV_8UC1);
flann::Index kdtree1(mat, flann::SavedIndexParams("index.dat"), cvflann::FLANN_DIST_HAMMING);
// save loaded mat
writeMatToFile(mat, "after_index_save.dat");
// search in this tree
Mat dists = Mat(descriptor.rows, 2, CV_32S);
Mat indices = Mat(descriptor.rows, 3, CV_32S);
kdtree1.knnSearch(descriptor, indices, dists, 2);
}
before_index_save:
%YAML:1.0 mat: !!opencv-matrix rows: 60 cols: 32 dt: u data: [ 10, 157, 16, 137, 81, 214, 178, 39, 45, 5, 74, 1, 172, 30, 38, 196, 144, 59, 131, 33, 84, 152, 17, 223, 39, 52, 10, 67, 18, 6, 141, 206, 11, 91, 50, 141, 119, 86, 190, 48, 45, 76, 94, 167, 236, 30, 183, 228, 246, 125, 151, 231, 197, 144, 49, 236, 39, 125, 138, 131, 14, 63, 61, 223, 15, 95, 35, 135, 119, 30, 190, 168, 45, 232, 91, 231, 204, 94, 159, 228, 246, 93, 147, 231, 197, 144, 125, 238, 38, 60, 143, 135, 14, 55, 57, 213, 10, 149, 16, 129, 81, 214, 178, 39, 45, 5, 74, 1, 172, 30, 6, 196, 144, 27, 131, 33, 22, 152, 17, 207, 39, 52, 10, 67, 18, 6, 141, 206, 124, 236, 196, 30, 137, 161, 70, 207, 210, 179, 169, 24, 99, 225, 105, 158, 9, 226, 104, 26, 58, 111, 142, 51, 184, 134, 85, 124, 243, 123, 210, 8, 10, 0, 16, 129, 81, 214, 176, 3, 45, 5, 66, 1, 140, 30, 38, 196, 128, 25, 131, 1, 4, 152, 17, 196, 7, 20, 26, 67, 2, 4, 13, 206, 244, 172, 157, 122, 137, 237, 69, 206, 210, 179, 161, 24, 115, 241, 73, 27, 9, 226, 104, 26, 58, 111, 218, 51, 217, 131, 85, 124, 240, 121, 198, 34, 197, 36, 157, 103, 128, 46, 103, 184, 112, 162, 43, 88, 215, 115, 9, 123, 17, 68, 104, 106, 49, 212, 217, 10, 237, 166, 101, 20, 192, 115, 2, 32, 252, 188, 189, 118, 137, 124, 85, 158, 179, 247, 166, 24, 223, 247, 75, 59, 129, 214, 236, 26, 56, 103, 251, 32, 219, 251, 85, 63, 194, 113, 198, 114, 196, 64, 157, 39, 1, 78, 38, 8, 40, 178, 35, 8, 214, 115, 73, 27, 144, 84, 104, 98, 96, 212, 217, 8, 197, 178, 65, 20, 0, 115, 3, 34, 11, 91, 50, 141, 119, 86, 191, 48, 13, 76, 94, 167, 236, 30, 183, 228, 246, 125,
after_index_save:
%YAML:1.0 mat: !!opencv-matrix rows: 60 cols: 32 dt: u data: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 100, 101, 120, 95, 115, 97, 118, 101, 46, 100, 97, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 0, 0, 152, 169, 51, 241, 97, 127, 0, 0, 152, 169, 51, 241, 97, 127, 0, 0, 0, 0, 0, 0, 98, 101, 102, 111, 114, 101, 95, 105, 110, 100, 101, 120, 95, 115, 97, 118, 101, 46, 100, 97, 116, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 176, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 188, 45, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,