in source/depth_estimation/TemporalBilateralFilter.cpp [120:183]
void filterFrame(const int curFrameIdx, const Camera::Rig& rigDst) {
const size_t numDsts = rigDst.size();
std::vector<std::vector<cv::Mat_<depth_estimation::PixelType>>> colorFrames(numDsts);
std::vector<std::vector<cv::Mat_<float>>> disparities(numDsts);
std::vector<std::vector<cv::Mat_<bool>>> masks(numDsts);
const Camera& camRef = rigDst[0];
int firstFrameIdx = 0;
int lastFrameIdx = INT_MAX;
populateMinMaxFrame(FLAGS_color, FLAGS_level, camRef, curFrameIdx, firstFrameIdx, lastFrameIdx);
populateMinMaxFrame(
FLAGS_disparity, FLAGS_level, camRef, curFrameIdx, firstFrameIdx, lastFrameIdx);
if (FLAGS_use_foreground_masks) {
populateMinMaxFrame(
FLAGS_foreground_masks, FLAGS_level, camRef, curFrameIdx, firstFrameIdx, lastFrameIdx);
}
for (int frameIdx = firstFrameIdx; frameIdx <= lastFrameIdx; ++frameIdx) {
const std::string frameName = image_util::intToStringZeroPad(frameIdx, 6);
const std::vector<cv::Mat_<PixelType>> colorImages =
loadLevelImages<PixelType>(FLAGS_color, FLAGS_level, rigDst, frameName, FLAGS_threads);
const std::vector<cv::Mat_<float>> disparitiesImages =
loadLevelImages<float>(FLAGS_disparity, FLAGS_level, rigDst, frameName, FLAGS_threads);
std::map<int, cv::Size> sizes;
getPyramidLevelSizes(sizes, FLAGS_color);
const std::vector<cv::Mat_<bool>> foregroundMaskImages = FLAGS_use_foreground_masks
? loadLevelImages<bool>(
FLAGS_foreground_masks, FLAGS_level, rigDst, frameName, FLAGS_threads)
: cv_util::generateAllPassMasks(sizes.at(FLAGS_level), numDsts);
const std::vector<cv::Mat_<bool>> fovMaskImages =
generateFovMasks(rigDst, sizes.at(FLAGS_level), FLAGS_threads);
for (size_t camIdx = 0; camIdx < numDsts; ++camIdx) {
colorFrames[camIdx].push_back(colorImages[camIdx]);
disparities[camIdx].push_back(disparitiesImages[camIdx]);
masks[camIdx].push_back(foregroundMaskImages[camIdx] & fovMaskImages[camIdx]);
}
}
LOG(INFO) << "Filtering images...";
for (size_t camIdx = 0; camIdx < numDsts; ++camIdx) {
cv::Mat_<float> disparity;
const float scale = std::pow(depth_estimation::kLevelScale, FLAGS_level);
const int spaceRadius = FLAGS_space_radius == -1
? std::max(std::ceil(kTemporalSpaceRadiusMax * scale), float(kTemporalSpaceRadiusMin))
: FLAGS_space_radius;
temporalJointBilateralFilter(
colorFrames[camIdx],
disparities[camIdx],
masks[camIdx],
curFrameIdx - firstFrameIdx,
FLAGS_sigma,
spaceRadius,
FLAGS_weight_b,
FLAGS_weight_g,
FLAGS_weight_b,
disparity,
FLAGS_threads);
saveDisparity(FLAGS_output_formats, disparity, rigDst[camIdx].id, curFrameIdx);
}
}