mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
249 lines
6.7 KiB
249 lines
6.7 KiB
// This file is part of OpenCV project. |
|
// It is subject to the license terms in the LICENSE file found in the top-level directory |
|
// of this distribution and at http://opencv.org/license.html. |
|
|
|
#include "precomp.hpp" |
|
|
|
#ifdef HAVE_LIBREALSENSE |
|
#include "cap_librealsense.hpp" |
|
|
|
namespace cv |
|
{ |
|
|
|
VideoCapture_LibRealsense::VideoCapture_LibRealsense(int) : mAlign(RS2_STREAM_COLOR) |
|
{ |
|
try |
|
{ |
|
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(config); |
|
} |
|
catch (const rs2::error&) |
|
{ |
|
} |
|
} |
|
VideoCapture_LibRealsense::~VideoCapture_LibRealsense(){} |
|
|
|
double VideoCapture_LibRealsense::getProperty(int propIdx) const |
|
{ |
|
double propValue = 0.0; |
|
|
|
const int purePropIdx = propIdx & ~CAP_INTELPERC_GENERATORS_MASK; |
|
if((propIdx & CAP_INTELPERC_GENERATORS_MASK) == CAP_INTELPERC_IMAGE_GENERATOR) |
|
{ |
|
propValue = getImageGeneratorProperty(purePropIdx); |
|
} |
|
else if((propIdx & CAP_INTELPERC_GENERATORS_MASK) == CAP_INTELPERC_DEPTH_GENERATOR) |
|
{ |
|
propValue = getDepthGeneratorProperty(purePropIdx); |
|
} |
|
else if((propIdx & CAP_INTELPERC_GENERATORS_MASK) == CAP_INTELPERC_IR_GENERATOR) |
|
{ |
|
propValue = getIrGeneratorProperty(purePropIdx); |
|
} |
|
else |
|
{ |
|
propValue = getCommonProperty(purePropIdx); |
|
} |
|
|
|
return propValue; |
|
} |
|
|
|
double VideoCapture_LibRealsense::getImageGeneratorProperty(int propIdx) const |
|
{ |
|
double propValue = 0.0; |
|
const rs2::video_stream_profile profile = mPipe.get_active_profile().get_stream(RS2_STREAM_COLOR).as<rs2::video_stream_profile>(); |
|
if(!profile) |
|
{ |
|
return propValue; |
|
} |
|
|
|
switch(propIdx) |
|
{ |
|
case CAP_PROP_FRAME_WIDTH: |
|
propValue = static_cast<double>(profile.width()); |
|
break; |
|
case CAP_PROP_FRAME_HEIGHT: |
|
propValue = static_cast<double>(profile.height()); |
|
break; |
|
case CAP_PROP_FPS: |
|
propValue = static_cast<double>(profile.fps()); |
|
break; |
|
} |
|
|
|
return propValue; |
|
} |
|
|
|
double VideoCapture_LibRealsense::getDepthGeneratorProperty(int propIdx) const |
|
{ |
|
double propValue = 0.0; |
|
const rs2::video_stream_profile profile = mPipe.get_active_profile().get_stream(RS2_STREAM_DEPTH).as<rs2::video_stream_profile>(); |
|
const rs2::depth_sensor sensor = mPipe.get_active_profile().get_device().first<rs2::depth_sensor>(); |
|
if(!profile || !sensor) |
|
{ |
|
return propValue; |
|
} |
|
|
|
switch(propIdx) |
|
{ |
|
case CAP_PROP_FRAME_WIDTH: |
|
propValue = static_cast<double>(profile.width()); |
|
break; |
|
case CAP_PROP_FRAME_HEIGHT: |
|
propValue = static_cast<double>(profile.height()); |
|
break; |
|
case CAP_PROP_FPS: |
|
propValue = static_cast<double>(profile.fps()); |
|
break; |
|
case CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE: |
|
propValue = static_cast<double>(sensor.get_depth_scale()); |
|
break; |
|
case CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_HORZ: |
|
propValue = static_cast<double>(profile.get_intrinsics().fx); |
|
break; |
|
case CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_VERT: |
|
propValue = static_cast<double>(profile.get_intrinsics().fy); |
|
break; |
|
} |
|
|
|
return propValue; |
|
} |
|
|
|
double VideoCapture_LibRealsense::getIrGeneratorProperty(int propIdx) const |
|
{ |
|
double propValue = 0.0; |
|
const rs2::video_stream_profile profile = mPipe.get_active_profile().get_stream(RS2_STREAM_INFRARED).as<rs2::video_stream_profile>(); |
|
if(!profile) |
|
{ |
|
return propValue; |
|
} |
|
|
|
switch(propIdx) |
|
{ |
|
case CAP_PROP_FRAME_WIDTH: |
|
propValue = static_cast<double>(profile.width()); |
|
break; |
|
case CAP_PROP_FRAME_HEIGHT: |
|
propValue = static_cast<double>(profile.height()); |
|
break; |
|
case CAP_PROP_FPS: |
|
propValue = static_cast<double>(profile.fps()); |
|
break; |
|
} |
|
|
|
return propValue; |
|
} |
|
|
|
double VideoCapture_LibRealsense::getCommonProperty(int propIdx) const |
|
{ |
|
double propValue = 0.0; |
|
const rs2::video_stream_profile profile = mPipe.get_active_profile().get_stream(RS2_STREAM_DEPTH).as<rs2::video_stream_profile>(); |
|
const rs2::depth_sensor sensor = mPipe.get_active_profile().get_device().first<rs2::depth_sensor>(); |
|
if(!profile || !sensor) |
|
{ |
|
return propValue; |
|
} |
|
|
|
switch(propIdx) |
|
{ |
|
case CAP_PROP_FRAME_WIDTH: |
|
case CAP_PROP_FRAME_HEIGHT: |
|
case CAP_PROP_FPS: |
|
propValue = getDepthGeneratorProperty(propIdx); |
|
break; |
|
case CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE: |
|
propValue = static_cast<double>(sensor.get_depth_scale()); |
|
break; |
|
case CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_HORZ: |
|
propValue = static_cast<double>(profile.get_intrinsics().fx); |
|
break; |
|
case CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_VERT: |
|
propValue = static_cast<double>(profile.get_intrinsics().fy); |
|
break; |
|
} |
|
|
|
return propValue; |
|
} |
|
|
|
bool VideoCapture_LibRealsense::setProperty(int, double) |
|
{ |
|
bool isSet = false; |
|
return isSet; |
|
} |
|
|
|
bool VideoCapture_LibRealsense::grabFrame() |
|
{ |
|
if (!isOpened()) |
|
return false; |
|
|
|
try |
|
{ |
|
mData = mAlign.process(mPipe.wait_for_frames()); |
|
} |
|
catch (const rs2::error&) |
|
{ |
|
return false; |
|
} |
|
|
|
return true; |
|
} |
|
bool VideoCapture_LibRealsense::retrieveFrame(int outputType, cv::OutputArray frame) |
|
{ |
|
rs2::video_frame _frame(nullptr); |
|
int type; |
|
switch (outputType) |
|
{ |
|
case CAP_INTELPERC_DEPTH_MAP: |
|
_frame = mData.get_depth_frame().as<rs2::video_frame>(); |
|
type = CV_16UC1; |
|
break; |
|
case CAP_INTELPERC_IR_MAP: |
|
_frame = mData.get_infrared_frame(); |
|
type = CV_8UC1; |
|
break; |
|
case CAP_INTELPERC_IMAGE: |
|
_frame = mData.get_color_frame(); |
|
type = CV_8UC3; |
|
break; |
|
default: |
|
return false; |
|
} |
|
|
|
try |
|
{ |
|
// we copy the data straight away, so const_cast should be fine |
|
void* data = const_cast<void*>(_frame.get_data()); |
|
Mat(_frame.get_height(), _frame.get_width(), type, data, _frame.get_stride_in_bytes()).copyTo(frame); |
|
|
|
if(_frame.get_profile().format() == RS2_FORMAT_RGB8) |
|
cvtColor(frame, frame, COLOR_RGB2BGR); |
|
} |
|
catch (const rs2::error&) |
|
{ |
|
return false; |
|
} |
|
|
|
return true; |
|
} |
|
int VideoCapture_LibRealsense::getCaptureDomain() |
|
{ |
|
return CAP_INTELPERC; |
|
} |
|
|
|
bool VideoCapture_LibRealsense::isOpened() const |
|
{ |
|
return bool(std::shared_ptr<rs2_pipeline>(mPipe)); |
|
} |
|
|
|
Ptr<IVideoCapture> create_RealSense_capture(int index) |
|
{ |
|
return makePtr<VideoCapture_LibRealsense>(index); |
|
} |
|
|
|
|
|
} |
|
|
|
#endif
|
|
|