#ifndef _FTL_RECONSTRUCT_ILW_HPP_ #define _FTL_RECONSTRUCT_ILW_HPP_ #include <ftl/cuda_common.hpp> #include <ftl/rgbd/frameset.hpp> #include <ftl/configurable.hpp> #include <vector> #include "ilw_cuda.hpp" #include <ftl/cuda/points.hpp> namespace ftl { namespace detail { struct ILWData{ // x,y,z + confidence ftl::cuda::TextureObject<float4> correspondence; ftl::cuda::TextureObject<float4> points; // Residual potential energy ftl::cuda::TextureObject<float> residual; // Flow magnitude ftl::cuda::TextureObject<float> flow; }; } /** * For a set of sources, perform Iterative Lattice Warping to correct the * location of points between the cameras. The algorithm finds possible * correspondences and warps the original pixel lattice of points in each * camera towards the correspondences, iterating the process as many times as * possible. The result is that both local and global adjustment is made to the * point clouds to improve micro alignment that may have been incorrect due to * either inaccurate camera pose estimation or noise/errors in the depth maps. */ class ILW : public ftl::Configurable { public: explicit ILW(nlohmann::json &config); ~ILW(); /** * Take a frameset and perform the iterative lattice warping. */ bool process(ftl::rgbd::FrameSet &fs, cudaStream_t stream=0); inline bool isLabColour() const { return use_lab_; } private: /* * Initialise data. */ bool _phase0(ftl::rgbd::FrameSet &fs, cudaStream_t stream); /* * Find possible correspondences and a confidence value. */ bool _phase1(ftl::rgbd::FrameSet &fs, int win, cudaStream_t stream); /* * Calculate energies and move the points. */ bool _phase2(ftl::rgbd::FrameSet &fs, float rate, cudaStream_t stream); std::vector<detail::ILWData> data_; bool enabled_; ftl::cuda::ILWParams params_; int iterations_; float motion_rate_; int motion_window_; bool use_lab_; int discon_mask_; bool fill_depth_; ftl::cuda::ClipSpace clip_; bool clipping_; }; } #endif // _FTL_RECONSTRUCT_ILW_HPP_