From fe09c79f4be25de0ab7917296fc50aa36e7de747 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Viel Date: Tue, 16 Jun 2020 16:51:41 +0200 Subject: [PATCH 1/2] Fix the 'cvflann::anyimpl::bad_any_cast' error using Lsh --- .../flann/include/opencv2/flann/lsh_index.h | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/flann/include/opencv2/flann/lsh_index.h b/modules/flann/include/opencv2/flann/lsh_index.h index ee620dae3e..2a1f1dea20 100644 --- a/modules/flann/include/opencv2/flann/lsh_index.h +++ b/modules/flann/include/opencv2/flann/lsh_index.h @@ -60,13 +60,13 @@ struct LshIndexParams : public IndexParams { LshIndexParams(unsigned int table_number = 12, unsigned int key_size = 20, unsigned int multi_probe_level = 2) { - (* this)["algorithm"] = FLANN_INDEX_LSH; + (*this)["algorithm"] = FLANN_INDEX_LSH; // The number of hash tables to use - (*this)["table_number"] = table_number; + (*this)["table_number"] = static_cast(table_number); // The length of the key in the hash tables - (*this)["key_size"] = key_size; + (*this)["key_size"] = static_cast(key_size); // Number of levels to use in multi-probe (0 for standard LSH) - (*this)["multi_probe_level"] = multi_probe_level; + (*this)["multi_probe_level"] = static_cast(multi_probe_level); } }; @@ -94,9 +94,9 @@ public: { // cv::flann::IndexParams sets integer params as 'int', so it is used with get_param // in place of 'unsigned int' - table_number_ = (unsigned int)get_param(index_params_,"table_number",12); - key_size_ = (unsigned int)get_param(index_params_,"key_size",20); - multi_probe_level_ = (unsigned int)get_param(index_params_,"multi_probe_level",2); + table_number_ = get_param(index_params_,"table_number",12); + key_size_ = get_param(index_params_,"key_size",20); + multi_probe_level_ = get_param(index_params_,"multi_probe_level",2); feature_size_ = (unsigned)dataset_.cols; fill_xor_mask(0, key_size_, multi_probe_level_, xor_masks_); @@ -112,7 +112,7 @@ public: void buildIndex() CV_OVERRIDE { tables_.resize(table_number_); - for (unsigned int i = 0; i < table_number_; ++i) { + for (int i = 0; i < table_number_; ++i) { lsh::LshTable& table = tables_[i]; table = lsh::LshTable(feature_size_, key_size_); @@ -378,11 +378,11 @@ private: IndexParams index_params_; /** table number */ - unsigned int table_number_; + int table_number_; /** key size */ - unsigned int key_size_; + int key_size_; /** How far should we look for neighbors in multi-probe LSH */ - unsigned int multi_probe_level_; + int multi_probe_level_; /** The XOR masks to apply to a key to get the neighboring buckets */ std::vector xor_masks_; From cdac7c7bec3d1983b3a635a49d1b69cf07d0bdb7 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Viel Date: Sun, 28 Jun 2020 16:55:50 +0200 Subject: [PATCH 2/2] Add test checking we don't throw when creating GenericIndex with LshIndexParams() --- modules/flann/test/test_lshtable_badarg.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/flann/test/test_lshtable_badarg.cpp b/modules/flann/test/test_lshtable_badarg.cpp index 8fb25b44cb..f75925f659 100644 --- a/modules/flann/test/test_lshtable_badarg.cpp +++ b/modules/flann/test/test_lshtable_badarg.cpp @@ -90,4 +90,10 @@ void CV_LshTableBadArgTest::run( int /* start_from */ ) TEST(Flann_LshTable, badarg) { CV_LshTableBadArgTest test; test.safe_run(); } +TEST(Flann_LshTable, bad_any_cast) { + Mat features = Mat::ones(1, 64, CV_8U); + EXPECT_NO_THROW(flann::GenericIndex >( + features, cvflann::LshIndexParams())); +} + }} // namespace