diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6000975813f082960f579f3d3d12a54f77212d61..e564d333c679de85d2746d51720b986ab6731ffe 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -39,6 +39,8 @@ SET(sources detectors/gftt/detector_gftt_load_yaml.cpp detectors/harris/detector_harris.cpp detectors/harris/detector_harris_load_yaml.cpp + detectors/quickharris/detector_quickharris.cpp + detectors/quickharris/detector_quickharris_load_yaml.cpp detectors/sbd/detector_sbd.cpp detectors/sbd/detector_sbd_load_yaml.cpp detectors/kaze/detector_kaze.cpp @@ -126,6 +128,8 @@ SET(headers_det_gftt detectors/gftt/detector_gftt.h) SET(headers_det_harris detectors/harris/detector_harris.h) +SET(headers_det_quickharris + detectors/quickharris/detector_quickharris.h) SET(headers_det_sbd detectors/sbd/detector_sbd.h) SET(headers_det_kaze @@ -265,6 +269,7 @@ INSTALL(FILES ${headers_det_brisk} DESTINATION include/${PROJECT_NAME}/detectors INSTALL(FILES ${headers_det_mser} DESTINATION include/${PROJECT_NAME}/detectors/mser) INSTALL(FILES ${headers_det_gftt} DESTINATION include/${PROJECT_NAME}/detectors/gftt) INSTALL(FILES ${headers_det_harris} DESTINATION include/${PROJECT_NAME}/detectors/harris) +INSTALL(FILES ${headers_det_quickharris} DESTINATION include/${PROJECT_NAME}/detectors/quickharris) INSTALL(FILES ${headers_det_sbd} DESTINATION include/${PROJECT_NAME}/detectors/sbd) INSTALL(FILES ${headers_det_kaze} DESTINATION include/${PROJECT_NAME}/detectors/kaze) INSTALL(FILES ${headers_det_akaze} DESTINATION include/${PROJECT_NAME}/detectors/akaze) diff --git a/src/common_class/trifocaltensor.cpp b/src/common_class/trifocaltensor.cpp index 24c0fd52604f70aeffe8ce6d5e7093a687687064..c6e884aa16434c93483d67b1861e308dbbea1a88 100644 --- a/src/common_class/trifocaltensor.cpp +++ b/src/common_class/trifocaltensor.cpp @@ -299,41 +299,4 @@ void TrifocalTensor::transfer(const Eigen::Vector3d& p1 , Eigen::Vector3d& p2, E p3(2) = 1; } -Eigen::MatrixXd TrifocalTensor::normalizePoints(const Eigen::MatrixXd& l_in, Eigen::MatrixXd& l_out) -{ - // Centroid - Eigen::Vector3d centroid = l_in.colwise().mean(); - - // Compute norm mean - double sum_norm = 0; - for (int ii = 0; ii < l_in.rows(); ++ii ) - { - // Center the coordinates - l_out(ii,0) = l_in(ii,0)-centroid(0); - l_out(ii,1) = l_in(ii,1)-centroid(1); - l_out(ii,2) = l_in(ii,2); - sum_norm = sum_norm + l_out.block(ii,0,1,2).norm(); - } - - double mean_norm = sum_norm/l_out.rows(); - - double scale = 1.41421356237/mean_norm; - - // Isotropic scale (average distance equal to sqrt(2) ) - for (int ii = 0; ii < l_in.rows(); ++ii ) - { - l_out(ii,0) = scale*l_out(ii,0); - l_out(ii,1) = scale*l_out(ii,1); - } - - // Composition of the normalization matrix - Eigen::MatrixXd T = Eigen::MatrixXd::Identity(3,3); - T(0,0) = scale; - T(1,1) = scale; - T(0,2) = -scale*centroid(0); - T(1,2) = -scale*centroid(1); - - return T; -} - } /* namespace vision_utils */ diff --git a/src/common_class/trifocaltensor.h b/src/common_class/trifocaltensor.h index 84a29675770e02029b8fb7e46f0354f82dad81be..62a1207e06f0667818142c0c8cb2df8f8b6e8145 100644 --- a/src/common_class/trifocaltensor.h +++ b/src/common_class/trifocaltensor.h @@ -93,11 +93,6 @@ private: * \brief Get random candidates */ Eigen::VectorXd getRandomCandidates(const int& min_points, const Eigen::MatrixXd& list1, const Eigen::MatrixXd& list2, const Eigen::MatrixXd& list3, Eigen::MatrixXd& l1, Eigen::MatrixXd& l2, Eigen::MatrixXd& l3); - - -// void normalizePoints(const Eigen::MatrixXd& list1, const Eigen::MatrixXd& list2, const Eigen::MatrixXd& list3, Eigen::MatrixXd& l1, Eigen::MatrixXd& l2, Eigen::MatrixXd& l3); - Eigen::MatrixXd normalizePoints(const Eigen::MatrixXd& list1, Eigen::MatrixXd& l1); - }; } /* namespace vision_utils */ diff --git a/src/test/gtest_vision_utils.cpp b/src/test/gtest_vision_utils.cpp index 5ab8b79e2e6b75294dd41ea9cfc6cdb8033a7246..6ce0507335172b43680fe06fef8a11da32cecf46 100644 --- a/src/test/gtest_vision_utils.cpp +++ b/src/test/gtest_vision_utils.cpp @@ -241,6 +241,32 @@ TEST(VisionUtils, nextCombination) ASSERT_EQ(list[29].compare("bcde"),0); } +TEST(VisionUtils, normalizePointsIsotrop) +{ + Eigen::MatrixXd l_in(5,3); + l_in.row(0) << 1,1,1; + l_in.row(1) << 2,2,1; + l_in.row(2) << 3,3,1; + l_in.row(3) << 4,4,1; + l_in.row(4) << 5,5,1; + + // Check function result + Eigen::MatrixXd l_out(l_in); + Eigen::MatrixXd T = vision_utils::normalizePointsIsotrop(l_in,l_out); + Eigen::MatrixXd l_test = T.inverse() * l_out.transpose(); + Eigen::MatrixXd result = l_in-l_test.transpose(); + ASSERT_EQ(result.norm(),0); + + // Check result mean distances to origin is sqrt(2) + double avg_norm = 0; + for (int ii=0;ii<l_out.rows();++ii) + { + avg_norm = avg_norm + l_out.row(ii).block(0,0,1,2).norm(); + } + avg_norm = avg_norm/l_out.rows(); + ASSERT_TRUE(avg_norm-std::sqrt(2)<1e-16); +} + int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/src/vision_utils.cpp b/src/vision_utils.cpp index e478e36732b4a7e1669f4474ee1f102e20e1ddbf..dadf4b21c3d2735b6064f2e5c90922facf28906a 100644 --- a/src/vision_utils.cpp +++ b/src/vision_utils.cpp @@ -331,5 +331,43 @@ double factorial(const int& n) return fact; } +Eigen::MatrixXd normalizePointsIsotrop(const Eigen::MatrixXd& l_in, Eigen::MatrixXd& l_out) +{ + // Centroid + Eigen::Vector3d centroid = l_in.colwise().mean(); + + // Compute norm mean + double sum_norm = 0; + for (int ii = 0; ii < l_in.rows(); ++ii ) + { + // Center the coordinates + l_out(ii,0) = l_in(ii,0)-centroid(0); + l_out(ii,1) = l_in(ii,1)-centroid(1); + l_out(ii,2) = l_in(ii,2); + sum_norm = sum_norm + l_out.block(ii,0,1,2).norm(); + } + + double mean_norm = sum_norm/l_out.rows(); + + double scale = 1.41421356237/mean_norm; + + // Isotropic scale (average distance equal to sqrt(2) ) + for (int ii = 0; ii < l_in.rows(); ++ii ) + { + l_out(ii,0) = scale*l_out(ii,0); + l_out(ii,1) = scale*l_out(ii,1); + } + + // Composition of the normalization matrix + Eigen::MatrixXd T = Eigen::MatrixXd::Identity(3,3); + T(0,0) = scale; + T(1,1) = scale; + T(0,2) = -scale*centroid(0); + T(1,2) = -scale*centroid(1); + + return T; +} + + } /* namespace vision_utils */ diff --git a/src/vision_utils.h b/src/vision_utils.h index 133c5a24d53038be8a27a9b7bb648d662756aa97..937090ce098efcb0b84420b009cc7c3dce4067d7 100644 --- a/src/vision_utils.h +++ b/src/vision_utils.h @@ -240,6 +240,8 @@ bool next_combination(const Iterator first, Iterator k, const Iterator last) return false; } +Eigen::MatrixXd normalizePointsIsotrop(const Eigen::MatrixXd& list1, Eigen::MatrixXd& l1); + } /* namespace vision_utils */ #endif