1 #ifndef _RSLF_DEPTH_COMPUTATION 2 #define _RSLF_DEPTH_COMPUTATION 26 template<
typename DataType>
37 float epi_scale_factor = -1,
58 Mat m_edge_confidence_u;
59 Mat m_edge_confidence_mask_u;
60 Mat m_disp_confidence_u;
93 template<
typename DataType>
104 float epi_scale_factor = -1,
121 Mat get_disparity_map(
int a_cv_colormap = cv::COLORMAP_JET);
122 int get_s_hat() {
return m_s_hat; }
131 Mat m_edge_confidence_v_u;
132 Mat m_edge_confidence_mask_v_u;
133 Mat m_disp_confidence_v_u;
135 Mat m_best_depth_v_u;
166 template<
typename DataType>
176 float epi_scale_factor = -1,
194 Mat get_disparity_map(
int a_s = -1,
int a_cv_colormap = cv::COLORMAP_JET);
198 return m_best_depth_s_v_u;
201 const Vec<Mat>& get_valid_depths_mask_s_v_u()
204 for (
int s=0; s<m_edge_confidence_s_v_u.size(); s++)
208 #ifdef _USE_DISP_CONFIDENCE_SCORE 209 validity_maps->push_back(m_disp_confidence_s_v_u[s] > m_parameters.par_disp_score_threshold);
211 validity_maps->push_back(m_edge_confidence_s_v_u[s] > m_parameters.par_edge_score_threshold);
216 validity_maps->push_back(m_edge_confidence_s_v_u[s] > -1);
219 return *validity_maps;
237 void set_accept_all(
bool b)
250 Vec<Mat> m_edge_confidence_mask_s_v_u;
255 bool m_accept_all =
false;
287 template<
typename DataType>
295 float epi_scale_factor,
298 m_parameters(parameters)
301 if (epi.depth() == CV_8U)
303 epi.convertTo(m_epi, CV_32F, 1.0/255.0);
308 if (epi_scale_factor < 0)
311 cv::split(epi, channels);
312 for (
int c=0; c<channels.size(); c++)
315 cv::minMaxLoc(epi, &min, &max);
316 epi_scale_factor = std::max((
float)max, epi_scale_factor);
319 epi.convertTo(m_epi, CV_32F, 1.0/epi_scale_factor);
324 int dim_s = m_epi.rows;
325 int dim_u = m_epi.cols;
329 m_dmin_u =
Mat(1, dim_u, CV_32FC1, cv::Scalar(dmin));
330 m_dmax_u =
Mat(1, dim_u, CV_32FC1, cv::Scalar(dmax));
333 if (s_hat < 0 || s_hat > dim_s - 1)
336 m_s_hat = (int) std::floor((0.0 + dim_s) / 2);
344 m_edge_confidence_u = cv::Mat::zeros(1, m_epi.cols, CV_32FC1);
347 m_disp_confidence_u = cv::Mat::zeros(1, m_epi.cols, CV_32FC1);
350 m_best_depth_u = cv::Mat::zeros(1, dim_u, CV_32FC1);
353 m_rbar_u = cv::Mat::zeros(1, dim_u, m_epi.type());
356 template<
typename DataType>
360 int dim_s = m_epi.rows;
361 int dim_u = m_epi.cols;
363 std::cout <<
"Max num of threads: " << omp_get_max_threads() << std::endl;
378 compute_1D_edge_confidence<DataType>(
382 m_edge_confidence_mask_u,
387 compute_1D_depth_epi<DataType>(
394 m_edge_confidence_mask_u,
404 template<
typename DataType>
408 int dim_s = m_epi.rows;
409 int dim_u = m_epi.cols;
412 Mat occlusion_map(dim_s, dim_u, CV_32FC1, -std::numeric_limits<float>::infinity());
416 cv::applyColorMap(coloured_depth.clone(), coloured_depth, a_cv_colormap);
419 Mat coloured_epi = cv::Mat::zeros(m_epi.rows, m_epi.cols, CV_8UC3);
422 for (
int u=0; u<dim_u; u++)
425 if (m_edge_confidence_mask_u.at<uchar>(u))
427 float current_depth_value = m_best_depth_u.at<
float>(u);
428 for (
int s=0; s<dim_s; s++)
431 int requested_index = u + (int)std::round(m_best_depth_u.at<
float>(u) * (m_s_hat - s));
434 requested_index > 0 &&
435 requested_index < dim_u &&
436 occlusion_map.at<
float>(s, requested_index) < current_depth_value
439 coloured_epi.at<cv::Vec3b>(s, requested_index) = coloured_depth.at<cv::Vec3b>(u);
440 occlusion_map.at<
float>(s, requested_index) = current_depth_value;
456 template<
typename DataType>
464 float epi_scale_factor,
467 m_parameters(parameters)
469 m_epis =
Vec<Mat>(epis.size(),
Mat(epis[0].rows, epis[0].cols, epis[0].type()));
473 if (epis[0].depth() != CV_8U && epi_scale_factor < 0)
475 #pragma omp parallel for 476 for (
int v=0; v<epis.size(); v++)
480 cv::split(epi, channels);
481 for (
int c=0; c<channels.size(); c++)
484 cv::minMaxLoc(epi, &min, &max);
487 epi_scale_factor = std::max((
float)max, epi_scale_factor);
494 #pragma omp parallel for 495 for (
int v=0; v<epis.size(); v++)
499 if (epi.depth() == CV_8U)
501 epi.convertTo(epi2, CV_32F, 1.0/255.0);
505 epi.convertTo(epi2, CV_32F, 1.0/epi_scale_factor);
511 int dim_s = m_epis[0].rows;
512 int dim_u = m_epis[0].cols;
513 int dim_v = m_epis.size();
517 m_dmin_v_u =
Mat(dim_v, dim_u, CV_32FC1, cv::Scalar(dmin));
518 m_dmax_v_u =
Mat(dim_v, dim_u, CV_32FC1, cv::Scalar(dmax));
521 if (s_hat < 0 || s_hat > dim_s - 1)
524 m_s_hat = (int) std::floor((0.0 + dim_s) / 2);
532 m_edge_confidence_v_u =
Mat(dim_v, dim_u, CV_32FC1);
535 m_disp_confidence_v_u =
Mat(dim_v, dim_u, CV_32FC1);
538 m_best_depth_v_u = cv::Mat::zeros(dim_v, dim_u, CV_32FC1);
541 m_rbar_v_u = cv::Mat::zeros(dim_v, dim_u, m_epis[0].type());
544 template<
typename DataType>
551 int dim_s = m_epis[0].rows;
552 int dim_v = m_epis.size();
553 int dim_u = m_epis[0].cols;
555 int thr_max = omp_get_max_threads();
556 std::cout <<
"Max num of threads: " << thr_max << std::endl;
559 for (
int t=0; t<thr_max; t++)
569 compute_1D_edge_confidence_pile<DataType>(
572 m_edge_confidence_v_u,
573 m_edge_confidence_mask_v_u,
578 compute_1D_depth_epi_pile<DataType>(
584 m_edge_confidence_v_u,
585 m_edge_confidence_mask_v_u,
586 m_disp_confidence_v_u,
594 for (
int t=0; t<thr_max; t++)
598 template<
typename DataType>
602 int dim_s = m_epis[0].rows;
603 int dim_u = m_epis[0].cols;
604 int dim_v = m_epis.size();
607 a_v = (int)std::floor(dim_v/2.0);
609 Mat epi = m_epis[a_v];
610 Mat best_depth_u = m_best_depth_v_u.row(a_v);
611 Mat edge_confidence_u = m_edge_confidence_v_u.row(a_v);
612 Mat edge_confidence_mask_u = m_edge_confidence_mask_v_u.row(a_v);
615 Mat occlusion_map(dim_s, dim_u, CV_32FC1, -std::numeric_limits<float>::infinity());
619 cv::applyColorMap(coloured_depth.clone(), coloured_depth, a_cv_colormap);
622 Mat coloured_epi = cv::Mat::zeros(epi.rows, epi.cols, CV_8UC3);
625 #pragma omp parallel for 626 for (
int u=0; u<dim_u; u++)
629 if (edge_confidence_mask_u.at<uchar>(u))
631 float current_depth_value = best_depth_u.at<
float>(u);
632 for (
int s=0; s<dim_s; s++)
635 int requested_index = u + (int)std::round(best_depth_u.at<
float>(u) * (m_s_hat - s));
638 requested_index > -1 &&
639 requested_index < dim_u &&
640 occlusion_map.at<
float>(s, requested_index) < current_depth_value
643 coloured_epi.at<cv::Vec3b>(s, requested_index) = coloured_depth.at<cv::Vec3b>(u);
644 occlusion_map.at<
float>(s, requested_index) = current_depth_value;
653 template<
typename DataType>
657 int dim_s = m_epis[0].rows;
658 int dim_u = m_epis[0].cols;
659 int dim_v = m_epis.size();
664 cv::applyColorMap(disparity_map, disparity_map, a_cv_colormap);
667 Mat disparity_map_with_scores = cv::Mat::zeros(dim_v, dim_u, disparity_map.type());
669 cv::add(disparity_map, disparity_map_with_scores, disparity_map_with_scores, m_edge_confidence_mask_v_u);
671 return disparity_map_with_scores;
682 template<
typename DataType>
689 float epi_scale_factor,
693 m_parameters(parameters),
696 m_epis =
Vec<Mat>(epis.size(),
Mat(epis[0].rows, epis[0].cols, epis[0].type()));
700 if (epis[0].depth() != CV_8U && epi_scale_factor < 0)
702 #pragma omp parallel for 703 for (
int v=0; v<epis.size(); v++)
707 cv::split(epi, channels);
708 for (
int c=0; c<channels.size(); c++)
711 cv::minMaxLoc(epi, &min, &max);
714 epi_scale_factor = std::max((
float)max, epi_scale_factor);
721 #pragma omp parallel for 722 for (
int v=0; v<epis.size(); v++)
726 if (epi.depth() == CV_8U)
728 epi.convertTo(epi2, CV_32F, 1.0/255.0);
732 epi.convertTo(epi2, CV_32F, 1.0/epi_scale_factor);
738 int dim_s = m_epis[0].rows;
739 int dim_u = m_epis[0].cols;
740 int dim_v = m_epis.size();
744 for (
int s=0; s<dim_s; s++)
746 m_dmin_s_v_u.push_back(
Mat(dim_v, dim_u, CV_32FC1, cv::Scalar(dmin)));
747 m_dmax_s_v_u.push_back(
Mat(dim_v, dim_u, CV_32FC1, cv::Scalar(dmax)));
750 m_edge_confidence_s_v_u =
Vec<Mat>(dim_s);
751 m_disp_confidence_s_v_u =
Vec<Mat>(dim_s);
752 m_best_depth_s_v_u =
Vec<Mat>(dim_s);
755 for (
int s=0; s<dim_s; s++)
758 m_edge_confidence_s_v_u[s] =
Mat(dim_v, dim_u, CV_32FC1);
761 m_disp_confidence_s_v_u[s] =
Mat(dim_v, dim_u, CV_32FC1);
764 m_best_depth_s_v_u[s] = cv::Mat::zeros(dim_v, dim_u, CV_32FC1);
767 m_rbar_s_v_u[s] = cv::Mat::zeros(dim_v, dim_u, m_epis[0].type());
771 template<
typename DataType>
775 int dim_s = m_epis[0].rows;
776 int dim_v = m_epis.size();
777 int dim_u = m_epis[0].cols;
779 int thr_max = omp_get_max_threads();
783 std::cout <<
"Max num of threads: " << thr_max << std::endl;
784 std::cout <<
"Slope factor: " << m_parameters.par_slope_factor << std::endl;
788 for (
int t=0; t<thr_max; t++)
798 compute_2D_edge_confidence<DataType>(
800 m_edge_confidence_s_v_u,
801 m_edge_confidence_mask_s_v_u,
806 compute_2D_depth_epi<DataType>(
811 m_edge_confidence_s_v_u,
812 m_edge_confidence_mask_s_v_u,
813 m_disp_confidence_s_v_u,
821 for (
int t=0; t<thr_max; t++)
822 delete m_buffers_[t];
825 template<
typename DataType>
829 int dim_s = m_epis[0].rows;
830 int dim_u = m_epis[0].cols;
831 int dim_v = m_epis.size();
834 a_v = (int)std::floor(dim_v/2.0);
837 Mat best_depth_s_u = cv::Mat::zeros(dim_s, dim_u, CV_32FC1);
840 #pragma omp parallel for 841 for (
int s=0; s<dim_s; s++)
843 m_best_depth_s_v_u[s].row(a_v).copyTo(best_depth_s_u.row(s));
848 cv::applyColorMap(coloured_depth.clone(), coloured_depth, a_cv_colormap);
850 Mat coloured_epi = cv::Mat::zeros(dim_s, dim_u, CV_8UC3);
851 for (
int s=0; s<dim_s; s++)
853 Mat edge_confidence_mask_u = m_edge_confidence_mask_s_v_u[s].row(a_v);
854 Mat disp_confidence_mask_u = m_disp_confidence_s_v_u[s].row(a_v) > m_parameters.par_disp_score_threshold;
855 for (
int u=0; u<dim_u; u++)
858 #ifdef _USE_DISP_CONFIDENCE_SCORE 859 if (disp_confidence_mask_u.at<uchar>(u))
861 if (edge_confidence_mask_u.at<uchar>(u))
864 coloured_epi.at<cv::Vec3b>(s, u) = coloured_depth.at<cv::Vec3b>(s, u);
872 template<
typename DataType>
876 int dim_s = m_epis[0].rows;
877 int dim_u = m_epis[0].cols;
878 int dim_v = m_epis.size();
881 a_s = (int)std::floor(dim_s/2.0);
884 Mat best_depth_v_u = m_best_depth_s_v_u[a_s];
885 Mat edge_confidence_mask_v_u = m_edge_confidence_mask_s_v_u[a_s];
886 Mat disp_confidence_v_u = m_disp_confidence_s_v_u[a_s];
887 Mat disp_confidence_mask_v_u = disp_confidence_v_u > m_parameters.par_disp_score_threshold;
890 cv::applyColorMap(disparity_map, disparity_map, a_cv_colormap);
893 Mat disparity_map_with_scores = cv::Mat::zeros(dim_v, dim_u, disparity_map.type());
895 #ifdef _USE_DISP_CONFIDENCE_SCORE 896 cv::add(disparity_map, disparity_map_with_scores, disparity_map_with_scores, disp_confidence_mask_v_u);
898 cv::add(disparity_map, disparity_map_with_scores, disparity_map_with_scores, edge_confidence_mask_v_u);
901 return disparity_map_with_scores;
Impelment a structure containing all the algorithm parameters.
Definition: rslf_depth_computation_core.hpp:65
Implement a buffer containing re-usable temporary variables in order to avoid multiple unnecessary al...
Definition: rslf_depth_computation_core.hpp:145
std::vector< T > Vec
RSLF Vector class (std::vector)
Definition: rslf_types.hpp:32
Mat get_coloured_epi(int a_v=-1, int a_cv_colormap=cv::COLORMAP_JET)
Gets an EPI with colors corresponding to the computed slopes.
Definition: rslf_depth_computation.hpp:599
void run()
Runs the algorithm.
Definition: rslf_depth_computation.hpp:772
Definition: rslf_depth_computation.hpp:14
Implement functions to scale and plot matrices.
Definition: rslf_depth_computation.hpp:94
Mat copy_and_scale_uchar(Mat img)
Build a copy of the matrix scaled to uchar (0..255).
Definition: rslf_plot.cpp:41
Implement low-level depth computation functions.
void run()
Runs the algorithm.
Definition: rslf_depth_computation.hpp:357
Mat get_coloured_epi(int a_cv_colormap=cv::COLORMAP_JET)
Gets an EPI with colors corresponding to the computed slopes.
Definition: rslf_depth_computation.hpp:405
cv::Mat Mat
RSLF Matrix class (cv::Mat)
Definition: rslf_types.hpp:26
Mat get_coloured_epi(int a_v=-1, int a_cv_colormap=cv::COLORMAP_JET)
Gets an EPI with colors corresponding to the computed slopes.
Definition: rslf_depth_computation.hpp:826
Mat get_disparity_map(int a_cv_colormap=cv::COLORMAP_JET)
Gets a disparity map with colors corresponding to the computed disparity.
Definition: rslf_depth_computation.hpp:654
void run()
Runs the algorithm.
Definition: rslf_depth_computation.hpp:545
Mat get_disparity_map(int a_s=-1, int a_cv_colormap=cv::COLORMAP_JET)
Gets a disparity map with colors corresponding to the computed disparity.
Definition: rslf_depth_computation.hpp:873
Definition: rslf_depth_computation.hpp:167
Template class with depth computation using 1d slices of the EPI.
Definition: rslf_depth_computation.hpp:27