Visual Servoing Platform  version 3.6.1 under development (2024-12-17)
tutorial-grabber-rgbd-D435-structurecore.cpp
1 
2 #include <iostream>
3 
4 #include <visp3/core/vpConfig.h>
5 #include <visp3/core/vpImageConvert.h>
6 #include <visp3/gui/vpDisplayGDI.h>
7 #include <visp3/gui/vpDisplayX.h>
8 #include <visp3/sensor/vpOccipitalStructure.h>
9 #include <visp3/sensor/vpRealSense2.h>
10 
14 int main(int argc, char **argv)
15 {
16 #if defined(VISP_HAVE_REALSENSE2) && defined(VISP_HAVE_OCCIPITAL_STRUCTURE) && (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
17 #ifdef ENABLE_VISP_NAMESPACE
18  using namespace VISP_NAMESPACE_NAME;
19 #endif
20  // Both cameras can stream color and depth in 640x480 resolution.
21  unsigned int width = 640, height = 480;
22 
23  // Grabbers.
24  vpRealSense2 rs;
26 
27  // Required images to acquire and display color and depth.
28  vpImage<float> sc_I_depth_raw(height, width);
29  vpImage<uint16_t> rs_I_depth_raw(height, width);
30  vpImage<vpRGBa> I_depth_sc(height, width), I_depth_rs(height, width);
31  vpImage<vpRGBa> I_color_sc(height, width), I_color_rs(height, width);
32 
33  vpDisplayX d_rs_depth(I_depth_rs, 10, height + 10, "RealSense Depth"),
34  d_sc_depth(I_depth_sc, width + 10, height + 10, "Structure Core Depth");
35  vpDisplayX d_color_rs(I_color_rs, 10, 10, "RealSense Color"),
36  d_color_sc(I_color_sc, width + 10, 10, "Structure Core Color");
37 
38  // Configuring and opening RealSense grabber.
39  rs2::config cfg;
40  cfg.enable_stream(RS2_STREAM_COLOR, width, height, RS2_FORMAT_RGBA8, 30);
41  cfg.enable_stream(RS2_STREAM_DEPTH, width, height, RS2_FORMAT_Z16, 30);
42  rs.open(cfg);
43 
44  // Configuring and opening Structure Core grabber.
45  ST::CaptureSessionSettings settings;
46  settings.source = ST::CaptureSessionSourceId::StructureCore;
47  settings.structureCore.visibleEnabled = true;
48  settings.applyExpensiveCorrection = true; // Apply a correction and clean filter to the depth before streaming.
49  sc.open(settings);
50 
51  // Acquiring images.
52  for (;;) {
53  rs.acquire(reinterpret_cast<unsigned char *>(I_color_rs.bitmap),
54  reinterpret_cast<unsigned char *>(rs_I_depth_raw.bitmap), nullptr, nullptr, nullptr, nullptr, nullptr);
55  sc.acquire(reinterpret_cast<unsigned char *>(I_color_sc.bitmap),
56  reinterpret_cast<unsigned char *>(sc_I_depth_raw.bitmap));
57 
58  // Converting raw depth data to color images.
59  vpImageConvert::createDepthHistogram(rs_I_depth_raw, I_depth_rs);
60  vpImageConvert::createDepthHistogram(sc_I_depth_raw, I_depth_sc);
61 
62  vpDisplay::display(I_color_rs);
63  vpDisplay::display(I_color_sc);
64  vpDisplay::display(I_depth_rs);
65  vpDisplay::display(I_depth_sc);
66 
67  vpDisplay::flush(I_color_rs);
68  vpDisplay::flush(I_color_sc);
69  vpDisplay::flush(I_depth_rs);
70  vpDisplay::flush(I_depth_sc);
71 
72  if (vpDisplay::getClick(I_color_rs, false) || vpDisplay::getClick(I_color_sc, false) ||
73  vpDisplay::getClick(I_depth_rs, false) || vpDisplay::getClick(I_depth_sc, false)) {
74  break;
75 }
76 }
77 #else
78  (void)argc;
79  (void)argv;
80 #if !(defined(VISP_HAVE_OCCIPITAL_STRUCTURE))
81  std::cout << "Install libStructure, configure and build ViSP again to use this example" << std::endl;
82 #endif
83 #if !(defined(VISP_HAVE_REALSENSE2))
84  std::cout << "Install librealsense, configure and build ViSP again to use this example" << std::endl;
85 #endif
86 #if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
87  std::cout << "This tutorial should be built with c++11 support" << std::endl;
88 #endif
89 #endif
90 }
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
static void createDepthHistogram(const vpImage< uint16_t > &src_depth, vpImage< vpRGBa > &dest_rgba)
void acquire(vpImage< unsigned char > &gray, bool undistorted=false, double *ts=nullptr)
bool open(const ST::CaptureSessionSettings &settings)
void acquire(vpImage< unsigned char > &grey, double *ts=nullptr)
bool open(const rs2::config &cfg=rs2::config())