\section{Camera Calibration and 3d Reconstruction} \cvclass{gpu::StereoBM\_GPU} The class for computing stereo correspondence using block matching algorithm. \begin{lstlisting} class StereoBM_GPU { public: enum { BASIC_PRESET = 0, PREFILTER_XSOBEL = 1 }; enum { DEFAULT_NDISP = 64, DEFAULT_WINSZ = 19 }; StereoBM_GPU(); StereoBM_GPU(int preset, int ndisparities = DEFAULT_NDISP, int winSize = DEFAULT_WINSZ); void operator() (const GpuMat& left, const GpuMat& right, GpuMat& disparity); void operator() (const GpuMat& left, const GpuMat& right, GpuMat& disparity, const Stream & stream); static bool checkIfGpuCallReasonable(); int preset; int ndisp; int winSize; float avergeTexThreshold; ... }; \end{lstlisting} The class computes the disparity map using block matching algorithm. The class also does some pre- and post- processing steps: sobel prefilter (if use \texttt{PREFILTER\_XSOBEL} preset) and textureless threshold post processing (if \texttt{avergeTexThreshold} $>$ 0). If \texttt{avergeTexThreshold = 0} post procesing is disabled, otherwise disparity is set 0 in each point \texttt{(x, y)} where for left image $\sum HorizontalGradiensInWindow(x, y, winSize) < (winSize \cdot winSize) \cdot avergeTexThreshold$ i.e. input left image is low textured. \cvfunc{cv::gpu::StereoBM\_GPU::StereoBM\_GPU}\label{cppfunc.gpu.StereoBM.StereoBM} StereoBM\_GPU constructors. \cvdefCpp{ StereoBM\_GPU::StereoBM\_GPU();\newline StereoBM\_GPU::StereoBM\_GPU(int preset, \par int ndisparities = DEFAULT\_NDISP, \par int winSize = DEFAULT\_WINSZ); } \begin{description} \cvarg{preset}{Camera-specific preset:} \begin{description} \cvarg{BASIC\_PRESET}{Without preprocessing.} \cvarg{PREFILTER\_XSOBEL}{Sobel prefilter.} \end{description} \cvarg{ndisparities}{Number of disparities. Must be multiple of 8 and less then 256.} \cvarg{winSize}{SAD window size.} \end{description} \cvfunc{cv::gpu::StereoBM\_GPU::operator ()}\label{cppfunc.gpu.StereoBM.operator()} The stereo correspondence operator. Finds the disparity for the specified rectified stereo pair. \cvdefCpp{ void StereoBM\_GPU::operator() (const GpuMat\& left, const GpuMat\& right, \par GpuMat\& disparity);\newline void StereoBM\_GPU::operator() (const GpuMat\& left, const GpuMat\& right, \par GpuMat\& disparity, const Stream\& stream); } \begin{description} \cvarg{left}{Left image; supports only \texttt{CV\_8UC1} type.} \cvarg{right}{Right image with the same size and the same type as the left one.} \cvarg{disparity}{Output disparity map. It will be \texttt{CV\_8UC1} image with the same size as the input images.} \cvarg{stream}{Stream for the asynchronous version.} \end{description} \cvfunc{cv::gpu::StereoBM\_GPU::checkIfGpuCallReasonable}\label{cppfunc.gpu.StereoBM.checkIfGpuCallReasonable} Some heuristics that tries to estmate if current GPU will be faster then CPU in this algorithm. It queries current active device. \cvdefCpp{ bool StereoBM\_GPU::checkIfGpuCallReasonable(); } \cvclass{gpu::StereoBeliefPropagation} The class for computing stereo correspondence using belief propagation algorithm. \begin{lstlisting} class StereoBeliefPropagation { public: enum { DEFAULT_NDISP = 64 }; enum { DEFAULT_ITERS = 5 }; enum { DEFAULT_LEVELS = 5 }; static void estimateRecommendedParams(int width, int height, int& ndisp, int& iters, int& levels); explicit StereoBeliefPropagation(int ndisp = DEFAULT_NDISP, int iters = DEFAULT_ITERS, int levels = DEFAULT_LEVELS, int msg_type = CV_32F); StereoBeliefPropagation(int ndisp, int iters, int levels, float max_data_term, float data_weight, float max_disc_term, float disc_single_jump, int msg_type = CV_32F); void operator()(const GpuMat& left, const GpuMat& right, GpuMat& disparity); void operator()(const GpuMat& left, const GpuMat& right, GpuMat& disparity, Stream& stream); void operator()(const GpuMat& data, GpuMat& disparity); void operator()(const GpuMat& data, GpuMat& disparity, Stream& stream); int ndisp; int iters; int levels; float max_data_term; float data_weight; float max_disc_term; float disc_single_jump; int msg_type; ... }; \end{lstlisting} The class implements Pedro F. Felzenszwalb algorithm \cite{felzenszwalb_bp}. It can compute own data cost (using truncated linear model) or use user-provided data cost. \cvCppFunc{gpu::StereoBeliefPropagation::StereoBeliefPropagation} StereoBeliefPropagation constructors. \cvdefCpp{ StereoBeliefPropagation::StereoBeliefPropagation(\par int ndisp = DEFAULT\_NDISP, int iters = DEFAULT\_ITERS, \par int levels = DEFAULT\_LEVELS, int msg\_type = CV\_32F);\newline StereoBeliefPropagation::StereoBeliefPropagation(\par int ndisp, int iters, int levels, \par float max\_data\_term, float data\_weight, \par float max\_disc\_term, float disc\_single\_jump, \par int msg\_type = CV\_32F); } \begin{description} \cvarg{ndisp}{Number of disparities.} \cvarg{iters}{Number of BP iterations on each level.} \cvarg{levels}{Number of levels.} \cvarg{max\_data\_term}{Truncation of data cost.} \cvarg{data\_weight}{Data weight.} \cvarg{max\_disc\_term}{Truncation of discontinuity.} \cvarg{disc\_single\_jump}{Discontinuity single jump.} \cvarg{msg\_type}{Type for messages. Supports \texttt{CV\_16SC1} and \texttt{CV\_32FC1}.} \end{description} \texttt{StereoBeliefPropagation} uses truncated linear model for the data cost and discontinuity term: \[ DataCost = data\_weight \cdot \min(\lvert I_2-I_1 \rvert, max\_data\_term) \] \[ DiscTerm = \min(disc\_single\_jump \cdot \lvert f_1-f_2 \rvert, max\_disc\_term) \] For more details please see \cite{felzenszwalb_bp}. By default \texttt{StereoBeliefPropagation} uses floating-point arithmetics and \texttt{CV\_32FC1} type for messages. But also it can use fixed-point arithmetics and \texttt{CV\_16SC1} type for messages for better perfomance. \cvCppFunc{gpu::StereoBeliefPropagation::estimateRecommendedParams} Some heuristics that tries to compute parameters (\texttt{ndisp}, \texttt{iters} and \texttt{levels}) for specified image size (\texttt{width} and \texttt{height}). \cvdefCpp{ void StereoBeliefPropagation::estimateRecommendedParams(\par int width, int height, int\& ndisp, int\& iters, int\& levels); } \cvCppFunc{gpu::StereoBeliefPropagation::operator ()} The stereo correspondence operator. Finds the disparity for the specified rectified stereo pair or data cost. \cvdefCpp{ void StereoBeliefPropagation::operator()(\par const GpuMat\& left, const GpuMat\& right, \par GpuMat\& disparity);\newline void StereoBeliefPropagation::operator()(\par const GpuMat\& left, const GpuMat\& right, \par GpuMat\& disparity, Stream\& stream); } \begin{description} \cvarg{left}{Left image; supports \texttt{CV\_8UC1}, \texttt{CV\_8UC3} and \texttt{CV\_8UC4} types.} \cvarg{right}{Right image with the same size and the same type as the left one.} \cvarg{disparity}{Output disparity map. If \texttt{disparity} is empty output type will be \texttt{CV\_16SC1}, otherwise output type will be \texttt{disparity.type()}.} \cvarg{stream}{Stream for the asynchronous version.} \end{description} \cvdefCpp{ void StereoBeliefPropagation::operator()(\par const GpuMat\& data, GpuMat\& disparity);\newline void StereoBeliefPropagation::operator()(\par const GpuMat\& data, GpuMat\& disparity, Stream\& stream); } \begin{description} \cvarg{data}{The user specified data cost. It must have \texttt{msg\_type} type and $\texttt{imgRows} \cdot \texttt{ndisp} \times \texttt{imgCols}$ size.} \cvarg{disparity}{Output disparity map. If \texttt{disparity} is empty output type will be \texttt{CV\_16SC1}, otherwise output type will be \texttt{disparity.type()}.} \cvarg{stream}{Stream for the asynchronous version.} \end{description} \cvclass{gpu::StereoConstantSpaceBP} The class for computing stereo correspondence using constant space belief propagation algorithm. \begin{lstlisting} class StereoConstantSpaceBP { public: enum { DEFAULT_NDISP = 128 }; enum { DEFAULT_ITERS = 8 }; enum { DEFAULT_LEVELS = 4 }; enum { DEFAULT_NR_PLANE = 4 }; static void estimateRecommendedParams(int width, int height, int& ndisp, int& iters, int& levels, int& nr_plane); explicit StereoConstantSpaceBP(int ndisp = DEFAULT_NDISP, int iters = DEFAULT_ITERS, int levels = DEFAULT_LEVELS, int nr_plane = DEFAULT_NR_PLANE, int msg_type = CV_32F); StereoConstantSpaceBP(int ndisp, int iters, int levels, int nr_plane, float max_data_term, float data_weight, float max_disc_term, float disc_single_jump, int min_disp_th = 0, int msg_type = CV_32F); void operator()(const GpuMat& left, const GpuMat& right, GpuMat& disparity); void operator()(const GpuMat& left, const GpuMat& right, GpuMat& disparity, Stream& stream); int ndisp; int iters; int levels; int nr_plane; float max_data_term; float data_weight; float max_disc_term; float disc_single_jump; int min_disp_th; int msg_type; bool use_local_init_data_cost; ... }; \end{lstlisting} The class implements Q. Yang algorithm \cite{qx_csbp}. \texttt{StereoConstantSpaceBP} can use global minimum or local minimum selection method. By default it use local minimum selection method (\texttt{use\_local\_init\_data\_cost = true}). \cvCppFunc{gpu::StereoConstantSpaceBP::StereoConstantSpaceBP} StereoConstantSpaceBP constructors. \cvdefCpp{ StereoConstantSpaceBP::StereoConstantSpaceBP(int ndisp = DEFAULT\_NDISP, \par int iters = DEFAULT\_ITERS, int levels = DEFAULT\_LEVELS, \par int nr\_plane = DEFAULT\_NR\_PLANE, int msg\_type = CV\_32F);\newline StereoConstantSpaceBP::StereoConstantSpaceBP(int ndisp, int iters, \par int levels, int nr\_plane, \par float max\_data\_term, float data\_weight, \par float max\_disc\_term, float disc\_single\_jump, \par int min\_disp\_th = 0, int msg\_type = CV\_32F); } \begin{description} \cvarg{ndisp}{Number of disparities.} \cvarg{iters}{Number of BP iterations on each level.} \cvarg{levels}{Number of levels.} \cvarg{nr\_plane}{Number of disparity levels on the first level} \cvarg{max\_data\_term}{Truncation of data cost.} \cvarg{data\_weight}{Data weight.} \cvarg{max\_disc\_term}{Truncation of discontinuity.} \cvarg{disc\_single\_jump}{Discontinuity single jump.} \cvarg{min\_disp\_th}{Minimal disparity threshold.} \cvarg{msg\_type}{Type for messages. Supports \texttt{CV\_16SC1} and \texttt{CV\_32FC1}.} \end{description} \texttt{StereoConstantSpaceBP} uses truncated linear model for the data cost and discontinuity term: \[ DataCost = data\_weight \cdot \min(\lvert I_2-I_1 \rvert, max\_data\_term) \] \[ DiscTerm = \min(disc\_single\_jump \cdot \lvert f_1-f_2 \rvert, max\_disc\_term) \] For more details please see \cite{qx_csbp}. By default \texttt{StereoConstantSpaceBP} uses floating-point arithmetics and \texttt{CV\_32FC1} type for messages. But also it can use fixed-point arithmetics and \texttt{CV\_16SC1} type for messages for better perfomance. \cvCppFunc{gpu::StereoConstantSpaceBP::estimateRecommendedParams} Some heuristics that tries to compute parameters (\texttt{ndisp}, \texttt{iters}, \texttt{levels} and \texttt{nr\_plane}) for specified image size (\texttt{width} and \texttt{height}). \cvdefCpp{ void StereoConstantSpaceBP::estimateRecommendedParams(\par int width, int height, \par int\& ndisp, int\& iters, int\& levels, int\& nr\_plane); } \cvCppFunc{gpu::StereoConstantSpaceBP::operator ()} The stereo correspondence operator. Finds the disparity for the specified rectified stereo pair. \cvdefCpp{ void StereoConstantSpaceBP::operator()(\par const GpuMat\& left, const GpuMat\& right, \par GpuMat\& disparity);\newline void StereoConstantSpaceBP::operator()(\par const GpuMat\& left, const GpuMat\& right, \par GpuMat\& disparity, Stream\& stream); } \begin{description} \cvarg{left}{Left image; supports \texttt{CV\_8UC1}, \texttt{CV\_8UC3} and \texttt{CV\_8UC4} types.} \cvarg{right}{Right image with the same size and the same type as the left one.} \cvarg{disparity}{Output disparity map. If \texttt{disparity} is empty output type will be \texttt{CV\_16SC1}, otherwise output type will be \texttt{disparity.type()}.} \cvarg{stream}{Stream for the asynchronous version.} \end{description} \cvclass{gpu::DisparityBilateralFilter} The class for disparity map refinement using joint bilateral filtering. \begin{lstlisting} class CV_EXPORTS DisparityBilateralFilter { public: enum { DEFAULT_NDISP = 64 }; enum { DEFAULT_RADIUS = 3 }; enum { DEFAULT_ITERS = 1 }; explicit DisparityBilateralFilter(int ndisp = DEFAULT_NDISP, int radius = DEFAULT_RADIUS, int iters = DEFAULT_ITERS); DisparityBilateralFilter(int ndisp, int radius, int iters, float edge_threshold, float max_disc_threshold, float sigma_range); void operator()(const GpuMat& disparity, const GpuMat& image, GpuMat& dst); void operator()(const GpuMat& disparity, const GpuMat& image, GpuMat& dst, Stream& stream); ... }; \end{lstlisting} The class implements disparity map refinement using joint bilateral filtering given a single color image described in \cite{qx_csbp}. \cvCppFunc{gpu::DisparityBilateralFilter::DisparityBilateralFilter} DisparityBilateralFilter constructors \cvdefCpp{ DisparityBilateralFilter::DisparityBilateralFilter(\par int ndisp = DEFAULT\_NDISP, int radius = DEFAULT\_RADIUS, \par int iters = DEFAULT\_ITERS);\newline DisparityBilateralFilter::DisparityBilateralFilter(\par int ndisp, int radius, int iters, \par float edge\_threshold, float max\_disc\_threshold, \par float sigma\_range); } \begin{description} \cvarg{ndisp}{Number of disparities.} \cvarg{radius}{Filter radius.} \cvarg{iters}{Number of iterations.} \cvarg{edge\_threshold}{Truncation of data continuity.} \cvarg{max\_disc\_threshold}{Truncation of disparity continuity.} \cvarg{sigma\_range}{Filter range.} \end{description} \cvCppFunc{gpu::DisparityBilateralFilter::operator ()} Refines disparity map using joint bilateral filtering. \cvdefCpp{ void DisparityBilateralFilter::operator()(\par const GpuMat\& disparity, const GpuMat\& image, GpuMat\& dst);\newline void DisparityBilateralFilter::operator()(\par const GpuMat\& disparity, const GpuMat\& image, GpuMat\& dst, \par Stream\& stream); } \begin{description} \cvarg{disparity}{Input disparity map; supports \texttt{CV\_8UC1} and \texttt{CV\_16SC1} types.} \cvarg{image}{Input image; supports \texttt{CV\_8UC1} and \texttt{CV\_8UC3} types.} \cvarg{dst}{Destination disparity map; will have the same size and type as \texttt{disparity}.} \cvarg{stream}{Stream for the asynchronous version.} \end{description} \cvCppFunc{gpu::drawColorDisp} Does coloring of disparity image. \cvdefCpp{ void drawColorDisp(const GpuMat\& src\_disp, GpuMat\& dst\_disp, int ndisp);\newline void drawColorDisp(const GpuMat\& src\_disp, GpuMat\& dst\_disp, int ndisp, \par const Stream\& stream); } \begin{description} \cvarg{src\_disp}{Source disparity image. Supports \texttt{CV\_8UC1} and \texttt{CV\_16SC1} types.} \cvarg{dst\_disp}{Output disparity image. Will have the same size as \texttt{src\_disp} and \texttt{CV\_8UC4} type in \texttt{BGRA} format (alpha = 255).} \cvarg{ndisp}{Number of disparities.} \cvarg{stream}{Stream for the asynchronous version.} \end{description} This function converts $[0..ndisp)$ interval to $[0..240, 1, 1]$ in \texttt{HSV} color space, than convert \texttt{HSV} color space to \texttt{RGB}. \cvCppFunc{gpu::reprojectImageTo3D} Reprojects disparity image to 3D space. \cvdefCpp{ void reprojectImageTo3D(const GpuMat\& disp, GpuMat\& xyzw, \par const Mat\& Q);\newline void reprojectImageTo3D(const GpuMat\& disp, GpuMat\& xyzw, \par const Mat\& Q, const Stream\& stream); } \begin{description} \cvarg{disp}{Input disparity image; supports \texttt{CV\_8U} and \texttt{CV\_16S} types.} \cvarg{xyzw}{Output 4-channel floating-point image of the same size as \texttt{disp}. Each element of \texttt{xyzw(x,y)} will contain the 3D coordinates \texttt{(x,y,z,1)} of the point \texttt{(x,y)}, computed from the disparity map.} \cvarg{Q}{$4 \times 4$ perspective transformation matrix that can be obtained via \cvCross{StereoRectify}{stereoRectify}.} \cvarg{stream}{Stream for the asynchronous version.} \end{description} See also: \cvCppCross{reprojectImageTo3D}.