Skip to content
Snippets Groups Projects
Commit 0f4eb568 authored by Nicolas Pope's avatar Nicolas Pope
Browse files

More WIP HSTABLE

parent b1ccf9a8
No related branches found
No related tags found
2 merge requests!347Feature buckets experiment,!300Implement experimental SGM algorithms
......@@ -67,7 +67,7 @@ namespace Impl {
};
struct StableSGM : public Algorithm {
StableSGM() { P1 = 8.0f; P2 = 24.0f; }
StableSGM() { P1 = 1.0f; P2 = 8.0f; }
virtual void run(const MiddleburyData &data, cv::Mat &disparity) override {
StereoStableSgm stereo;
......@@ -84,7 +84,7 @@ namespace Impl {
};
struct HStableSGM : public Algorithm {
HStableSGM() { P1 = 36.0f; P2 = 96.0f; }
HStableSGM() { P1 = 3.0f; P2 = 24.0f; }
virtual void run(const MiddleburyData &data, cv::Mat &disparity) override {
StereoHStableSgm stereo;
......@@ -92,7 +92,7 @@ namespace Impl {
stereo.params.P2 = P2;
stereo.params.subpixel = subpixel;
stereo.params.lr_consistency = lr_consistency;
stereo.params.wsize = 9;
stereo.params.wsize = 7;
stereo.params.d_min = data.calib.vmin;
stereo.params.d_max = data.calib.vmax;
stereo.params.debug = false;
......
......@@ -112,11 +112,11 @@ void StereoHStableSgm::compute(cv::InputArray l, cv::InputArray r, cv::OutputArr
cv::imshow("Var", tmp);
impl_->cost_fine.generateFilterMask(params.wsize, 16);
impl_->cost_medium.generateFilterMask(params.wsize, 16);
impl_->cost_coarse.generateFilterMask(params.wsize, 16);
impl_->cost_medium.setFilter(impl_->cost_fine.getFilter());
impl_->cost_coarse.setFilter(impl_->cost_fine.getFilter());
impl_->cost_fine.set(impl_->l, impl_->r);
impl_->cost_medium.set(medium_l, medium_r);
impl_->cost_coarse.set(coarse_l, coarse_r);
impl_->cost_medium.set(medium_l, medium_r, l.cols(), l.rows());
impl_->cost_coarse.set(coarse_l, coarse_r, l.cols(), l.rows());
impl_->cost.set();
impl_->compute(disparity);
}
......
......@@ -19,7 +19,7 @@ namespace algorithms {
uint16_t i = 0;
for (int wy = -WINY/2; wy <= WINY/2; wy++) {
for (int wx = -WINX/2; wx <= WINX/2; wx++) {
const int16_t value = im(y + wy, x + wx);
const int16_t value = im(min(height,max(0,int(float(y)*scaleY) + wy)), min(width,max(0,int(float(x)*scaleX) + wx)));
const int16_t filter = filter_mask(0, i++);
const int16_t sign = filter > 0 ? 1 : -1;
// NOTE: indexing starts from 1
......@@ -54,6 +54,10 @@ namespace algorithms {
const int WINX;
const int WINY;
float scaleX;
float scaleY;
const int width;
const int height;
// number of uint64_t values for each window
const int WSTEP = (NBITS - 1)/(sizeof(uint64_t)*8) + 1;
......@@ -93,8 +97,15 @@ void StableMatchingCost::generateFilterMask(const int wsize, const int bits) {
}
void StableMatchingCost::set(const Array2D<uchar> &l, const Array2D<uchar> &r) {
parallel2D<algorithms::Stable<16>>({l.data(), filter_mask_.data(), stable_l_.data(), wsize_, wsize_}, l.width, l.height);
parallel2D<algorithms::Stable<16>>({r.data(), filter_mask_.data(), stable_r_.data(), wsize_, wsize_}, r.width, r.height);
parallel2D<algorithms::Stable<16>>({l.data(), filter_mask_.data(), stable_l_.data(), wsize_, wsize_, 1.0f, 1.0f, l.width, l.height}, l.width, l.height);
parallel2D<algorithms::Stable<16>>({r.data(), filter_mask_.data(), stable_r_.data(), wsize_, wsize_, 1.0f, 1.0f, r.width, r.height}, r.width, r.height);
}
void StableMatchingCost::set(const Array2D<uchar> &l, const Array2D<uchar> &r, size_t w, size_t h) {
float scaleX = float(l.width) / float(w);
float scaleY = float(l.height) / float(h);
parallel2D<algorithms::Stable<16>>({l.data(), filter_mask_.data(), stable_l_.data(), wsize_, wsize_, scaleX, scaleY, l.width, l.height}, w, h);
parallel2D<algorithms::Stable<16>>({r.data(), filter_mask_.data(), stable_r_.data(), wsize_, wsize_, scaleX, scaleY, r.width, r.height}, w, h);
}
void StableMatchingCost::set(cv::InputArray l, cv::InputArray r) {
......
......@@ -25,8 +25,12 @@ public:
void generateFilterMask(const int wsize, const int bits);
void set(cv::InputArray l, cv::InputArray r);
void set(const Array2D<uchar>& l, const Array2D<uchar>& r);
void set(const Array2D<uchar>& l, const Array2D<uchar>& r, size_t w, size_t h);
static constexpr Type COST_MAX = DataType::COST_MAX;
Array2D<int16_t> &getFilter() { return filter_mask_; }
void setFilter(const Array2D<int16_t> &f) { filter_mask_ = f; }
protected:
int wsize_;
Array2D<int16_t> filter_mask_;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment