赞
踩
Colmap中depth_map部分的源码
先来一个全部的代码,很短 82行
#ifndef COLMAP_SRC_MVS_DEPTH_MAP_H_ #define COLMAP_SRC_MVS_DEPTH_MAP_H_ #include <string> #include <vector> #include "mvs/mat.h" #include "util/bitmap.h" namespace colmap { namespace mvs { class DepthMap : public Mat<float> { public: DepthMap(); DepthMap(const size_t width, const size_t height, const float depth_min, const float depth_max); DepthMap(const Mat<float>& mat, const float depth_min, const float depth_max); inline float GetDepthMin() const; inline float GetDepthMax() const; inline float Get(const size_t row, const size_t col) const; void Rescale(const float factor); void Downsize(const size_t max_width, const size_t max_height); Bitmap ToBitmap(const float min_percentile, const float max_percentile) const; private: float depth_min_ = -1.0f; float depth_max_ = -1.0f; }; // Implementation float DepthMap::GetDepthMin() const { return depth_min_; } float DepthMap::GetDepthMax() const { return depth_max_; } float DepthMap::Get(const size_t row, const size_t col) const { return data_.at(row * width_ + col); } } // namespace mvs } // namespace colmap #endif // COLMAP_SRC_MVS_DEPTH_MAP_H_
开头的这段话是这样一个意思
// 表示 DepthMap是以 public 的方式继承 Mat
class DepthMap : public Mat<float>
接下来就是常见的一些方法,获取最大深度最小深度等等。
看一下.cc 文件中具体的实现
// 初始化的方法1 DepthMap::DepthMap() : DepthMap(0, 0, -1.0f, -1.0f) {} // 初始化方法,直接赋值了 最大深度和最小深度 DepthMap::DepthMap(const size_t width, const size_t height, const float depth_min, const float depth_max) : Mat<float>(width, height, 1), depth_min_(depth_min), depth_max_(depth_max) {} //使用mat初始化 DepthMap::DepthMap(const Mat<float>& mat, const float depth_min, const float depth_max) : Mat<float>(mat.GetWidth(), mat.GetHeight(), mat.GetDepth()), depth_min_(depth_min), depth_max_(depth_max) { CHECK_EQ(mat.GetDepth(), 1); data_ = mat.GetData(); }
跟着一个 Rescale函数
void DepthMap::Rescale(const float factor) { if (width_ * height_ == 0) { return; } const size_t new_width = std::round(width_ * factor); const size_t new_height = std::round(height_ * factor); std::vector<float> new_data(new_width * new_height); //下采样图片,很牛逼的操作,值得单独拿出来讲 DownsampleImage(data_.data(), height_, width_, new_height, new_width, new_data.data()); data_ = new_data; width_ = new_width; height_ = new_height; //清空释放内存 data_.shrisnk_to_fit(); }
单独看一下这个 DownSampleImage(), 传入 图片数据;高度;宽度;新高度;新宽度;新的图片
DownsampleImage(data_.data(), height_, width_, new_height, new_width,
new_data.data());
让我们看一下具体的实现叭~
void DownsampleImage(const float* data, const int rows, const int cols, const int new_rows, const int new_cols, float* downsampled) { //首先是检查参数的正确性。 CHECK_NOTNULL(data); CHECK_NOTNULL(downsampled); CHECK_LE(new_rows, rows); CHECK_LE(new_cols, cols); CHECK_GT(rows, 0); CHECK_GT(cols, 0); CHECK_GT(new_rows, 0); CHECK_GT(new_cols, 0); // const float scale_c = static_cast<float>(cols) / static_cast<float>(new_cols); const float scale_r = static_cast<float>(rows) / static_cast<float>(new_rows); const float kSigmaScale = 0.5f; // numeric_limits 数值极限 常数 const float sigma_c = std::max(std::numeric_limits<float>::epsilon(), kSigmaScale * (scale_c - 1)); const float sigma_r = std::max(std::numeric_limits<float>::epsilon(), kSigmaScale * (scale_r - 1)); std::vector<float> smoothed(rows * cols); // colmap 使用的是 双线性插值 SmoothImage(data, rows, cols, sigma_r, sigma_c, smoothed.data()); // ResampleImageBilinear(smoothed.data(), rows, cols, new_rows, new_cols, downsampled); }
接着是.cc文件中的 Downsize
void DepthMap::Downsize(const size_t max_width, const size_t max_height) {
if (height_ <= max_height && width_ <= max_width) {
return;
}
const float factor_x = static_cast<float>(max_width) / width_;
const float factor_y = static_cast<float>(max_height) / height_;
Rescale(std::min(factor_x, factor_y));
}
接着是ToBitmap
函数, 想把深度图转换成
Bitmap DepthMap::ToBitmap(const float min_percentile, const float max_percentile) const { CHECK_GT(width_, 0); CHECK_GT(height_, 0); Bitmap bitmap; bitmap.Allocate(width_, height_, true); std::vector<float> valid_depths; valid_depths.reserve(data_.size()); for (const float depth : data_) { if (depth > 0) { valid_depths.push_back(depth); } } if (valid_depths.empty()) { bitmap.Fill(BitmapColor<uint8_t>(0)); return bitmap; } // valid_depths 表示的是深度图片 // min_percentile 和 max_percentile 表示需要拿到的百分位数 const float robust_depth_min = Percentile(valid_depths, min_percentile); const float robust_depth_max = Percentile(valid_depths, max_percentile); const float robust_depth_range = robust_depth_max - robust_depth_min; for (size_t y = 0; y < height_; ++y) { for (size_t x = 0; x < width_; ++x) { const float depth = Get(y, x); if (depth > 0) { // 把深度缩放到 一个范围之内 const float robust_depth = std::max(robust_depth_min, std::min(robust_depth_max, depth)); // 定义灰度 const float gray = (robust_depth - robust_depth_min) / robust_depth_range; const BitmapColor<float> color(255 * JetColormap::Red(gray), 255 * JetColormap::Green(gray), 255 * JetColormap::Blue(gray)); bitmap.SetPixel(x, y, color.Cast<uint8_t>()); } else { bitmap.SetPixel(x, y, BitmapColor<uint8_t>(0)); } } } return bitmap; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。