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.
pull/11730/head
Pavel Rojtberg 7 years ago
parent 45dd575ed2
commit bfc227b8d4
  1. 4
      cmake/OpenCVFindLibRealsense.cmake
  2. 41
      modules/videoio/src/cap_librealsense.cpp
  3. 7
      modules/videoio/src/cap_librealsense.hpp

@ -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)

@ -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<rs2::depth_sensor>().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<rs2::video_frame>();
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<void*>(mDev->get_frame_data(stream));
Mat(mDev->get_stream_height(stream), mDev->get_stream_width(stream), type, data).copyTo(frame);
void* data = const_cast<void*>(_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<rs2_pipeline>(mPipe));
}
}

@ -7,7 +7,7 @@
#ifdef HAVE_LIBREALSENSE
#include <librealsense/rs.hpp>
#include <librealsense2/rs.hpp>
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;
};
}

Loading…
Cancel
Save