diff --git a/common/include/pcl/common/point_tests.h b/common/include/pcl/common/point_tests.h index abd58c3508a..dc11edef481 100644 --- a/common/include/pcl/common/point_tests.h +++ b/common/include/pcl/common/point_tests.h @@ -69,8 +69,13 @@ namespace pcl template<> inline bool isFinite(const pcl::BRISKSignature512&) { return (true); } template<> inline bool isFinite(const pcl::BorderDescription &) { return true; } template<> inline bool isFinite(const pcl::Boundary&) { return (true); } + template<> inline bool isFinite(const pcl::CPPFSignature&) { return (true); } template<> inline bool isFinite(const pcl::ESFSignature640&) { return (true); } template<> inline bool isFinite(const pcl::FPFHSignature33&) { return (true); } + template<> inline bool isFinite(const pcl::GASDSignature512&) { return (true); } + template<> inline bool isFinite(const pcl::GASDSignature984&) { return (true); } + template<> inline bool isFinite(const pcl::GASDSignature7992&) { return (true); } + template<> inline bool isFinite(const pcl::GRSDSignature21&) { return (true); } template<> inline bool isFinite(const pcl::Intensity&) { return (true); } template<> inline bool isFinite(const pcl::IntensityGradient&) { return (true); } template<> inline bool isFinite(const pcl::Label&) { return (true); } @@ -79,7 +84,12 @@ namespace pcl template<> inline bool isFinite(const pcl::PFHRGBSignature250&) { return (true); } template<> inline bool isFinite(const pcl::PFHSignature125&) { return (true); } template<> inline bool isFinite(const pcl::PPFRGBSignature&) { return (true); } - template<> inline bool isFinite(const pcl::PPFSignature&) { return (true); } + + template<> inline bool isFinite(const pcl::PPFSignature& pt) + { + return std::isfinite(pt.f1) && std::isfinite(pt.f2) && std::isfinite(pt.f3) && std::isfinite(pt.f4) && std::isfinite(pt.alpha_m); + } + template<> inline bool isFinite(const pcl::PrincipalCurvatures&) { return (true); } template<> inline bool isFinite(const pcl::PrincipalRadiiRSD&) { return (true); } template<> inline bool isFinite(const pcl::RGB&) { return (true); } diff --git a/registration/include/pcl/registration/impl/pyramid_feature_matching.hpp b/registration/include/pcl/registration/impl/pyramid_feature_matching.hpp index 7e0cf749311..ad5f4a725ed 100644 --- a/registration/include/pcl/registration/impl/pyramid_feature_matching.hpp +++ b/registration/include/pcl/registration/impl/pyramid_feature_matching.hpp @@ -42,6 +42,7 @@ #ifndef PCL_REGISTRATION_IMPL_PYRAMID_FEATURE_MATCHING_H_ #define PCL_REGISTRATION_IMPL_PYRAMID_FEATURE_MATCHING_H_ +#include // for pcl::isFinite #include #include @@ -309,6 +310,9 @@ PyramidFeatureHistogram::compute() for (const auto& point : *input_) { std::vector feature_vector; + // NaN is converted to very high number that gives out of bound exception. + if (!pcl::isFinite(point)) + continue; convertFeatureToVector(point, feature_vector); addFeature(feature_vector); } diff --git a/test/registration/test_registration.cpp b/test/registration/test_registration.cpp index 045fb2eebce..2c33e690cd6 100644 --- a/test/registration/test_registration.cpp +++ b/test/registration/test_registration.cpp @@ -694,7 +694,7 @@ TEST (PCL, PyramidFeatureHistogram) pyramid_target->compute (); float similarity_value = PyramidFeatureHistogram::comparePyramidFeatureHistograms (pyramid_source, pyramid_target); - EXPECT_NEAR (similarity_value, 0.74101555347442627, 1e-4); + EXPECT_NEAR (similarity_value, 0.738492727, 1e-4); std::vector > dim_range_target2; for (std::size_t i = 0; i < 3; ++i) dim_range_target2.emplace_back(static_cast (-M_PI) * 5.0f, static_cast (M_PI) * 5.0f); @@ -707,7 +707,7 @@ TEST (PCL, PyramidFeatureHistogram) pyramid_target->compute (); float similarity_value2 = PyramidFeatureHistogram::comparePyramidFeatureHistograms (pyramid_source, pyramid_target); - EXPECT_NEAR (similarity_value2, 0.80097091197967529, 1e-4); + EXPECT_NEAR (similarity_value2, 0.798465133, 1e-4); std::vector > dim_range_target3; @@ -721,7 +721,7 @@ TEST (PCL, PyramidFeatureHistogram) pyramid_target->compute (); float similarity_value3 = PyramidFeatureHistogram::comparePyramidFeatureHistograms (pyramid_source, pyramid_target); - EXPECT_NEAR (similarity_value3, 0.87623238563537598, 1e-3); + EXPECT_NEAR (similarity_value3, 0.873699546, 1e-3); } // Suat G: disabled, since the transformation does not look correct.