From e85570675197f5b6c311d6517d58b8f330568eb6 Mon Sep 17 00:00:00 2001 From: nlyubova Date: Tue, 16 Jun 2015 14:21:48 +0200 Subject: [PATCH] fixing the depth rescale for different scales of width and height --- cells/RescaleRegisteredDepth.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/cells/RescaleRegisteredDepth.cpp b/cells/RescaleRegisteredDepth.cpp index 5d7b94f..cb63e98 100644 --- a/cells/RescaleRegisteredDepth.cpp +++ b/cells/RescaleRegisteredDepth.cpp @@ -35,19 +35,25 @@ struct RescaledRegisteredDepth { cv::Mat valid_mask; rescaleDepth(*depth_in_, CV_32F, depth); - float factor = float(isize.width) / dsize.width; //scaling factor. + float factor = float(isize.height) / dsize.height; cv::Mat output(isize, depth.type()); //resize into the subregion of the correct aspect ratio - cv::Mat subregion(output.rowRange(0, dsize.height * factor)); + int cols_nbr = dsize.width *factor; + int col_start = round((isize.width - cols_nbr)/2); + cv::Mat subregion(output.colRange(col_start, cols_nbr+col_start)); //use nearest neighbor to prevent discontinuities causing bogus depth. cv::resize(depth, subregion, subregion.size(), CV_INTER_NN); - output.rowRange(dsize.height * factor, output.rows).setTo( + if (col_start > 0) + output.colRange(0, col_start-1).setTo( + cv::Scalar(std::numeric_limits::quiet_NaN(), std::numeric_limits::quiet_NaN(), + std::numeric_limits::quiet_NaN())); + output.colRange(cols_nbr+col_start, output.cols).setTo( cv::Scalar(std::numeric_limits::quiet_NaN(), std::numeric_limits::quiet_NaN(), std::numeric_limits::quiet_NaN())); *depth_out_ = output; //rescale the calibration matrix - K_out_->at(0, 0) = K_out_->at(0, 0) * factor; + K_out_->at(0, 0) = K_out_->at(0, 0) * static_cast(isize.width) / static_cast(dsize.width); //K_out_->at(0, 0) * factor; K_out_->at(1, 1) = K_out_->at(1, 1) * static_cast(isize.height) / static_cast(dsize.height); K_out_->at(0, 2) = static_cast(isize.width-1) / 2.0f; K_out_->at(1, 2) = static_cast(isize.height-1) / 2.0f; @@ -55,10 +61,12 @@ struct RescaledRegisteredDepth { if (!mask_in_->empty()) { assert(mask_in_->size() == depth_in_->size()); cv::Mat mask(isize, CV_8U); - cv::Mat subregion(mask.rowRange(0, dsize.height * factor)); + cv::Mat subregion(mask.colRange(col_start, cols_nbr+col_start)); //use nearest neighbor to prevent discontinuities causing bogus depth. cv::resize(*mask_in_, subregion, subregion.size(), CV_INTER_NN); - mask.rowRange(dsize.height * factor, output.rows).setTo(cv::Scalar(0, 0, 0)); + if (col_start > 0) + mask.colRange(0, col_start-1).setTo(cv::Scalar(0, 0, 0)); + mask.colRange(cols_nbr+col_start, output.cols).setTo(cv::Scalar(0, 0, 0)); *mask_out_ = mask; }