70 if( !cap.initializeVideo(-1) )
72 std::cerr <<
"Cannot open camera video capture" << std::endl;
73 std::cerr <<
"See verbosity level for more details." << std::endl;
77 int sn = cap.getSerialNumber();
78 std::cout <<
"Connected to camera sn: " << sn << std::endl;
82 std::string calibration_file;
84 unsigned int serial_number = sn;
88 std::cerr <<
"Could not load calibration file from Stereolabs servers" << std::endl;
91 std::cout <<
"Calibration file found. Loading..." << std::endl;
95 cap.getFrameSize(w,h);
99 cv::Mat map_left_x, map_left_y;
100 cv::Mat map_right_x, map_right_y;
101 cv::Mat cameraMatrix_left, cameraMatrix_right;
104 cameraMatrix_left, cameraMatrix_right, &baseline);
106 double fx = cameraMatrix_left.at<
double>(0,0);
107 double fy = cameraMatrix_left.at<
double>(1,1);
108 double cx = cameraMatrix_left.at<
double>(0,2);
109 double cy = cameraMatrix_left.at<
double>(1,2);
111 std::cout <<
" Camera Matrix L: \n" << cameraMatrix_left << std::endl << std::endl;
112 std::cout <<
" Camera Matrix R: \n" << cameraMatrix_right << std::endl << std::endl;
115 cv::UMat map_left_x_gpu = map_left_x.getUMat(cv::ACCESS_READ,cv::USAGE_ALLOCATE_DEVICE_MEMORY);
116 cv::UMat map_left_y_gpu = map_left_y.getUMat(cv::ACCESS_READ,cv::USAGE_ALLOCATE_DEVICE_MEMORY);
117 cv::UMat map_right_x_gpu = map_right_x.getUMat(cv::ACCESS_READ,cv::USAGE_ALLOCATE_DEVICE_MEMORY);
118 cv::UMat map_right_y_gpu = map_right_y.getUMat(cv::ACCESS_READ,cv::USAGE_ALLOCATE_DEVICE_MEMORY);
125 cv::UMat
frameBGR(cv::USAGE_ALLOCATE_DEVICE_MEMORY);
126 cv::UMat
left_raw(cv::USAGE_ALLOCATE_DEVICE_MEMORY);
127 cv::UMat
right_raw(cv::USAGE_ALLOCATE_DEVICE_MEMORY);
128 cv::UMat
left_rect(cv::USAGE_ALLOCATE_DEVICE_MEMORY);
129 cv::UMat
right_rect(cv::USAGE_ALLOCATE_DEVICE_MEMORY);
132 cv::UMat left_disp_half(cv::USAGE_ALLOCATE_DEVICE_MEMORY);
133 cv::UMat
left_disp(cv::USAGE_ALLOCATE_DEVICE_MEMORY);
134 cv::UMat left_disp_float(cv::USAGE_ALLOCATE_DEVICE_MEMORY);
135 cv::UMat left_disp_image(cv::USAGE_ALLOCATE_DEVICE_MEMORY);
136 cv::UMat left_depth_map(cv::USAGE_ALLOCATE_DEVICE_MEMORY);
138 cv::Mat
frameBGR,
left_raw,
left_rect,
right_raw,
right_rect,
frameYUV,
left_for_matcher,
right_for_matcher, left_disp_half,
left_disp,left_disp_float,
left_disp_vis;
171 #ifdef HAVE_OPENCV_VIZ
172 cv::viz::Viz3d pc_viewer = cv::viz::Viz3d(
"Point Cloud" );
192 cv::Mat frameYUV_cpu = cv::Mat( frame.
height, frame.
width, CV_8UC2, frame.
data );
193 frameYUV = frameYUV_cpu.getUMat(cv::ACCESS_READ,cv::USAGE_ALLOCATE_HOST_MEMORY);
214 double remap_elapsed = remap_clock.
toc();
215 std::stringstream remapElabInfo;
216 remapElabInfo <<
"Rectif. processing: " << remap_elapsed <<
" sec - Freq: " << 1./remap_elapsed;
221 double resize_fact = 1.0;
222 #ifdef USE_HALF_SIZE_DISP
234 left_disp_half.convertTo(left_disp_float,CV_32FC1);
235 cv::multiply(left_disp_float,1./16.,left_disp_float);
237 #ifdef USE_HALF_SIZE_DISP
238 cv::multiply(left_disp_float,2.,left_disp_float);
239 cv::UMat tmp = left_disp_float;
240 cv::resize(tmp, left_disp_float, cv::Size(), 1./resize_fact, 1./resize_fact, cv::INTER_AREA);
246 double elapsed = stereo_clock.
toc();
247 std::stringstream stereoElabInfo;
248 stereoElabInfo <<
"Stereo processing: " << elapsed <<
" sec - Freq: " << 1./elapsed;
260 cv::applyColorMap(left_disp_image,left_disp_image,cv::COLORMAP_JET);
270 double num =
static_cast<double>(fx*baseline);
271 cv::divide(num,left_disp_float,left_depth_map);
273 float central_depth = left_depth_map.getMat(cv::ACCESS_READ).at<
float>(left_depth_map.rows/2, left_depth_map.cols/2 );
274 std::cout <<
"Depth of the central pixel: " << central_depth <<
" mm" << std::endl;
279 size_t buf_size =
static_cast<size_t>(left_depth_map.cols * left_depth_map.rows);
280 std::vector<cv::Vec3d> buffer( buf_size, cv::Vec3f::all( std::numeric_limits<float>::quiet_NaN() ) );
281 cv::Mat depth_map_cpu = left_depth_map.getMat(cv::ACCESS_READ);
282 float* depth_vec = (
float*)(&(depth_map_cpu.data[0]));
284 #pragma omp parallel for
285 for(
size_t idx=0; idx<buf_size;idx++ )
287 size_t r = idx/left_depth_map.cols;
288 size_t c = idx%left_depth_map.cols;
289 double depth =
static_cast<double>(depth_vec[idx]);
293 buffer[idx].val[2] = depth;
294 buffer[idx].val[0] = (c-cx)*depth/fx;
295 buffer[idx].val[1] = (r-cy)*depth/fy;
299 cloudMat = cv::Mat( left_depth_map.rows, left_depth_map.cols, CV_64FC3, &buffer[0] ).clone();
301 double pc_elapsed = stereo_clock.
toc();
302 std::stringstream pcElabInfo;
310 int key = cv::waitKey( 5 );
311 if(key==
'q' || key==
'Q')
315 #ifdef HAVE_OPENCV_VIZ
317 cv::viz::WCloud cloudWidget( cloudMat,
left_rect );
318 cloudWidget.setRenderingProperty( cv::viz::POINT_SIZE, 1 );
319 pc_viewer.showWidget(
"Point Cloud", cloudWidget );
320 pc_viewer.spinOnce(1);
322 if(pc_viewer.wasStopped())
The VideoCapture class provides image grabbing functions and settings control for all the Stereolabs ...
@ FPS_30
30 Frames per second. Not available for RESOLUTION::HD2K.
The Frame struct containing the acquired video frames.
uint64_t timestamp
Timestamp in nanoseconds.
uint16_t height
Frame height.
uint16_t width
Frame width.
uint8_t * data
Frame data in YUV 4:2:2 format.
The camera configuration parameters.
RESOLUTION res
Camera resolution.
FPS fps
Frames per second.
sl_oc::tools::StereoSgbmPar stereoPar
sl_oc::video::VideoParams params
cv::Mat right_for_matcher
cv::Ptr< cv::StereoSGBM > left_matcher