Skip to content
Snippets Groups Projects
Commit 6371f138 authored by Sebastian Hahta's avatar Sebastian Hahta Committed by Nicolas Pope
Browse files

sgm: support for different resolution disparity

parent f0a23847
No related branches found
No related tags found
No related merge requests found
...@@ -12,6 +12,13 @@ using cv::cuda::GpuMat; ...@@ -12,6 +12,13 @@ using cv::cuda::GpuMat;
FixstarsSGM::FixstarsSGM(nlohmann::json &config) : Disparity(config) { FixstarsSGM::FixstarsSGM(nlohmann::json &config) : Disparity(config) {
ssgm_ = nullptr; ssgm_ = nullptr;
int width = value("width", 1280);
int height = value("height", 720);
size_ = cv::Size(width, height);
CHECK((width >= 480) && (height >= 360));
uniqueness_ = value("uniqueness", 0.95f); uniqueness_ = value("uniqueness", 0.95f);
P1_ = value("P1", 10); P1_ = value("P1", 10);
P2_ = value("P2", 120); P2_ = value("P2", 120);
...@@ -29,11 +36,16 @@ FixstarsSGM::FixstarsSGM(nlohmann::json &config) : Disparity(config) { ...@@ -29,11 +36,16 @@ FixstarsSGM::FixstarsSGM(nlohmann::json &config) : Disparity(config) {
filter_ = cv::cuda::createDisparityBilateralFilter(max_disp_ << 4, radius, iter); filter_ = cv::cuda::createDisparityBilateralFilter(max_disp_ << 4, radius, iter);
} }
init(size_);
} }
void FixstarsSGM::init(const cv::Size size) { void FixstarsSGM::init(const cv::Size size) {
if (ssgm_) { delete ssgm_; } if (ssgm_) { delete ssgm_; }
lbw_ = GpuMat(size, CV_8UC1);
rbw_ = GpuMat(size, CV_8UC1);
dispt_ = GpuMat(size, CV_16SC1); dispt_ = GpuMat(size, CV_16SC1);
ssgm_ = new sgm::StereoSGM(size.width, size.height, max_disp_, 8, 16, ssgm_ = new sgm::StereoSGM(size.width, size.height, max_disp_, 8, 16,
lbw_.step, dispt_.step / sizeof(short), lbw_.step, dispt_.step / sizeof(short),
sgm::EXECUTE_INOUT_CUDA2CUDA, sgm::EXECUTE_INOUT_CUDA2CUDA,
...@@ -41,34 +53,55 @@ void FixstarsSGM::init(const cv::Size size) { ...@@ -41,34 +53,55 @@ void FixstarsSGM::init(const cv::Size size) {
); );
} }
void FixstarsSGM::compute(const cv::cuda::GpuMat &l, const cv::cuda::GpuMat &r, cv::cuda::GpuMat &disp, cv::cuda::Stream &stream) { void FixstarsSGM::compute(const cv::cuda::GpuMat &l, const cv::cuda::GpuMat &r,
cv::cuda::GpuMat &disp, cv::cuda::Stream &stream)
{
if (l.size() != size_) {
// re-use same buffer for l/r
cv::cuda::resize(r, l_downscaled_, size_, 0.0, 0.0, cv::INTER_CUBIC, stream);
cv::cuda::cvtColor(l_downscaled_, rbw_, cv::COLOR_BGR2GRAY, 0, stream);
cv::cuda::resize(l, l_downscaled_, size_, 0.0, 0.0, cv::INTER_CUBIC, stream);
cv::cuda::cvtColor(l_downscaled_, lbw_, cv::COLOR_BGR2GRAY, 0, stream);
}
else {
cv::cuda::cvtColor(l, lbw_, cv::COLOR_BGR2GRAY, 0, stream); cv::cuda::cvtColor(l, lbw_, cv::COLOR_BGR2GRAY, 0, stream);
cv::cuda::cvtColor(r, rbw_, cv::COLOR_BGR2GRAY, 0, stream); cv::cuda::cvtColor(r, rbw_, cv::COLOR_BGR2GRAY, 0, stream);
}
stream.waitForCompletion(); stream.waitForCompletion();
if (!ssgm_) { init(l.size()); }
//auto start = std::chrono::high_resolution_clock::now();
ssgm_->execute(lbw_.data, rbw_.data, dispt_.data); ssgm_->execute(lbw_.data, rbw_.data, dispt_.data);
//std::chrono::duration<double> elapsed =
// std::chrono::high_resolution_clock::now() - start;
//LOG(INFO) << "CUDA sgm in " << elapsed.count() << "s";
GpuMat left_pixels(dispt_, cv::Rect(0, 0, max_disp_, dispt_.rows)); GpuMat left_pixels(dispt_, cv::Rect(0, 0, max_disp_, dispt_.rows));
left_pixels.setTo(0); left_pixels.setTo(0);
cv::cuda::threshold(dispt_, dispt_, 4096.0f, 0.0f, cv::THRESH_TOZERO_INV, stream); cv::cuda::threshold(dispt_, dispt_, 4096.0f, 0.0f, cv::THRESH_TOZERO_INV, stream);
if (use_filter_) { filter_->apply(dispt_, l, dispt_, stream); } // TODO: filter could be applied after upscaling (to the upscaled disparity image)
if (use_filter_) {
filter_->apply(dispt_,
l.size() != dispt_.size() ? l_downscaled_ : l,
dispt_,
stream
);
}
if (l.size() != size_) {
cv::cuda::multiply(dispt_, (double)l.cols / (double)size_.width, dispt_);
// invalid areas (bad values) have to be taken into account in interpolation
cv::cuda::resize(dispt_, dispt_full_res_, l.size(), 0.0, 0.0, cv::INTER_NEAREST, stream);
}
else {
dispt_full_res_ = dispt_;
}
dispt_.convertTo(disp, CV_32F, 1.0f/16.0f, stream); dispt_full_res_.convertTo(disp, CV_32F, 1.0f / 16.0f, stream);
} }
void FixstarsSGM::setMask(Mat &mask) { void FixstarsSGM::setMask(Mat &mask) {
return; // TODO(Nick) Not needed, but also code below does not work with new GPU pipeline return; // TODO(Nick) Not needed, but also code below does not work with new GPU pipeline
CHECK(mask.type() == CV_8UC1) << "mask type must be CV_8U"; CHECK(mask.type() == CV_8UC1) << "mask type must be CV_8U";
if (!ssgm_) { init(mask.size()); } if (!ssgm_) { init(size_); }
mask_l_ = mask; mask_l_ = mask;
ssgm_->setMask((uint8_t*)mask.data, mask.cols); ssgm_->setMask((uint8_t*)mask.data, mask.cols);
......
...@@ -42,12 +42,16 @@ class FixstarsSGM : public ftl::rgbd::detail::Disparity { ...@@ -42,12 +42,16 @@ class FixstarsSGM : public ftl::rgbd::detail::Disparity {
float uniqueness_; float uniqueness_;
int P1_; int P1_;
int P2_; int P2_;
cv::Size size_;
bool use_filter_; bool use_filter_;
cv::Ptr<cv::cuda::DisparityBilateralFilter> filter_; cv::Ptr<cv::cuda::DisparityBilateralFilter> filter_;
sgm::StereoSGM *ssgm_; sgm::StereoSGM *ssgm_;
cv::cuda::GpuMat lbw_; cv::cuda::GpuMat lbw_;
cv::cuda::GpuMat rbw_; cv::cuda::GpuMat rbw_;
cv::cuda::GpuMat dispt_; cv::cuda::GpuMat dispt_;
cv::cuda::GpuMat l_downscaled_;
cv::cuda::GpuMat dispt_full_res_;
}; };
}; };
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment