提交 be9bb8f1 编写于 作者: V Vladislav Vinogradov

refactored StereoConstantSpaceBP

上级 d0e89337
...@@ -112,63 +112,30 @@ public: ...@@ -112,63 +112,30 @@ public:
CV_EXPORTS Ptr<gpu::StereoBeliefPropagation> CV_EXPORTS Ptr<gpu::StereoBeliefPropagation>
createStereoBeliefPropagation(int ndisp = 64, int iters = 5, int levels = 5, int msg_type = CV_32F); createStereoBeliefPropagation(int ndisp = 64, int iters = 5, int levels = 5, int msg_type = CV_32F);
/////////////////////////////////////////
// StereoConstantSpaceBP
//! "A Constant-Space Belief Propagation Algorithm for Stereo Matching"
// "A Constant-Space Belief Propagation Algorithm for Stereo Matching" //! Qingxiong Yang, Liang Wang, Narendra Ahuja
// Qingxiong Yang, Liang Wang, Narendra Ahuja //! http://vision.ai.uiuc.edu/~qyang6/
// http://vision.ai.uiuc.edu/~qyang6/ class CV_EXPORTS StereoConstantSpaceBP : public gpu::StereoBeliefPropagation
class CV_EXPORTS StereoConstantSpaceBP
{ {
public: public:
enum { DEFAULT_NDISP = 128 }; //! number of active disparity on the first level
enum { DEFAULT_ITERS = 8 }; virtual int getNrPlane() const = 0;
enum { DEFAULT_LEVELS = 4 }; virtual void setNrPlane(int nr_plane) = 0;
enum { DEFAULT_NR_PLANE = 4 };
static void estimateRecommendedParams(int width, int height, int& ndisp, int& iters, int& levels, int& nr_plane);
//! the default constructor
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);
//! the full constructor taking the number of disparities, number of BP iterations on each level,
//! number of levels, number of active disparity on the first level, truncation of data cost, data weight,
//! truncation of discontinuity cost, discontinuity single jump and minimum disparity threshold
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);
//! the stereo correspondence operator. Finds the disparity for the specified rectified stereo pair,
//! if disparity is empty output type will be CV_16S else output type will be disparity.type().
void operator()(const GpuMat& left, const GpuMat& right, GpuMat& disparity, Stream& stream = Stream::Null());
int ndisp; virtual bool getUseLocalInitDataCost() const = 0;
virtual void setUseLocalInitDataCost(bool use_local_init_data_cost) = 0;
int iters;
int levels;
int nr_plane;
float max_data_term; static void estimateRecommendedParams(int width, int height, int& ndisp, int& iters, int& levels, int& nr_plane);
float data_weight; };
float max_disc_term;
float disc_single_jump;
int min_disp_th; CV_EXPORTS Ptr<gpu::StereoConstantSpaceBP>
createStereoConstantSpaceBP(int ndisp = 128, int iters = 8, int levels = 4, int nr_plane = 4, int msg_type = CV_32F);
int msg_type;
bool use_local_init_data_cost;
private:
GpuMat messages_buffers;
GpuMat temp;
GpuMat out;
};
// Disparity map refinement using joint bilateral filtering given a single color image. // Disparity map refinement using joint bilateral filtering given a single color image.
// Qingxiong Yang, Liang Wang, Narendra Ahuja // Qingxiong Yang, Liang Wang, Narendra Ahuja
......
...@@ -141,13 +141,13 @@ PERF_TEST_P(ImagePair, StereoConstantSpaceBP, ...@@ -141,13 +141,13 @@ PERF_TEST_P(ImagePair, StereoConstantSpaceBP,
if (PERF_RUN_GPU()) if (PERF_RUN_GPU())
{ {
cv::gpu::StereoConstantSpaceBP d_csbp(ndisp); cv::Ptr<cv::gpu::StereoConstantSpaceBP> d_csbp = cv::gpu::createStereoConstantSpaceBP(ndisp);
const cv::gpu::GpuMat d_imgLeft(imgLeft); const cv::gpu::GpuMat d_imgLeft(imgLeft);
const cv::gpu::GpuMat d_imgRight(imgRight); const cv::gpu::GpuMat d_imgRight(imgRight);
cv::gpu::GpuMat dst; cv::gpu::GpuMat dst;
TEST_CYCLE() d_csbp(d_imgLeft, d_imgRight, dst); TEST_CYCLE() d_csbp->compute(d_imgLeft, d_imgRight, dst);
GPU_SANITY_CHECK(dst); GPU_SANITY_CHECK(dst);
} }
......
...@@ -48,5 +48,6 @@ ...@@ -48,5 +48,6 @@
#include "opencv2/gpustereo.hpp" #include "opencv2/gpustereo.hpp"
#include "opencv2/core/private.gpu.hpp" #include "opencv2/core/private.gpu.hpp"
#include "opencv2/core/utility.hpp"
#endif /* __OPENCV_PRECOMP_H__ */ #endif /* __OPENCV_PRECOMP_H__ */
...@@ -155,10 +155,10 @@ GPU_TEST_P(StereoConstantSpaceBP, Regression) ...@@ -155,10 +155,10 @@ GPU_TEST_P(StereoConstantSpaceBP, Regression)
ASSERT_FALSE(right_image.empty()); ASSERT_FALSE(right_image.empty());
ASSERT_FALSE(disp_gold.empty()); ASSERT_FALSE(disp_gold.empty());
cv::gpu::StereoConstantSpaceBP csbp(128, 16, 4, 4); cv::Ptr<cv::gpu::StereoConstantSpaceBP> csbp = cv::gpu::createStereoConstantSpaceBP(128, 16, 4, 4);
cv::gpu::GpuMat disp; cv::gpu::GpuMat disp;
csbp(loadMat(left_image), loadMat(right_image), disp); csbp->compute(loadMat(left_image), loadMat(right_image), disp);
cv::Mat h_disp(disp); cv::Mat h_disp(disp);
h_disp.convertTo(h_disp, disp_gold.depth()); h_disp.convertTo(h_disp, disp_gold.depth());
......
...@@ -67,7 +67,7 @@ private: ...@@ -67,7 +67,7 @@ private:
Ptr<gpu::StereoBM> bm; Ptr<gpu::StereoBM> bm;
Ptr<gpu::StereoBeliefPropagation> bp; Ptr<gpu::StereoBeliefPropagation> bp;
gpu::StereoConstantSpaceBP csbp; Ptr<gpu::StereoConstantSpaceBP> csbp;
int64 work_begin; int64 work_begin;
double work_fps; double work_fps;
...@@ -174,7 +174,7 @@ void App::run() ...@@ -174,7 +174,7 @@ void App::run()
// Set common parameters // Set common parameters
bm = gpu::createStereoBM(p.ndisp); bm = gpu::createStereoBM(p.ndisp);
bp = gpu::createStereoBeliefPropagation(p.ndisp); bp = gpu::createStereoBeliefPropagation(p.ndisp);
csbp.ndisp = p.ndisp; csbp = cv::gpu::createStereoConstantSpaceBP(p.ndisp);
// Prepare disparity map of specified type // Prepare disparity map of specified type
Mat disp(left.size(), CV_8U); Mat disp(left.size(), CV_8U);
...@@ -204,7 +204,7 @@ void App::run() ...@@ -204,7 +204,7 @@ void App::run()
bm->compute(d_left, d_right, d_disp); bm->compute(d_left, d_right, d_disp);
break; break;
case Params::BP: bp->compute(d_left, d_right, d_disp); break; case Params::BP: bp->compute(d_left, d_right, d_disp); break;
case Params::CSBP: csbp(d_left, d_right, d_disp); break; case Params::CSBP: csbp->compute(d_left, d_right, d_disp); break;
} }
workEnd(); workEnd();
...@@ -236,8 +236,8 @@ void App::printParams() const ...@@ -236,8 +236,8 @@ void App::printParams() const
cout << "level_count: " << bp->getNumLevels() << endl; cout << "level_count: " << bp->getNumLevels() << endl;
break; break;
case Params::CSBP: case Params::CSBP:
cout << "iter_count: " << csbp.iters << endl; cout << "iter_count: " << csbp->getNumIters() << endl;
cout << "level_count: " << csbp.levels << endl; cout << "level_count: " << csbp->getNumLevels() << endl;
break; break;
} }
cout << endl; cout << endl;
...@@ -306,14 +306,14 @@ void App::handleKey(char key) ...@@ -306,14 +306,14 @@ void App::handleKey(char key)
cout << "ndisp: " << p.ndisp << endl; cout << "ndisp: " << p.ndisp << endl;
bm->setNumDisparities(p.ndisp); bm->setNumDisparities(p.ndisp);
bp->setNumDisparities(p.ndisp); bp->setNumDisparities(p.ndisp);
csbp.ndisp = p.ndisp; csbp->setNumDisparities(p.ndisp);
break; break;
case 'q': case 'Q': case 'q': case 'Q':
p.ndisp = max(p.ndisp - 8, 1); p.ndisp = max(p.ndisp - 8, 1);
cout << "ndisp: " << p.ndisp << endl; cout << "ndisp: " << p.ndisp << endl;
bm->setNumDisparities(p.ndisp); bm->setNumDisparities(p.ndisp);
bp->setNumDisparities(p.ndisp); bp->setNumDisparities(p.ndisp);
csbp.ndisp = p.ndisp; csbp->setNumDisparities(p.ndisp);
break; break;
case '2': case '2':
if (p.method == Params::BM) if (p.method == Params::BM)
...@@ -337,8 +337,8 @@ void App::handleKey(char key) ...@@ -337,8 +337,8 @@ void App::handleKey(char key)
} }
else if (p.method == Params::CSBP) else if (p.method == Params::CSBP)
{ {
csbp.iters += 1; csbp->setNumIters(csbp->getNumIters() + 1);
cout << "iter_count: " << csbp.iters << endl; cout << "iter_count: " << csbp->getNumIters() << endl;
} }
break; break;
case 'e': case 'E': case 'e': case 'E':
...@@ -349,8 +349,8 @@ void App::handleKey(char key) ...@@ -349,8 +349,8 @@ void App::handleKey(char key)
} }
else if (p.method == Params::CSBP) else if (p.method == Params::CSBP)
{ {
csbp.iters = max(csbp.iters - 1, 1); csbp->setNumIters(max(csbp->getNumIters() - 1, 1));
cout << "iter_count: " << csbp.iters << endl; cout << "iter_count: " << csbp->getNumIters() << endl;
} }
break; break;
case '4': case '4':
...@@ -361,8 +361,8 @@ void App::handleKey(char key) ...@@ -361,8 +361,8 @@ void App::handleKey(char key)
} }
else if (p.method == Params::CSBP) else if (p.method == Params::CSBP)
{ {
csbp.levels += 1; csbp->setNumLevels(csbp->getNumLevels() + 1);
cout << "level_count: " << csbp.levels << endl; cout << "level_count: " << csbp->getNumLevels() << endl;
} }
break; break;
case 'r': case 'R': case 'r': case 'R':
...@@ -373,8 +373,8 @@ void App::handleKey(char key) ...@@ -373,8 +373,8 @@ void App::handleKey(char key)
} }
else if (p.method == Params::CSBP) else if (p.method == Params::CSBP)
{ {
csbp.levels = max(csbp.levels - 1, 1); csbp->setNumLevels(max(csbp->getNumLevels() - 1, 1));
cout << "level_count: " << csbp.levels << endl; cout << "level_count: " << csbp->getNumLevels() << endl;
} }
break; break;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册