关于RealSense的基础使用的博文用的库有点混杂,挺多博文都是早期maneger的那个库,对那个不是很了解,主要记录一下使用最新的函数库的基础使用。
相机型号:RealSense R435
使用函数库:librealsense2/rs.hpp
1 #include <librealsense2/rs.hpp>
命名空间:rs2
1 using namespace rs2;
首先是检查设备并打印设备信息,从context里面查找device。
1 context ctx; 2 auto devicelist = ctx.query_devices(); 3 device dev = *devicelist.begin(); 4 cout << "rs2_camera_name: " << dev.get_info(RS2_CAMERA_INFO_NAME) << endl; //相机名字 5 cout << "rs2_camera_serial_number: " << dev.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER) << endl; //序列号 6 cout << "rs2_firmware_version: " << dev.get_info(RS2_CAMERA_INFO_FIRMWARE_VERSION) << endl; //固件版本
其次是设置RGB色彩和深度视频流参数,使用config来完成,此外还可以设置使用补洞滤波hole_filling_filter hole_filter。
1 config cfg; 2 cfg.enable_stream(RS2_STREAM_DEPTH, 1280, 720, RS2_FORMAT_Z16, 30); 3 cfg.enable_stream(RS2_STREAM_COLOR, 1280, 720, RS2_FORMAT_BGR8, 30); 4 5 hole_filling_filter hole_filter; 6 hole_filter.set_option(RS2_OPTION_HOLES_FILL, 2);
最后开启管道,并将设置的config值放入。在循环中等待帧集的到来,并从中读出depth frame 和 color frame,此外可配合OpenCV函数使用将Frame转成Mat。
pipeline pipe; pipe.start(cfg); while(1) { frameset frames = pipe.wait_for_frames(); depth_frame depth = frames.get_depth_frame(); frame color = frames.get_color_frame(); color_mat = Frame2Mat(color); }
将Frame类型的图像转成Mat类型的具体函数如下:
1 Mat Frame2Mat(const rs2::frame &frame) 2 { 3 auto vf = frame.as<rs2::video_frame>(); 4 const int w = vf.get_width(); 5 const int h = vf.get_height(); 6 7 if (frame.get_profile().format() == RS2_FORMAT_BGR8) 8 { 9 return cv::Mat(cv::Size(w, h), CV_8UC3, (void *)frame.get_data(), cv::Mat::AUTO_STEP); 10 } 11 12 else if (frame.get_profile().format() == RS2_FORMAT_RGB8) 13 { 14 auto r = cv::Mat(cv::Size(w, h), CV_8UC3, (void *)frame.get_data(), cv::Mat::AUTO_STEP); 15 cv::cvtColor(r, r, CV_RGB2BGR); 16 return r; 17 } 18 19 else if (frame.get_profile().format() == RS2_FORMAT_Z16) 20 { 21 return cv::Mat(cv::Size(w, h), CV_16UC1, (void *)frame.get_data(), cv::Mat::AUTO_STEP); 22 } 23 24 else if (frame.get_profile().format() == RS2_FORMAT_Y8) 25 { 26 return cv::Mat(cv::Size(w, h), CV_8UC1, (void *)frame.get_data(), cv::Mat::AUTO_STEP); 27 } 28 }
其中RS2_FORMAT_BGR8和RS2_FORMAT_RGB8是彩色图像帧的格式,RS2_FORMAT_Z16和RS2_FORMAT_Y8是深度图像帧的格式,还有其它格式如果需要可以自行补充。更多图像格式的信息在RealSense的数据手册中可以找到。