使用opencv基于realsense D435i展示基本的图像
此示例是 Intel RealSense 相机与 OpenCV 集成的 “Hello World” 基础代码。示例将打开一个 OpenCV 的 UI 窗口,并将彩色化的深度流渲染到窗口中。以下代码片段演示了如何从 rs2::frame 创建 cv::Mat:
// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2017 Intel Corporation. All Rights Reserved.#include <librealsense2/rs.hpp> // Include RealSense Cross Platform API
#include <opencv2/opencv.hpp> // Include OpenCV APIint main(int argc, char * argv[]) try
{// Declare depth colorizer for pretty visualization of depth data// 建着色过滤器(Colorizer Filter)// 该过滤器根据输入的深度帧生成彩色图像。// 与直接使用OpenCV的区别,RealSense Colorizer 硬件加速、低延迟 依赖RealSense SDK// cv::applyColorMap() 跨平台、可定制 需手动处理深度值归一化rs2::colorizer color_map;// Declare RealSense pipeline, encapsulating the actual device and sensorsrs2::pipeline pipe;// Start streaming with default recommended configurationpipe.start();using namespace cv;const auto window_name = "Display Image"; namedWindow(window_name, WINDOW_AUTOSIZE);while (waitKey(1) < 0 && getWindowProperty(window_name, WND_PROP_AUTOSIZE) >= 0){rs2::frameset data = pipe.wait_for_frames(); // Wait for next set of frames from the camerars2::frame depth = data.get_depth_frame().apply_filter(color_map);// Query frame size (width and height)// 返回图像的像素高度const int w = depth.as<rs2::video_frame>().get_width();const int h = depth.as<rs2::video_frame>().get_height();// Create OpenCV matrix of size (w,h) from the colorized depth dataMat image(Size(w, h), CV_8UC3, (void*)depth.get_data(), Mat::AUTO_STEP);// Update the window with new dataimshow(window_name, image);}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;
}
此外,上面手动转换image如果是彩色图像色值会有问题,可以直接使用realsense提供的转换接口:
// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2017 Intel Corporation. All Rights Reserved.#include <librealsense2/rs.hpp> // Include RealSense Cross Platform API
#include <opencv2/opencv.hpp> // Include OpenCV API
#include "../cv-helpers.hpp"
int main(int argc, char * argv[]) try
{// Declare depth colorizer for pretty visualization of depth data// 建着色过滤器(Colorizer Filter)// 该过滤器根据输入的深度帧生成彩色图像。// 与直接使用OpenCV的区别,RealSense Colorizer 硬件加速、低延迟 依赖RealSense SDK// cv::applyColorMap() 跨平台、可定制 需手动处理深度值归一化rs2::colorizer color_map;// Declare RealSense pipeline, encapsulating the actual device and sensorsrs2::pipeline pipe;// Start streaming with default recommended configurationpipe.start();using namespace cv;const auto window_name = "Display Image"; namedWindow(window_name, WINDOW_AUTOSIZE);while (waitKey(1) < 0 && getWindowProperty(window_name, WND_PROP_AUTOSIZE) >= 0){rs2::frameset data = pipe.wait_for_frames(); // Wait for next set of frames from the camerars2::frame depth = data.get_depth_frame().apply_filter(color_map);rs2::frame color = data.get_color_frame();// Query frame size (width and height)// 返回图像的像素高度const int w = depth.as<rs2::video_frame>().get_width();const int h = depth.as<rs2::video_frame>().get_height();const int cw = color.as<rs2::video_frame>().get_width();const int ch = color.as<rs2::video_frame>().get_height();// Create OpenCV matrix of size (w,h) from the colorized depth data//Mat image(Size(w, h), CV_8UC3, (void*)depth.get_data(), Mat::AUTO_STEP);Mat image = frame_to_mat(depth);// Update the window with new dataimshow(window_name, image);}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;
}