/////////////////////////////////////////////////////////////////////////////////////////
| 64 | |
| 65 | ////////////////////////////////////////////////////////////////////////////////////////////// |
| 66 | TEST (PCL, SIFTKeypoint) |
| 67 | { |
| 68 | PointCloud<KeypointT> keypoints; |
| 69 | |
| 70 | // Compute the SIFT keypoints |
| 71 | SIFTKeypoint<PointXYZI, KeypointT> sift_detector; |
| 72 | search::KdTree<PointXYZI>::Ptr tree (new search::KdTree<PointXYZI>); |
| 73 | sift_detector.setSearchMethod (tree); |
| 74 | sift_detector.setScales (0.02f, 5, 3); |
| 75 | sift_detector.setMinimumContrast (0.03f); |
| 76 | |
| 77 | sift_detector.setInputCloud (cloud_xyzi); |
| 78 | sift_detector.compute (keypoints); |
| 79 | |
| 80 | ASSERT_EQ (keypoints.width, keypoints.size ()); |
| 81 | ASSERT_EQ (keypoints.height, 1); |
| 82 | EXPECT_EQ (keypoints.size (), static_cast<std::size_t> (169)); |
| 83 | EXPECT_EQ (keypoints.header, cloud_xyzi->header); |
| 84 | EXPECT_EQ (keypoints.sensor_origin_ (0), cloud_xyzi->sensor_origin_ (0)); |
| 85 | EXPECT_EQ (keypoints.sensor_origin_ (1), cloud_xyzi->sensor_origin_ (1)); |
| 86 | EXPECT_EQ (keypoints.sensor_origin_ (2), cloud_xyzi->sensor_origin_ (2)); |
| 87 | EXPECT_EQ (keypoints.sensor_origin_ (3), cloud_xyzi->sensor_origin_ (3)); |
| 88 | EXPECT_EQ (keypoints.sensor_orientation_.w (), cloud_xyzi->sensor_orientation_.w ()); |
| 89 | EXPECT_EQ (keypoints.sensor_orientation_.x (), cloud_xyzi->sensor_orientation_.x ()); |
| 90 | EXPECT_EQ (keypoints.sensor_orientation_.y (), cloud_xyzi->sensor_orientation_.y ()); |
| 91 | EXPECT_EQ (keypoints.sensor_orientation_.z (), cloud_xyzi->sensor_orientation_.z ()); |
| 92 | |
| 93 | // Change the values and re-compute |
| 94 | sift_detector.setScales (0.05f, 5, 3); |
| 95 | sift_detector.setMinimumContrast (0.06f); |
| 96 | sift_detector.compute (keypoints); |
| 97 | |
| 98 | ASSERT_EQ (keypoints.width, keypoints.size ()); |
| 99 | ASSERT_EQ (keypoints.height, 1); |
| 100 | |
| 101 | // Compare to previously validated output |
| 102 | constexpr std::size_t correct_nr_keypoints = 5; |
| 103 | const float correct_keypoints[correct_nr_keypoints][4] = |
| 104 | { |
| 105 | // { x, y, z, scale } |
| 106 | {-0.9425f, -0.6381f, 1.6445f, 0.0794f}, |
| 107 | {-0.5083f, -0.5587f, 1.8519f, 0.0500f}, |
| 108 | { 1.0265f, 0.0500f, 1.7154f, 0.1000f}, |
| 109 | { 0.3005f, -0.3007f, 1.9526f, 0.2000f}, |
| 110 | {-0.1002f, -0.1002f, 1.9933f, 0.3175f} |
| 111 | }; |
| 112 | |
| 113 | ASSERT_EQ (keypoints.size (), correct_nr_keypoints); |
| 114 | for (std::size_t i = 0; i < correct_nr_keypoints; ++i) |
| 115 | { |
| 116 | EXPECT_NEAR (keypoints[i].x, correct_keypoints[i][0], 1e-4); |
| 117 | EXPECT_NEAR (keypoints[i].y, correct_keypoints[i][1], 1e-4); |
| 118 | EXPECT_NEAR (keypoints[i].z, correct_keypoints[i][2], 1e-4); |
| 119 | EXPECT_NEAR (keypoints[i].scale, correct_keypoints[i][3], 1e-4); |
| 120 | } |
| 121 | |
| 122 | } |
| 123 |
nothing calls this directly
no test coverage detected