From bfc227b8d45696ee358a9d7da7b2333234836b1d Mon Sep 17 00:00:00 2001 From: Pavel Rojtberg Date: Fri, 8 Jun 2018 17:41:13 +0200 Subject: [PATCH] videoio: update librealsense to API 2.0 this enables the usage of current sensors, while dropping support for legacy devices, see: https://github.com/IntelRealSense/librealsense#overview Given limited resources, and that the legacy sensors where not that great, I think we should focus on v2. --- cmake/OpenCVFindLibRealsense.cmake | 4 +-- modules/videoio/src/cap_librealsense.cpp | 41 ++++++++++++------------ modules/videoio/src/cap_librealsense.hpp | 7 ++-- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/cmake/OpenCVFindLibRealsense.cmake b/cmake/OpenCVFindLibRealsense.cmake index 851e03146d..32cff063f3 100644 --- a/cmake/OpenCVFindLibRealsense.cmake +++ b/cmake/OpenCVFindLibRealsense.cmake @@ -2,8 +2,8 @@ # LIBREALSENSE_LIBRARIES and LIBREALSENSE_INCLUDE to link Intel librealsense modules # HAVE_LIBREALSENSE for conditional compilation OpenCV with/without librealsense -find_path(LIBREALSENSE_INCLUDE_DIR "librealsense/rs.hpp" PATHS "$ENV{LIBREALSENSE_INCLUDE}" DOC "Path to librealsense interface headers") -find_library(LIBREALSENSE_LIBRARIES "realsense" PATHS "$ENV{LIBREALSENSE_LIB}" DOC "Path to librealsense interface libraries") +find_path(LIBREALSENSE_INCLUDE_DIR "librealsense2/rs.hpp" PATHS "$ENV{LIBREALSENSE_INCLUDE}" DOC "Path to librealsense interface headers") +find_library(LIBREALSENSE_LIBRARIES "realsense2" PATHS "$ENV{LIBREALSENSE_LIB}" DOC "Path to librealsense interface libraries") if(LIBREALSENSE_INCLUDE_DIR AND LIBREALSENSE_LIBRARIES) set(HAVE_LIBREALSENSE TRUE) diff --git a/modules/videoio/src/cap_librealsense.cpp b/modules/videoio/src/cap_librealsense.cpp index f178d209be..a33841bab6 100644 --- a/modules/videoio/src/cap_librealsense.cpp +++ b/modules/videoio/src/cap_librealsense.cpp @@ -10,20 +10,19 @@ namespace cv { -VideoCapture_LibRealsense::VideoCapture_LibRealsense(int index) +VideoCapture_LibRealsense::VideoCapture_LibRealsense(int) : mAlign(RS2_STREAM_COLOR) { try { - mDev = mContext.get_device(index); - // Configure all streams to run at VGA resolution at 60 frames per second - mDev->enable_stream(rs::stream::depth, 640, 480, rs::format::z16, 60); - mDev->enable_stream(rs::stream::color, 640, 480, rs::format::bgr8, 60); - mDev->enable_stream(rs::stream::infrared, 640, 480, rs::format::y8, 60); - mDev->start(); + rs2::config config; + // Configure all streams to run at VGA resolution at default fps + config.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16); + config.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_BGR8); + config.enable_stream(RS2_STREAM_INFRARED, 640, 480, RS2_FORMAT_Y8); + mPipe.start(); } - catch (rs::error&) + catch (const rs2::error&) { - mDev = nullptr; } } VideoCapture_LibRealsense::~VideoCapture_LibRealsense(){} @@ -32,8 +31,8 @@ double VideoCapture_LibRealsense::getProperty(int prop) const { double propValue = 0; - if(prop == CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE) - return mDev->get_depth_scale(); + if (prop == CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE) + return mPipe.get_active_profile().get_device().first().get_depth_scale(); return propValue; } @@ -50,9 +49,9 @@ bool VideoCapture_LibRealsense::grabFrame() try { - mDev->wait_for_frames(); + mData = mAlign.process(mPipe.wait_for_frames()); } - catch (rs::error&) + catch (const rs2::error&) { return false; } @@ -61,20 +60,20 @@ bool VideoCapture_LibRealsense::grabFrame() } bool VideoCapture_LibRealsense::retrieveFrame(int outputType, cv::OutputArray frame) { - rs::stream stream; + rs2::video_frame _frame(nullptr); int type; switch (outputType) { case CAP_INTELPERC_DEPTH_MAP: - stream = rs::stream::depth_aligned_to_color; + _frame = mData.get_depth_frame().as(); type = CV_16UC1; break; case CAP_INTELPERC_IR_MAP: - stream = rs::stream::infrared; + _frame = mData.get_infrared_frame(); type = CV_8UC1; break; case CAP_INTELPERC_IMAGE: - stream = rs::stream::color; + _frame = mData.get_color_frame(); type = CV_8UC3; break; default: @@ -84,10 +83,10 @@ bool VideoCapture_LibRealsense::retrieveFrame(int outputType, cv::OutputArray fr try { // we copy the data straight away, so const_cast should be fine - void* data = const_cast(mDev->get_frame_data(stream)); - Mat(mDev->get_stream_height(stream), mDev->get_stream_width(stream), type, data).copyTo(frame); + void* data = const_cast(_frame.get_data()); + Mat(_frame.get_height(), _frame.get_width(), type, data, _frame.get_stride_in_bytes()).copyTo(frame); } - catch (rs::error&) + catch (const rs2::error&) { return false; } @@ -101,7 +100,7 @@ int VideoCapture_LibRealsense::getCaptureDomain() bool VideoCapture_LibRealsense::isOpened() const { - return mDev && mDev->is_streaming(); + return bool(std::shared_ptr(mPipe)); } } diff --git a/modules/videoio/src/cap_librealsense.hpp b/modules/videoio/src/cap_librealsense.hpp index a7448b4f2e..81d17e2360 100644 --- a/modules/videoio/src/cap_librealsense.hpp +++ b/modules/videoio/src/cap_librealsense.hpp @@ -7,7 +7,7 @@ #ifdef HAVE_LIBREALSENSE -#include +#include namespace cv { @@ -26,8 +26,9 @@ public: virtual int getCaptureDomain() CV_OVERRIDE; virtual bool isOpened() const CV_OVERRIDE; protected: - rs::context mContext; - rs::device* mDev = nullptr; + rs2::pipeline mPipe; + rs2::frameset mData; + rs2::align mAlign; }; }