#include #include #include #include #include #include #include constexpr float lrf_radius = 0.04f; constexpr float shot_search_radius = 0.04f; constexpr float uniform_sampling_radius = 0.03f; static void BM_SHOT352(benchmark::State& state, const std::string& file) { pcl::PointCloud::Ptr cloud(new pcl::PointCloud); pcl::PCDReader reader; reader.read(file, *cloud); pcl::NormalEstimationOMP ne; ne.setInputCloud(cloud); ne.setKSearch(10); pcl::PointCloud::Ptr normals(new pcl::PointCloud); ne.compute(*normals); pcl::UniformSampling uniform_sampling; uniform_sampling.setInputCloud(cloud); uniform_sampling.setRadiusSearch(uniform_sampling_radius); pcl::PointCloud::Ptr keypoints(new pcl::PointCloud); uniform_sampling.filter(*keypoints); pcl::SHOTEstimation shot; shot.setInputCloud(keypoints); shot.setInputNormals(normals); shot.setSearchSurface(cloud); shot.setRadiusSearch(shot_search_radius); shot.setLRFRadius(lrf_radius); pcl::PointCloud::Ptr output(new pcl::PointCloud); for (auto _ : state) { shot.compute(*output); } } static void BM_SHOT352_OMP(benchmark::State& state, const std::string& file) { pcl::PointCloud::Ptr cloud(new pcl::PointCloud); pcl::PCDReader reader; reader.read(file, *cloud); pcl::NormalEstimationOMP ne; ne.setInputCloud(cloud); ne.setKSearch(10); pcl::PointCloud::Ptr normals(new pcl::PointCloud); ne.compute(*normals); pcl::UniformSampling uniform_sampling; uniform_sampling.setInputCloud(cloud); uniform_sampling.setRadiusSearch(uniform_sampling_radius); pcl::PointCloud::Ptr keypoints(new pcl::PointCloud); uniform_sampling.filter(*keypoints); pcl::SHOTEstimationOMP shot( 0, state.range(0) // ); shot.setInputCloud(keypoints); shot.setInputNormals(normals); shot.setSearchSurface(cloud); shot.setRadiusSearch(shot_search_radius); shot.setLRFRadius(lrf_radius); pcl::PointCloud::Ptr output(new pcl::PointCloud); for (auto _ : state) { shot.compute(*output); } } static void BM_SHOT1344(benchmark::State& state, const std::string& file) { pcl::PointCloud::Ptr cloud_rgba( new pcl::PointCloud); pcl::PCDReader reader; reader.read(file, *cloud_rgba); pcl::NormalEstimationOMP ne; ne.setInputCloud(cloud_rgba); ne.setKSearch(10); pcl::PointCloud::Ptr normals(new pcl::PointCloud); ne.compute(*normals); pcl::UniformSampling uniform_sampling; uniform_sampling.setInputCloud(cloud_rgba); uniform_sampling.setRadiusSearch(uniform_sampling_radius); pcl::PointCloud::Ptr keypoints( new pcl::PointCloud); uniform_sampling.filter(*keypoints); pcl::SHOTColorEstimation shot(true, true); shot.setInputCloud(keypoints); shot.setInputNormals(normals); shot.setSearchSurface(cloud_rgba); shot.setRadiusSearch(shot_search_radius); shot.setLRFRadius(lrf_radius); pcl::PointCloud::Ptr output(new pcl::PointCloud); for (auto _ : state) { shot.compute(*output); } } static void BM_SHOT1344_OMP(benchmark::State& state, const std::string& file) { pcl::PointCloud::Ptr cloud_rgba( new pcl::PointCloud); pcl::PCDReader reader; reader.read(file, *cloud_rgba); pcl::NormalEstimationOMP ne; ne.setInputCloud(cloud_rgba); ne.setKSearch(10); pcl::PointCloud::Ptr normals(new pcl::PointCloud); ne.compute(*normals); pcl::UniformSampling uniform_sampling; uniform_sampling.setInputCloud(cloud_rgba); uniform_sampling.setRadiusSearch(uniform_sampling_radius); pcl::PointCloud::Ptr keypoints( new pcl::PointCloud); uniform_sampling.filter(*keypoints); pcl::SHOTColorEstimationOMP shot( true, true, 0, state.range(0)); shot.setInputCloud(keypoints); shot.setInputNormals(normals); shot.setSearchSurface(cloud_rgba); shot.setRadiusSearch(shot_search_radius); shot.setLRFRadius(lrf_radius); pcl::PointCloud::Ptr output(new pcl::PointCloud); for (auto _ : state) { shot.compute(*output); } } int main(int argc, char** argv) { if (argc < 2) { std::cerr << "No test files given. Please provide a PCD file path to use for " "both SHOT352 and SHOT1344 benchmarks." << std::endl; return (-1); } constexpr int runs = 100; benchmark::RegisterBenchmark("BM_SHOT352", &BM_SHOT352, argv[1]) ->Unit(benchmark::kMillisecond) ->Iterations(runs); benchmark::RegisterBenchmark("BM_SHOT352_OMP", &BM_SHOT352_OMP, argv[1]) ->Arg(64) ->Arg(128) ->Arg(256) ->Unit(benchmark::kMillisecond) ->Iterations(runs); benchmark::RegisterBenchmark("BM_SHOT1344", &BM_SHOT1344, argv[1]) ->Unit(benchmark::kMillisecond) ->Iterations(runs); benchmark::RegisterBenchmark("BM_SHOT1344_OMP", &BM_SHOT1344_OMP, argv[1]) ->Arg(64) ->Arg(128) ->Arg(256) ->Unit(benchmark::kMillisecond) ->Iterations(runs); benchmark::Initialize(&argc, argv); benchmark::RunSpecifiedBenchmarks(); }