|
@@ -1,17 +1,24 @@
|
|
#include <librealsense2/rs.hpp>
|
|
#include <librealsense2/rs.hpp>
|
|
#include <iostream>
|
|
#include <iostream>
|
|
|
|
+#include <pcl/io/ply_io.h>
|
|
|
|
+#include <pcl/point_types.h>
|
|
|
|
+#include "pcl-converter.hpp"
|
|
|
|
|
|
-void update_data_and_save(rs2::frame data_frame, rs2::points &points, rs2::pointcloud &pc, rs2::frame &color, const std::string &fileName);
|
|
|
|
|
|
+struct ColoredPoints
|
|
|
|
+{
|
|
|
|
+ rs2::points points;
|
|
|
|
+ rs2::video_frame color;
|
|
|
|
+
|
|
|
|
+ ColoredPoints(rs2::points p, rs2::video_frame c) : points(p), color(c) {}
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+void configure_filters(rs2::threshold_filter &thr_filter, rs2::spatial_filter &spat_filter, float min_dist, float max_dist, int magnitude, int smooth_alpha, int smooth_delta, int holes_fill);
|
|
|
|
+void apply_filters(rs2::threshold_filter &thr_filter, rs2::spatial_filter &spat_filter, rs2::disparity_transform &depth_to_disparity, rs2::disparity_transform &disparity_to_depth, rs2::depth_frame &depth_frame);
|
|
|
|
+ColoredPoints scan(rs2::threshold_filter &thr_filter, rs2::spatial_filter &spat_filter, rs2::disparity_transform &depth_to_disparity, rs2::disparity_transform &disparity_to_depth, rs2::pipeline &pipe);
|
|
|
|
|
|
int main()
|
|
int main()
|
|
try
|
|
try
|
|
{
|
|
{
|
|
-
|
|
|
|
- rs2::pointcloud original_pc;
|
|
|
|
- rs2::pointcloud filtered_pc;
|
|
|
|
- rs2::points original_points;
|
|
|
|
- rs2::points filtered_points;
|
|
|
|
-
|
|
|
|
rs2::pipeline pipe;
|
|
rs2::pipeline pipe;
|
|
|
|
|
|
pipe.start();
|
|
pipe.start();
|
|
@@ -19,33 +26,41 @@ try
|
|
// define filters
|
|
// define filters
|
|
rs2::threshold_filter thr_filter; // Threshold - removes values outside recommended range
|
|
rs2::threshold_filter thr_filter; // Threshold - removes values outside recommended range
|
|
rs2::spatial_filter spat_filter; // Spatial - edge-preserving spatial smoothing
|
|
rs2::spatial_filter spat_filter; // Spatial - edge-preserving spatial smoothing
|
|
- // rs2::hole_filling_filter hole_filter; // Hole filling - fills small holes in the depth image
|
|
|
|
|
|
+ // rs2::hole_filling_filter hole_filter; // Hole filling - fills small holes in the depth image
|
|
const std::string disparity_filter_name = "Disparity"; // Declare disparity transform from depth to disparity and vice versa
|
|
const std::string disparity_filter_name = "Disparity"; // Declare disparity transform from depth to disparity and vice versa
|
|
rs2::disparity_transform depth_to_disparity(true);
|
|
rs2::disparity_transform depth_to_disparity(true);
|
|
rs2::disparity_transform disparity_to_depth(false);
|
|
rs2::disparity_transform disparity_to_depth(false);
|
|
|
|
+ configure_filters(thr_filter, spat_filter, 0.0, 0.5, 5, 1, 1, 5);
|
|
|
|
|
|
- // configure filters
|
|
|
|
- thr_filter.set_option(RS2_OPTION_MIN_DISTANCE, 0.0);
|
|
|
|
- thr_filter.set_option(RS2_OPTION_MAX_DISTANCE, 0.5);
|
|
|
|
- spat_filter.set_option(RS2_OPTION_FILTER_MAGNITUDE, 5);
|
|
|
|
- spat_filter.set_option(RS2_OPTION_FILTER_SMOOTH_ALPHA, 1);
|
|
|
|
- spat_filter.set_option(RS2_OPTION_FILTER_SMOOTH_DELTA, 1);
|
|
|
|
- spat_filter.set_option(RS2_OPTION_HOLES_FILL, 5);
|
|
|
|
- // hole_filter.set_option(RS2_OPTION_HOLES_FILL, 1);
|
|
|
|
|
|
+ ColoredPoints points = scan(thr_filter, spat_filter, depth_to_disparity, disparity_to_depth, pipe);
|
|
|
|
|
|
- // let the auto exposure settle
|
|
|
|
- for (auto i = 0; i < 30; ++i)
|
|
|
|
- pipe.wait_for_frames();
|
|
|
|
|
|
+ PCLConverter::convert_and_save_ply("output.ply", points.points, points.color);
|
|
|
|
|
|
- rs2::frameset data = pipe.wait_for_frames();
|
|
|
|
- rs2::video_frame color = data.get_color_frame();
|
|
|
|
- if (!color)
|
|
|
|
- color = data.get_infrared_frame();
|
|
|
|
- rs2::depth_frame depth_frame = data.get_depth_frame();
|
|
|
|
|
|
+ return EXIT_SUCCESS;
|
|
|
|
+}
|
|
|
|
+catch (const rs2::error &e)
|
|
|
|
+{
|
|
|
|
+ std::cerr << "RealSense error calling " << e.get_failed_function() << "(" << e.get_failed_args() << "):\n " << e.what() << std::endl;
|
|
|
|
+ return EXIT_FAILURE;
|
|
|
|
+}
|
|
|
|
+catch (const std::exception &e)
|
|
|
|
+{
|
|
|
|
+ std::cerr << e.what() << std::endl;
|
|
|
|
+ return EXIT_FAILURE;
|
|
|
|
+}
|
|
|
|
|
|
- rs2::depth_frame filtered = depth_frame;
|
|
|
|
|
|
+void configure_filters(rs2::threshold_filter &thr_filter, rs2::spatial_filter &spat_filter, float min_dist, float max_dist, int magnitude, int smooth_alpha, int smooth_delta, int holes_fill)
|
|
|
|
+{
|
|
|
|
+ thr_filter.set_option(RS2_OPTION_MIN_DISTANCE, min_dist); // 0.0
|
|
|
|
+ thr_filter.set_option(RS2_OPTION_MAX_DISTANCE, max_dist); // 0.5
|
|
|
|
+ spat_filter.set_option(RS2_OPTION_FILTER_MAGNITUDE, magnitude); // 5
|
|
|
|
+ spat_filter.set_option(RS2_OPTION_FILTER_SMOOTH_ALPHA, smooth_alpha); // 1
|
|
|
|
+ spat_filter.set_option(RS2_OPTION_FILTER_SMOOTH_DELTA, smooth_delta); // 1
|
|
|
|
+ spat_filter.set_option(RS2_OPTION_HOLES_FILL, holes_fill); // 5
|
|
|
|
+ // hole_filter.set_option(RS2_OPTION_HOLES_FILL, 1); //1
|
|
|
|
+}
|
|
|
|
|
|
- /* Apply filters.
|
|
|
|
|
|
+/* Apply filters.
|
|
The implemented flow of the filters pipeline is in the following order:
|
|
The implemented flow of the filters pipeline is in the following order:
|
|
1. apply decimation filter
|
|
1. apply decimation filter
|
|
2. apply threshold filter
|
|
2. apply threshold filter
|
|
@@ -55,32 +70,34 @@ try
|
|
6. revert the results back (if step Disparity filter was applied
|
|
6. revert the results back (if step Disparity filter was applied
|
|
to depth domain (each post processing block is optional and can be applied independantly).
|
|
to depth domain (each post processing block is optional and can be applied independantly).
|
|
*/
|
|
*/
|
|
-
|
|
|
|
- filtered = thr_filter.process(filtered);
|
|
|
|
- filtered = depth_to_disparity.process(filtered);
|
|
|
|
- filtered = spat_filter.process(filtered);
|
|
|
|
- filtered = disparity_to_depth.process(filtered);
|
|
|
|
- // filtered = hole_filter.process(filtered);
|
|
|
|
-
|
|
|
|
- update_data_and_save(depth_frame, original_points, original_pc, color, "original");
|
|
|
|
- update_data_and_save(filtered, filtered_points, filtered_pc, color, "filtered");
|
|
|
|
-
|
|
|
|
- return EXIT_SUCCESS;
|
|
|
|
-}
|
|
|
|
-catch (const rs2::error &e)
|
|
|
|
|
|
+void apply_filters(rs2::threshold_filter &thr_filter, rs2::spatial_filter &spat_filter, rs2::disparity_transform &depth_to_disparity, rs2::disparity_transform &disparity_to_depth, rs2::depth_frame &depth_frame)
|
|
{
|
|
{
|
|
- std::cerr << "RealSense error calling " << e.get_failed_function() << "(" << e.get_failed_args() << "):\n " << e.what() << std::endl;
|
|
|
|
- return EXIT_FAILURE;
|
|
|
|
-}
|
|
|
|
-catch (const std::exception &e)
|
|
|
|
-{
|
|
|
|
- std::cerr << e.what() << std::endl;
|
|
|
|
- return EXIT_FAILURE;
|
|
|
|
|
|
+ depth_frame = thr_filter.process(depth_frame);
|
|
|
|
+ depth_frame = depth_to_disparity.process(depth_frame);
|
|
|
|
+ depth_frame = spat_filter.process(depth_frame);
|
|
|
|
+ depth_frame = disparity_to_depth.process(depth_frame);
|
|
|
|
+ // filtered = hole_filter.process(depth_frame);
|
|
}
|
|
}
|
|
|
|
|
|
-void update_data_and_save(rs2::frame data_frame, rs2::points &points, rs2::pointcloud &pc, rs2::frame &color, const std::string &fileName)
|
|
|
|
|
|
+ColoredPoints scan(rs2::threshold_filter &thr_filter, rs2::spatial_filter &spat_filter, rs2::disparity_transform &depth_to_disparity, rs2::disparity_transform &disparity_to_depth, rs2::pipeline &pipe)
|
|
{
|
|
{
|
|
- pc.map_to(color); // Map the colored image to the point cloud
|
|
|
|
- points = pc.calculate(data_frame); // Generate pointcloud from the depth data
|
|
|
|
- points.export_to_ply(fileName + ".ply", color); // export pointcloud to .ply file
|
|
|
|
|
|
+ rs2::pointcloud pointcloud;
|
|
|
|
+ rs2::points points;
|
|
|
|
+
|
|
|
|
+ // let the auto exposure settle
|
|
|
|
+ for (auto i = 0; i < 30; ++i)
|
|
|
|
+ pipe.wait_for_frames();
|
|
|
|
+
|
|
|
|
+ rs2::frameset data = pipe.wait_for_frames();
|
|
|
|
+ rs2::video_frame color = data.get_color_frame();
|
|
|
|
+ if (!color)
|
|
|
|
+ color = data.get_infrared_frame();
|
|
|
|
+ rs2::depth_frame depth_frame = data.get_depth_frame();
|
|
|
|
+
|
|
|
|
+ apply_filters(thr_filter, spat_filter, depth_to_disparity, disparity_to_depth, depth_frame);
|
|
|
|
+
|
|
|
|
+ pointcloud.map_to(color);
|
|
|
|
+ points = pointcloud.calculate(depth_frame);
|
|
|
|
+
|
|
|
|
+ return ColoredPoints(points, color);
|
|
}
|
|
}
|