Flann descriptor save and load doesn't work
void testSaveAndLoad(Mat descriptors, string outputFile) { vector<string> images; flann::LshIndexParams lshIndexParams(20,10,2); flann::Index kdtree(descriptors, lshIndexParams, cvflann::FLANN_DIST_HAMMING); cout << "outputting index file to disk: " << "\n"; // just to check whether loaded ones are same or similar writeMatToFile(descriptors, "before_save.dat"); kdtree.save(outputFile); // saving done .. now load Mat mat = Mat(descriptors.rows, descriptors.cols, CV_8UC1); // read saved indices flann::Index kdtree1(mat, flann::SavedIndexParams(outputFile), cvflann::FLANN_DIST_HAMMING); writeMatToFile(mat, "after_save.dat"); cout << "Loaded mat of size " << mat.rows << " " << mat.cols << "\n"; // prepare to output indices and distances Mat indices = Mat(descriptors.rows, 2, CV_32S); Mat dists = Mat(descriptors.rows, 2, CV_32S); kdtree1.knnSearch(descriptors, indices, dists, 2); }
before_save.dat: %YAML:1.0 mat: !!opencv-matrix rows: 6342 cols: 61 dt: u data: [ 1, 0, 140, 7, 1, 238, 55, 0, 0, 0, 0, 0, 0, 0, 0, 128, 25, 122, 134, 6, 0, 0, 240, 248, 227, 1, 3, 227, 249, 255, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 128, 48, 230, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 25, 59, 243, 51, 6, 16, 64, 252, 255, 199, 16, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 192, 14, 160, 3, 112, 0, 7, 16, 0, 0, 0, 0, 0, 0, 254, 63, ......... after_save.dat: %YAML:1.0 mat: !!opencv-matrix rows: 6342 cols: 61 dt: u data: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, .......
And knnSearch throws segfaults during the matching.
Thanks
imho, there's little a flaw in your democode:
see, mat there is an InputArray only, you can't expect it to update, so saving it after constructing the index does not make any sense.
(it still crashes in knnSearch)
Yes I agree. That was another issue with this API. How can they expect user to know the size of Mat without loading that file. The API should take care of this. Temporary fix is :
Linked bug and temporary fix: http://code.opencv.org/issues/3720