Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to load .JSON file to RealSense D435 camera using C++ and intel API

Tags:

intel

I'm trying to tune my depth camera (RealSense D435) to get better/different depth data. Therefore i want to experiment with the different pre sets from intel's adviced parameter configuration as explained in the intel SDK. Intel advices to use the pre sets and to not try to tune and fiddle with the 50+ paramaters yourself.

As much as i'd like to ignore that comment of intel, i am unable to even upload/read/process the pre set configuration pre sets which are provided as a .JSON file (C++). Is anyone able to show a code snippet in which a .JSON file is succesfully used to change the advanced settings of the generated depth image of a Realsense D400 series camera?

like image 921
Wouter61636 Avatar asked Nov 28 '18 13:11

Wouter61636


1 Answers

I found out how to do it and here is the code snippet including some extra image retrieving code that has to be put in Main():

// Obtain a list of devices currently present on the system
context ctx;
auto devices = ctx.query_devices();
size_t device_count = devices.size();
if (!device_count)
{
    cout <<"No device detected. Is it plugged in?\n";
    return EXIT_SUCCESS;
}

// Get the first connected device
auto dev = devices[0];

// Enter advanced mode
   if (dev.is<rs400::advanced_mode>())
   {
       // Get the advanced mode functionality
       auto advanced_mode_dev = dev.as<rs400::advanced_mode>();

       // Load and configure .json file to device
       ifstream t("./presets/ShortRangePreset.json");
       string str((istreambuf_iterator<char>(t)), istreambuf_iterator<char>());
       advanced_mode_dev.load_json(str);
   }
   else
   {
       cout << "Current device doesn't support advanced-mode!\n";
       return EXIT_FAILURE;
   }

//Contruct a pipeline which abstracts the device
    rs2::pipeline pipe;
    rs2::device selected_device = dev;
    auto depth_sensor = selected_device.first<rs2::depth_sensor>();

    //Create a configuration for configuring the pipeline with a non default profile
    rs2::config cfg;

    //Add desired streams to configuration
    cfg.enable_stream(RS2_STREAM_INFRARED,  ImageWidth_px, ImageHeight_px, RS2_FORMAT_Y8, FrameRate);
    cfg.enable_stream(RS2_STREAM_DEPTH,     ImageWidth_px, ImageHeight_px, RS2_FORMAT_Z16, FrameRate);

    //Instruct pipeline to start streaming with the requested configuration
    pipe.start(cfg);

    // Camera warmup - dropping several first frames to let auto-exposure stabilize
    rs2::frameset frames;
    for(int i = 0; i < 5; i++)
    {
        //Wait for all configured streams to produce a frame
        frames = pipe.wait_for_frames();
    }

    bool quit = false;
    char key;

    while (!quit){

        frames = pipe.wait_for_frames();

        //Get each frame
        rs2::frame          ir_frame    = frames.first(RS2_STREAM_INFRARED);
        rs2::depth_frame    depth_frame = frames.get_depth_frame();

        // Creating OpenCV matrix from IR image
        Mat ir      (Size(ImageWidth_px, ImageHeight_px), CV_8UC1,  (void*)ir_frame.get_data(),     Mat::AUTO_STEP);
        Mat depth   (Size(ImageWidth_px, ImageHeight_px), CV_16UC1, (void*)depth_frame.get_data(),  Mat::AUTO_STEP);

        // etc the rest of your code on how you want to edit/process the images
        }
like image 122
Wouter61636 Avatar answered Sep 29 '22 03:09

Wouter61636