source/util/ImageUtil.h (149 lines of code) (raw):

/** * Copyright 2004-present Facebook. All Rights Reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include <tuple> #include <vector> #include "source/util/Camera.h" #include "source/util/CvUtil.h" #include "source/util/FilesystemUtil.h" #include "source/util/ImageTypes.h" namespace fb360_dep { namespace image_util { int getSingleFrame(const filesystem::path& imageDir, const Camera::Rig& rig, std::string frame); std::pair<int, int> getFrameRange( const filesystem::path& imageDir, const Camera::Rig& rig, std::string firstFrame, std::string lastFrame); void verifyImagePaths( const filesystem::path& imageDir, const Camera::Rig& rig, const std::string& firstFrame, const std::string& lastFrame, const std::string& extension = ""); double probeDisparity( const int probe, const int probeCount, const double minDisparity, const double maxDisparity); inline std::string intToStringZeroPad(const int x, const int padlen = 6) { std::ostringstream ss; ss << std::setw(padlen) << std::setfill('0') << x; return ss.str(); } inline const filesystem::path imagePath( const filesystem::path& dir, const std::string& camId, const std::string& frameName, const std::string& extension = "") { filesystem::path camDir = dir / camId; std::string ext = extension.empty() ? filesystem::getFirstExtension(camDir) : extension; return camDir / (frameName + ext); } template <typename T> cv::Mat_<T> loadImage(const filesystem::path& dir, const std::string& camId, const std::string& frameName) { return cv_util::loadImage<T>(imagePath(dir, camId, frameName)); } template <typename T> std::vector<cv::Mat_<T>> loadImages( const filesystem::path& dir, const Camera::Rig& rig, const std::string& frameName, const int numThreads = -1) { std::vector<cv::Mat_<T>> images(rig.size()); ThreadPool threadPool(numThreads); for (int i = 0; i < int(rig.size()); ++i) { threadPool.spawn([&, i] { images[i] = loadImage<T>(dir, rig[i].id, frameName); }); } threadPool.join(); return images; } template <typename T> std::vector<cv::Mat_<T>> loadLevelImages( const filesystem::path& dir, const int level, const Camera::Rig& rig, const std::string& frameName, const int numThreads = -1) { std::vector<cv::Mat_<T>> images(rig.size()); ThreadPool threadPool(numThreads); const filesystem::path dirLevel = dir / ("level_" + std::to_string(level)); for (int i = 0; i < int(rig.size()); ++i) { threadPool.spawn([&, i] { images[i] = loadImage<T>(dirLevel, rig[i].id, frameName); }); } threadPool.join(); return images; } inline cv::Mat_<float> loadPfmImage(const filesystem::path& dir, const std::string& camId, const std::string& frameName) { return cv_util::readCvMat32FC1FromPFM(imagePath(dir, camId, frameName, ".pfm")); } inline std::vector<cv::Mat_<float>> loadPfmImages( const filesystem::path& dir, const Camera::Rig& rig, const std::string& frameName, const int numThreads = -1) { std::vector<cv::Mat_<float>> images(rig.size()); ThreadPool threadPool(numThreads); for (int i = 0; i < int(rig.size()); ++i) { threadPool.spawn([&, i] { images[i] = loadPfmImage(dir, rig[i].id, frameName); }); } threadPool.join(); return images; } template <typename T> cv::Mat_<T> loadScaledImage( const filesystem::path& dir, const std::string& camId, const std::string& frameName, const double scaleFactor, const int interp = cv::INTER_AREA) { return cv_util::loadScaledImage<T>(imagePath(dir, camId, frameName), scaleFactor, interp); } template <typename T> std::vector<cv::Mat_<T>> loadScaledImages( const filesystem::path& dir, const Camera::Rig& rig, const std::string& frameName, const double scaleFactor, const int interp = cv::INTER_AREA, const int numThreads = -1) { std::vector<cv::Mat_<T>> images(rig.size()); ThreadPool threadPool(numThreads); for (int i = 0; i < int(rig.size()); ++i) { threadPool.spawn( [&, i] { images[i] = loadScaledImage<T>(dir, rig[i].id, frameName, scaleFactor, interp); }); } threadPool.join(); return images; } template <typename T> cv::Mat_<T> loadResizedImage( const filesystem::path& dir, const std::string& camId, const std::string& frameName, const cv::Size& size, const int interp = cv::INTER_AREA) { return cv_util::loadResizedImage<T>(imagePath(dir, camId, frameName), size, interp); } template <typename T> std::vector<cv::Mat_<T>> loadResizedImages( const filesystem::path& dir, const Camera::Rig& rig, const std::string& frameName, const cv::Size& size, const int interp = cv::INTER_AREA, const int numThreads = -1) { std::vector<cv::Mat_<T>> images(rig.size()); ThreadPool threadPool(numThreads); for (int i = 0; i < int(rig.size()); ++i) { threadPool.spawn( [&, i] { images[i] = loadResizedImage<T>(dir, rig[i].id, frameName, size, interp); }); } threadPool.join(); return images; } Camera::Rig filterDestinations(const Camera::Rig rigIn, const std::string& destinations); Camera::Vector2 worldToEquirect(const Camera::Vector3 world, const int eqrW, const int eqrH); cv::Mat_<cv::Vec2f> computeWarpDstToSrc(const Camera& dst, const Camera& src); } // namespace image_util } // end namespace fb360_dep