// Copyright (c) 2012-2017 VideoStitch SAS // Copyright (c) 2018 stitchEm #pragma once #include "libvideostitch/algorithm.hpp" #include "libvideostitch/config.hpp" #include "libvideostitch/inputDef.hpp" #include #include #include namespace VideoStitch { namespace Util { class SampledExposureStabilizationProblem; /** * An algorithm that stabilizes the exposure/WB spacially and temporally. */ class SampledStabilizationBase { public: explicit SampledStabilizationBase(const Ptv::Value* config); virtual ~SampledStabilizationBase() {} protected: void sample(Core::PanoDefinition*, std::vector>& frames, SampledExposureStabilizationProblem&) const; Potential createProblem(Core::PanoDefinition* pano) const; int maxSampledPoints; int minPointsPerInput; int neighbourhoodSize; int anchor; bool stabilizeWB; }; class SampledStabilizationOnlineAlgorithm : public OnlineAlgorithm, public SampledStabilizationBase { public: /** * The algo docstring. */ static const char* docString; explicit SampledStabilizationOnlineAlgorithm(const Ptv::Value* config); virtual ~SampledStabilizationOnlineAlgorithm() {} Potential onFrame(Core::PanoDefinition&, std::vector>& frames, mtime_t date, FrameRate frameRate, Util::OpaquePtr** ctx) override; private: Status processFrames(const std::vector>& frames, Core::PanoDefinition& pano, const Potential& problem); std::unordered_map> preserveCurves(const Core::PanoDefinition& panorama, frameid_t frame); void updateInputCurves(Core::PanoDefinition& panorama, std::unordered_map> preservedCurves, frameid_t algorithmFinishFrame, frameid_t interpolationFinishFrame); static const std::unordered_map> functionMap; int interpolationFixationFrames; mtime_t interpolationDuration; // microseconds static const mtime_t InterpolationDurationMultiplier; // microseconds }; class SampledStabilizationAlgorithm : public Algorithm, public SampledStabilizationBase { public: /** * The algo docstring. */ static const char* docString; explicit SampledStabilizationAlgorithm(const Ptv::Value* config); virtual ~SampledStabilizationAlgorithm() {} Potential apply(Core::PanoDefinition* pano, ProgressReporter* progress, OpaquePtr** = NULL) const override; private: int firstFrame; int lastFrame; int timeStep; bool temporalStabilization; bool preserveOutside; bool returnPointSet; }; } // namespace Util } // namespace VideoStitch