zoukankan      html  css  js  c++  java
  • realsenseD435采集图片

    依赖opencv,我这里用的412

      1 #include <librealsense2/rs.hpp>
      2 
      3 #include<iostream>
      4 
      5 // include OpenCV header file
      6 #include <opencv2/opencv.hpp>
      7 using namespace cv;
      8 
      9 #define RS_WIDTH 640
     10 #define RS_HEIGHT 480
     11 #define RS_FPS 60
     12 
     13 
     14 int main(int argc, char** argv) try
     15 {
     16     // judge whether devices is exist or not
     17     rs2::context ctx;
     18     auto list = ctx.query_devices(); // Get a snapshot of currently connected devices
     19     if (list.size() == 0)
     20         throw std::runtime_error("No device detected. Is it plugged in?");
     21     rs2::device dev = list.front();
     22 
     23     //
     24     rs2::frameset frames;
     25     //Contruct a pipeline which abstracts the device
     26     rs2::pipeline pipe;//创建一个通信管道//https://baike.so.com/doc/1559953-1649001.html pipeline的解释
     27     //Create a configuration for configuring the pipeline with a non default profile
     28     rs2::config cfg;//创建一个以非默认配置的配置用来配置管道
     29     //Add desired streams to configuration
     30     cfg.enable_stream(RS2_STREAM_COLOR, RS_WIDTH, RS_HEIGHT, RS2_FORMAT_BGR8, RS_FPS);//向配置添加所需的流
     31     cfg.enable_stream(RS2_STREAM_DEPTH, RS_WIDTH, RS_HEIGHT, RS2_FORMAT_Z16, RS_FPS);
     32     cfg.enable_stream(RS2_STREAM_INFRARED, 1, RS_WIDTH, RS_HEIGHT, RS2_FORMAT_Y8, RS_FPS);
     33     cfg.enable_stream(RS2_STREAM_INFRARED, 2, RS_WIDTH, RS_HEIGHT, RS2_FORMAT_Y8, RS_FPS);
     34 
     35     // get depth scale
     36     // float depth_scale = get_depth_scale(profile.get_device());
     37 
     38     // start stream
     39     pipe.start(cfg);//指示管道使用所请求的配置启动流
     40 
     41     int c = 0;
     42 
     43     while (true)
     44     {
     45         frames = pipe.wait_for_frames();//等待所有配置的流生成框架
     46 
     47         // Align to depth
     48         /*rs2::align align_to_depth(RS2_STREAM_DEPTH);*/
     49         rs2::align align_to_depth(rs2_stream::RS2_STREAM_COLOR);
     50         frames = align_to_depth.process(frames);
     51 
     52         //Get each frame
     53         rs2::frame color_frame = frames.get_color_frame();
     54         rs2::frame depth_frame = frames.get_depth_frame();
     55         rs2::video_frame ir_frame_left = frames.get_infrared_frame(1);
     56         rs2::video_frame ir_frame_right = frames.get_infrared_frame(2);
     57 
     58 
     59         // Creating OpenCV Matrix from a color image
     60         Mat color(Size(RS_WIDTH, RS_HEIGHT), CV_8UC3, (void*)color_frame.get_data(), Mat::AUTO_STEP);
     61         Mat pic_right(Size(RS_WIDTH, RS_HEIGHT), CV_8UC1, (void*)ir_frame_right.get_data());
     62         Mat pic_left(Size(RS_WIDTH, RS_HEIGHT), CV_8UC1, (void*)ir_frame_left.get_data());
     63         Mat pic_depth(Size(RS_WIDTH, RS_HEIGHT), CV_16U, (void*)depth_frame.get_data(), Mat::AUTO_STEP);
     64 
     65         // Display in a GUI
     66         namedWindow("Display Image", WINDOW_AUTOSIZE);
     67         imshow("Display Image", color);
     68         waitKey(1);
     69         imshow("Display depth", pic_depth * 15); // *15 for show
     70         waitKey(1);
     71         imshow("Display pic_left", pic_left);
     72         waitKey(1);
     73         imshow("Display pic_right", pic_right);
     74         waitKey(1);
     75 
     76         std::string dir = "D:\Data\6DOF\";
     77         if (c >= 100)
     78         {
     79             if (cv::imwrite(dir + "color\color-" + std::to_string(c) + ".png", color) &&
     80                 cv::imwrite(dir + "depth\depth-" + std::to_string(c) + ".png", pic_depth))
     81             {
     82                 std::cout << std::to_string(c) << "st depth;  " << std::to_string(c) << "st color" << std::endl;
     83             }
     84         }
     85 
     86         c++;
     87     }
     88     return 0;
     89 }
     90 
     91 // error
     92 catch (const rs2::error & e)
     93 {
     94     std::cerr << "RealSense error calling " << e.get_failed_function() << "(" << e.get_failed_args() << "):
        " << e.what() << std::endl;
     95     return EXIT_FAILURE;
     96 }
     97 catch (const std::exception& e)
     98 {
     99     std::cerr << e.what() << std::endl;
    100     return EXIT_FAILURE;
    101 }

    简单封装下:

    realsense.h

     1 #pragma once
     2 #ifndef REALSENSE_H
     3 #define REALSENSE_H
     4 
     5 #include<librealsense2/rs.hpp>
     6 #define RS_WIDTH 640
     7 #define RS_HEIGHT 480
     8 #define RS_FPS 60 // 调太高导致相机初始化失败
     9 
    10 
    11 class RealSense
    12 {
    13 public:
    14     RealSense();
    15 
    16     void GetFrames();
    17 
    18     ~RealSense();
    19 
    20 private:
    21     rs2::context ctx;
    22 
    23     rs2::frameset frames;
    24     
    25     rs2::pipeline pipe;
    26     
    27     rs2::config cfg;
    28 
    29 public:
    30     rs2::frame color_frame;
    31 
    32     rs2::frame depth_frame;
    33 
    34 };
    35 
    36 #endif
    View Code

    realsense.cpp

     1 #include"realsense.h"
     2 
     3 
     4 RealSense::RealSense()
     5 {
     6     auto list = ctx.query_devices();
     7     if (list.size() == 0)
     8         throw std::runtime_error("No device detected. Is it plugged in?");
     9     //Add desired streams to configuration
    10     cfg.enable_stream(RS2_STREAM_COLOR, RS_WIDTH, RS_HEIGHT, RS2_FORMAT_BGR8, RS_FPS);
    11     cfg.enable_stream(RS2_STREAM_DEPTH, RS_WIDTH, RS_HEIGHT, RS2_FORMAT_Z16, RS_FPS);
    12 
    13     pipe.start(cfg);
    14 }
    15 
    16 void RealSense::GetFrames()
    17 {
    18     this->frames = this->pipe.wait_for_frames();//等待所有配置的流生成框架
    19 
    20     // Align to depth
    21     rs2::align align_to_depth(rs2_stream::RS2_STREAM_COLOR);
    22     this->frames = align_to_depth.process(this->frames);
    23 
    24     //Get each frame
    25     this->color_frame = frames.get_color_frame();
    26     this->depth_frame = frames.get_depth_frame();
    27 
    28 }
    29 
    30 RealSense::~RealSense()
    31 {
    32 }
    View Code

    test.cpp

     1 #include<iostream>
     2 #include<chrono>
     3 #include <opencv2/opencv.hpp>
     4 using namespace cv;
     5 #include"realsense.h"
     6 
     7 
     8 int main(int argc, char** argv) 
     9 {
    10     RealSense RS;
    11 
    12     while (true)
    13     {
    14         std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();
    15         
    16         RS.GetFrames();
    17 
    18         // -> OpenCV
    19         Mat color(cv::Size(RS_WIDTH, RS_HEIGHT), CV_8UC3, (void*)RS.color_frame.get_data(), cv::Mat::AUTO_STEP);
    20         Mat depth(cv::Size(RS_WIDTH, RS_HEIGHT), CV_16U, (void*)RS.depth_frame.get_data(), cv::Mat::AUTO_STEP);
    21 
    22         // Display in a GUI
    23         namedWindow("Display Image", WINDOW_AUTOSIZE);
    24         imshow("Display Image", color);
    25         waitKey(1);
    26         imshow("Display depth", depth * 15); // *15 for show
    27         waitKey(1);
    28 
    29         std::chrono::steady_clock::time_point t2 = std::chrono::steady_clock::now();
    30         std::chrono::duration<double> time_used = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1);
    31         std::cout << "the cost of time:" << 1000 * time_used.count() << " milliseconds." << std::endl;
    32     }
    33     return 0;
    34 }
    View Code

    按照时间戳保存

     1 #include <librealsense2/rs.hpp>
     2 
     3 
     4 #include <iostream>
     5 #include<string>
     6 #include<Windows.h>
     7 #include<opencv2/opencv.hpp>
     8 
     9 #define width 640
    10 #define height 480
    11 #define fps 30
    12 
    13 int main()
    14 {
    15     // timestamp 
    16     SYSTEMTIME st = { 0 };
    17     // 
    18     std::string dir = "F:\Dataset\cube\";
    19     std::string png = ".png";
    20 
    21     // judge whether devices is exist or not
    22     rs2::context ctx;
    23     auto list = ctx.query_devices(); // Get a snapshot of currently connected devices
    24     if (list.size() == 0)
    25         throw std::runtime_error("No device detected. Is it plugged in?");
    26     rs2::device dev = list.front();
    27     //
    28     rs2::frameset frames;
    29     rs2::pipeline pipe;
    30     rs2::config cfg;
    31     //Add desired streams to configuration
    32     cfg.enable_stream(RS2_STREAM_COLOR, width, height, RS2_FORMAT_BGR8, fps);//向配置添加所需的流
    33     cfg.enable_stream(RS2_STREAM_DEPTH, width, height, RS2_FORMAT_Z16, fps);
    34     // start stream
    35     pipe.start(cfg);//指示管道使用所请求的配置启动流
    36     while (true)
    37     {
    38         frames = pipe.wait_for_frames();//等待所有配置的流生成框架
    39 
    40         // Align to depth
    41         rs2::align align_to_depth(rs2_stream::RS2_STREAM_COLOR);
    42         frames = align_to_depth.process(frames);
    43 
    44         //Get each frame
    45         rs2::frame color_frame = frames.get_color_frame();
    46         rs2::frame depth_frame = frames.get_depth_frame();
    47         rs2::video_frame ir_frame_left = frames.get_infrared_frame(1);
    48         rs2::video_frame ir_frame_right = frames.get_infrared_frame(2);
    49 
    50 
    51         // Creating OpenCV Matrix from a color image
    52         cv::Mat color(cv::Size(width, height), CV_8UC3, (void*)color_frame.get_data(), cv::Mat::AUTO_STEP);
    53         cv::Mat pic_depth(cv::Size(width, height), CV_16U, (void*)depth_frame.get_data(), cv::Mat::AUTO_STEP);
    54 
    55         // Display in a GUI
    56         cv::namedWindow("Display Image", cv::WINDOW_AUTOSIZE);
    57         imshow("Display Image", color);
    58         //cv::waitKey(1);
    59         //cv::imshow("Display depth", pic_depth * 15); // *15 for show
    60         //cv::waitKey(1);    
    61 
    62         // 按照时间戳保存
    63         GetLocalTime(&st);
    64         std::string t = std::to_string(st.wYear) +
    65             std::to_string(st.wMonth) +
    66             std::to_string(st.wDay) +
    67             std::to_string(st.wHour) +
    68             std::to_string(st.wMinute) +
    69             std::to_string(st.wSecond) +
    70             std::to_string(st.wMilliseconds);
    71         //std::cout << t << std::endl;
    72         if (cv::waitKey(1) == 'C')
    73         {
    74             cv::imwrite(dir + t + png, color);
    75         }
    76         
    77 
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    linux 之 系统监控
    Spring Cloud Eureka 常用配置及说明
    mysql的事务隔离级别
    什么场景中会用到java多线程(转)
    springboot配置druid连接池
    MyBatis标签详解(转)
    关于@JsonSerialize注解的使用方法
    layer绑定回车事件(转)
    php7+apache2.4配置
    Eclipse创建Maven项目不支持el表达式的解决方式
  • 原文地址:https://www.cnblogs.com/winslam/p/13602413.html
Copyright © 2011-2022 走看看