in source/depth_estimation/UpsampleDisparity.cpp [63:142]
void upsampleFrame(const Camera::Rig& rigSrc, const Camera::Rig& rigDst, const std::string& frame) {
const std::string exts = FLAGS_output_formats.empty() ? "pfm" : FLAGS_output_formats;
std::vector<std::string> outputFormats;
folly::split(",", exts, outputFormats);
const std::vector<cv::Mat_<float>> disps =
image_util::loadImages<float>(FLAGS_disparity, rigDst, frame, FLAGS_threads);
CHECK_GT(disps.size(), 0);
std::vector<cv::Mat_<PixelType>> colors;
if (!FLAGS_color.empty()) {
colors = image_util::loadImages<PixelType>(FLAGS_color, rigDst, frame, FLAGS_threads);
}
std::vector<cv::Mat_<float>> backgroundDispsUp;
if (!FLAGS_background_disp.empty()) {
backgroundDispsUp = image_util::loadImages<float>(
FLAGS_background_disp, rigDst, FLAGS_background_frame, FLAGS_threads);
} else {
cv::Mat_<float> temp;
std::vector<cv::Mat_<float>> backgroundDispsUpTemp(int(rigDst.size()), temp);
backgroundDispsUp = backgroundDispsUpTemp;
}
int height;
if (FLAGS_height == -1) {
height =
std::round(float(rigDst[0].resolution.y()) / rigDst[0].resolution.x() * FLAGS_resolution);
height += height % 2; // force even height
} else {
height = FLAGS_height;
}
const cv::Size sizeUp(FLAGS_resolution, height);
const bool useForegroundMasks = !FLAGS_foreground_masks_in.empty();
std::vector<cv::Mat_<bool>> masks = useForegroundMasks
? image_util::loadImages<bool>(FLAGS_foreground_masks_in, rigDst, frame, FLAGS_threads)
: cv_util::generateAllPassMasks(disps[0].size(), int(rigDst.size()));
const std::vector<cv::Mat_<bool>> masksUp = !FLAGS_foreground_masks_out.empty()
? image_util::loadImages<bool>(FLAGS_foreground_masks_out, rigDst, frame, FLAGS_threads)
: cv_util::generateAllPassMasks(sizeUp, int(rigDst.size()));
std::vector<cv::Mat_<float>> dispsUp = upsampleDisparities(
rigDst, disps, backgroundDispsUp, masks, masksUp, sizeUp, useForegroundMasks, FLAGS_threads);
for (ssize_t i = 0; i < ssize(rigDst); ++i) {
if (!FLAGS_color.empty()) {
const int radius = getRadius(masks[i].size(), sizeUp);
LOG(INFO) << folly::sformat(
"Applying filter with radius {} to {}x{} disparity to {}...",
radius,
sizeUp.width,
sizeUp.height,
rigDst[i].id);
const cv::Mat_<PixelType> colorUp = cv_util::resizeImage(colors[i], sizeUp);
dispsUp[i] = depth_estimation::generalizedJointBilateralFilter<float, PixelType>(
dispsUp[i],
colorUp,
colorUp,
masksUp[i],
radius,
FLAGS_sigma,
FLAGS_weight_b,
FLAGS_weight_g,
FLAGS_weight_r,
FLAGS_threads);
}
LOG(INFO) << "Saving output images...";
for (const std::string& ext : outputFormats) {
const std::string frameFn = ext[0] == '.' ? frame + ext : frame + '.' + ext;
const filesystem::path fn = filesystem::path(FLAGS_output) / rigDst[i].id / frameFn;
boost::filesystem::create_directories(fn.parent_path());
if (ext != "pfm") {
cv_util::imwriteExceptionOnFail(fn, cv_util::convertTo<uint16_t>(dispsUp[i]));
} else {
cv_util::writeCvMat32FC1ToPFM(fn, dispsUp[i]);
}
}
}
}