// This file is part of OpenCV project. // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. #ifndef __OPENCV_OPTFLOW_RLOFFLOW_HPP__ #define __OPENCV_OPTFLOW_RLOFFLOW_HPP__ #include "opencv2/core.hpp" #include "opencv2/video.hpp" namespace cv { namespace optflow { //! @addtogroup optflow //! @{ enum SupportRegionType { SR_FIXED = 0, /**< Apply a constant support region */ SR_CROSS = 1 /**< Apply a adaptive support region obtained by cross-based segmentation * as described in @cite Senst2014 */ }; enum SolverType { ST_STANDART = 0, /**< Apply standard iterative refinement */ ST_BILINEAR = 1 /**< Apply optimized iterative refinement based bilinear equation solutions * as described in @cite Senst2013 */ }; enum InterpolationType { INTERP_GEO = 0, /**< Fast geodesic interpolation, see @cite Geistert2016 */ INTERP_EPIC = 1, /**< Edge-preserving interpolation using ximgproc::EdgeAwareInterpolator, see @cite Revaud2015,Geistert2016. */ INTERP_RIC = 2, /**< SLIC based robust interpolation using ximgproc::RICInterpolator, see @cite Hu2017. */ }; /** @brief This is used store and set up the parameters of the robust local optical flow (RLOF) algoritm. * * The RLOF is a fast local optical flow approach described in @cite Senst2012 @cite Senst2013 @cite Senst2014 * and @cite Senst2016 similar to the pyramidal iterative Lucas-Kanade method as * proposed by @cite Bouguet00. More details and experiments can be found in the following thesis @cite Senst2019. * The implementation is derived from optflow::calcOpticalFlowPyrLK(). * This RLOF implementation can be seen as an improved pyramidal iterative Lucas-Kanade and includes * a set of improving modules. The main improvements in respect to the pyramidal iterative Lucas-Kanade * are: * - A more robust redecending M-estimator framework (see @cite Senst2012) to improve the accuracy at * motion boundaries and appearing and disappearing pixels. * - an adaptive support region strategies to improve the accuracy at motion boundaries to reduce the * corona effect, i.e oversmoothing of the PLK at motion/object boundaries. The cross-based segementation * strategy (SR_CROSS) proposed in @cite Senst2014 uses a simple segmenation approach to obtain the optimal * shape of the support region. * - To deal with illumination changes (outdoor sequences and shadow) the intensity constancy assumption * based optical flow equation has been adopt with the Gennert and Negahdaripour illumination model * (see @cite Senst2016). This model can be switched on/off with the useIlluminationModel variable. * - By using a global motion prior initialization (see @cite Senst2016) of the iterative refinement * the accuracy could be significantly improved for large displacements. This initialization can be * switched on and of with useGlobalMotionPrior variable. * * The RLOF can be computed with the SparseOpticalFlow class or function interface to track a set of features * or with the DenseOpticalFlow class or function interface to compute dense optical flow. * * @see optflow::DenseRLOFOpticalFlow, optflow::calcOpticalFlowDenseRLOF(), optflow::SparseRLOFOpticalFlow, optflow::calcOpticalFlowSparseRLOF() */ class CV_EXPORTS_W RLOFOpticalFlowParameter{ public: RLOFOpticalFlowParameter() :solverType(ST_BILINEAR) ,supportRegionType(SR_CROSS) ,normSigma0(std::numeric_limits::max()) ,normSigma1(std::numeric_limits::max()) ,smallWinSize(9) ,largeWinSize(21) ,crossSegmentationThreshold(25) ,maxLevel(4) ,useInitialFlow(false) ,useIlluminationModel(true) ,useGlobalMotionPrior(true) ,maxIteration(30) ,minEigenValue(0.0001f) ,globalMotionRansacThreshold(10) {} SolverType solverType; /**< Variable specifies the iterative refinement strategy. Please consider citing @cite Senst2013 when * using ST_BILINEAR. */ SupportRegionType supportRegionType; /**< Variable specifies the support region shape extraction or shrinking strategy. */ float normSigma0; /**< &sigma parameter of the shrinked Hampel norm introduced in @cite Senst2012. If * &sigma = std::numeric_limist::max() the least-square estimator will be used * instead of the M-estimator. Althoug M-estimator is more robust against outlier in the support * region the least-square can be fast in computation. */ float normSigma1; /**< &sigma parameter of the shrinked Hampel norm introduced in @cite Senst2012. If * &sigma = std::numeric_limist::max() the least-square estimator will be used * instead of the M-estimator. Althoug M-estimator is more robust against outlier in the support * region the least-square can be fast in computation. */ int smallWinSize; /**< Minimal window size of the support region. This parameter is only used if supportRegionType is SR_CROSS. */ int largeWinSize; /**< Maximal window size of the support region. If supportRegionType is SR_FIXED this gives the exact support * region size. The speed of the RLOF is related to the applied win sizes. The smaller the window size the lower is the runtime, * but the more sensitive to noise is the method. */ int crossSegmentationThreshold; /**< Color similarity threshold used by cross-based segmentation following @cite Senst2014 . * (Only used if supportRegionType is SR_CROSS). With the cross-bassed segmentation * motion boundaries can be computed more accurately. */ int maxLevel; /**< Maximal number of pyramid level used. The large this value is the more likely it is * to obtain accurate solutions for long-range motions. The runtime is linear related to * this parameter. */ bool useInitialFlow; /**< Use next point list as initial values. A good intialization can imporve the algortihm * accuracy and reduce the runtime by a faster convergence of the iteration refinement. */ bool useIlluminationModel; /**< Use the Gennert and Negahdaripour illumination model instead of the intensity brigthness * constraint. (proposed in @cite Senst2016 ) This model is defined as follow: * \f[ I(\mathbf{x},t) + m \cdot I(\mathbf{x},t) + c = I(\mathbf{x},t+1) \f] * and contains with m and c a multiplicative and additive term which makes the estimate * more robust against illumination changes. The computational complexity is increased by * enabling the illumination model. */ bool useGlobalMotionPrior; /**< Use global motion prior initialisation has been introduced in @cite Senst2016 . It * allows to be more accurate for long-range motion. The computational complexity is * slightly increased by enabling the global motion prior initialisation. */ int maxIteration; /**< Number of maximal iterations used for the iterative refinement. Lower values can * reduce the runtime but also the accuracy. */ float minEigenValue; /**< Threshold for the minimal eigenvalue of the gradient matrix defines when to abort the * iterative refinement. */ float globalMotionRansacThreshold; /**< To apply the global motion prior motion vectors will be computed on a regulary sampled which * are the basis for Homography estimation using RANSAC. The reprojection threshold is based on * n-th percentil (given by this value [0 ... 100]) of the motion vectors magnitude. * See @cite Senst2016 for more details. */ //! @brief Enable M-estimator or disable and use least-square estimator. /** Enables M-estimator by setting sigma parameters to (3.2, 7.0). Disabling M-estimator can reduce * runtime, while enabling can improve the accuracy. * @param val If true M-estimator is used. If false least-square estimator is used. * @see setNormSigma0, setNormSigma1 */ CV_WRAP void setUseMEstimator(bool val); CV_WRAP void setSolverType(SolverType val); CV_WRAP SolverType getSolverType() const; CV_WRAP void setSupportRegionType(SupportRegionType val); CV_WRAP SupportRegionType getSupportRegionType() const; CV_WRAP void setNormSigma0(float val); CV_WRAP float getNormSigma0() const; CV_WRAP void setNormSigma1(float val); CV_WRAP float getNormSigma1() const; CV_WRAP void setSmallWinSize(int val); CV_WRAP int getSmallWinSize() const; CV_WRAP void setLargeWinSize(int val); CV_WRAP int getLargeWinSize() const; CV_WRAP void setCrossSegmentationThreshold(int val); CV_WRAP int getCrossSegmentationThreshold() const; CV_WRAP void setMaxLevel(int val); CV_WRAP int getMaxLevel() const; CV_WRAP void setUseInitialFlow(bool val); CV_WRAP bool getUseInitialFlow() const; CV_WRAP void setUseIlluminationModel(bool val); CV_WRAP bool getUseIlluminationModel() const; CV_WRAP void setUseGlobalMotionPrior(bool val); CV_WRAP bool getUseGlobalMotionPrior() const; CV_WRAP void setMaxIteration(int val); CV_WRAP int getMaxIteration() const; CV_WRAP void setMinEigenValue(float val); CV_WRAP float getMinEigenValue() const; CV_WRAP void setGlobalMotionRansacThreshold(float val); CV_WRAP float getGlobalMotionRansacThreshold() const; //! @brief Creates instance of optflow::RLOFOpticalFlowParameter CV_WRAP static Ptr create(); }; /** @brief Fast dense optical flow computation based on robust local optical flow (RLOF) algorithms and sparse-to-dense interpolation * scheme. * * The RLOF is a fast local optical flow approach described in @cite Senst2012 @cite Senst2013 @cite Senst2014 * and @cite Senst2016 similar to the pyramidal iterative Lucas-Kanade method as * proposed by @cite Bouguet00. More details and experiments can be found in the following thesis @cite Senst2019. * The implementation is derived from optflow::calcOpticalFlowPyrLK(). * * The sparse-to-dense interpolation scheme allows for fast computation of dense optical flow using RLOF (see @cite Geistert2016). * For this scheme the following steps are applied: * -# motion vector seeded at a regular sampled grid are computed. The sparsity of this grid can be configured with setGridStep * -# (optinally) errornous motion vectors are filter based on the forward backward confidence. The threshold can be configured * with setForwardBackward. The filter is only applied if the threshold >0 but than the runtime is doubled due to the estimation * of the backward flow. * -# Vector field interpolation is applied to the motion vector set to obtain a dense vector field. * * For the RLOF configuration see optflow::RLOFOpticalFlowParameter for further details. * Parameters have been described in @cite Senst2012 @cite Senst2013 @cite Senst2014 and @cite Senst2016. * * @note If the grid size is set to (1,1) and the forward backward threshold <= 0 than pixelwise dense optical flow field is * computed by RLOF without using interpolation. * * @note Note that in output, if no correspondences are found between \a I0 and \a I1, the \a flow is set to 0. * @see optflow::calcOpticalFlowDenseRLOF(), optflow::RLOFOpticalFlowParameter */ class CV_EXPORTS_W DenseRLOFOpticalFlow : public DenseOpticalFlow { public: //! @brief Configuration of the RLOF alogrithm. /** @see optflow::RLOFOpticalFlowParameter, getRLOFOpticalFlowParameter */ CV_WRAP virtual void setRLOFOpticalFlowParameter(Ptr val) = 0; /** @copybrief setRLOFOpticalFlowParameter @see optflow::RLOFOpticalFlowParameter, setRLOFOpticalFlowParameter */ CV_WRAP virtual Ptr getRLOFOpticalFlowParameter() const = 0; //! @brief Threshold for the forward backward confidence check /**For each grid point \f$ \mathbf{x} \f$ a motion vector \f$ d_{I0,I1}(\mathbf{x}) \f$ is computed. * If the forward backward error \f[ EP_{FB} = || d_{I0,I1} + d_{I1,I0} || \f] * is larger than threshold given by this function then the motion vector will not be used by the following * vector field interpolation. \f$ d_{I1,I0} \f$ denotes the backward flow. Note, the forward backward test * will only be applied if the threshold > 0. This may results into a doubled runtime for the motion estimation. * @see getForwardBackward, setGridStep */ CV_WRAP virtual void setForwardBackward(float val) = 0; /** @copybrief setForwardBackward @see setForwardBackward */ CV_WRAP virtual float getForwardBackward() const = 0; //! @brief Size of the grid to spawn the motion vectors. /** For each grid point a motion vector is computed. Some motion vectors will be removed due to the forwatd backward * threshold (if set >0). The rest will be the base of the vector field interpolation. * @see getForwardBackward, setGridStep */ CV_WRAP virtual Size getGridStep() const = 0; /** @copybrief getGridStep * @see getGridStep */ CV_WRAP virtual void setGridStep(Size val) = 0; //! @brief Interpolation used to compute the dense optical flow. /** Two interpolation algorithms are supported * - **INTERP_GEO** applies the fast geodesic interpolation, see @cite Geistert2016. * - **INTERP_EPIC_RESIDUAL** applies the edge-preserving interpolation, see @cite Revaud2015,Geistert2016. * @see ximgproc::EdgeAwareInterpolator, getInterpolation */ CV_WRAP virtual void setInterpolation(InterpolationType val) = 0; /** @copybrief setInterpolation * @see ximgproc::EdgeAwareInterpolator, setInterpolation */ CV_WRAP virtual InterpolationType getInterpolation() const = 0; //! @brief see ximgproc::EdgeAwareInterpolator() K value. /** K is a number of nearest-neighbor matches considered, when fitting a locally affine * model. Usually it should be around 128. However, lower values would make the interpolation noticeably faster. * @see ximgproc::EdgeAwareInterpolator, setEPICK */ CV_WRAP virtual int getEPICK() const = 0; /** @copybrief getEPICK * @see ximgproc::EdgeAwareInterpolator, getEPICK */ CV_WRAP virtual void setEPICK(int val) = 0; //! @brief see ximgproc::EdgeAwareInterpolator() sigma value. /** Sigma is a parameter defining how fast the weights decrease in the locally-weighted affine * fitting. Higher values can help preserve fine details, lower values can help to get rid of noise in the * output flow. * @see ximgproc::EdgeAwareInterpolator, setEPICSigma */ CV_WRAP virtual float getEPICSigma() const = 0; /** @copybrief getEPICSigma * @see ximgproc::EdgeAwareInterpolator, getEPICSigma */ CV_WRAP virtual void setEPICSigma(float val) = 0; //! @brief see ximgproc::EdgeAwareInterpolator() lambda value. /** Lambda is a parameter defining the weight of the edge-aware term in geodesic distance, * should be in the range of 0 to 1000. * @see ximgproc::EdgeAwareInterpolator, setEPICSigma */ CV_WRAP virtual float getEPICLambda() const = 0; /** @copybrief getEPICLambda * @see ximgproc::EdgeAwareInterpolator, getEPICLambda */ CV_WRAP virtual void setEPICLambda(float val) = 0; //! @brief see ximgproc::EdgeAwareInterpolator(). /** Sets the respective fastGlobalSmootherFilter() parameter. * @see ximgproc::EdgeAwareInterpolator, setFgsLambda */ CV_WRAP virtual float getFgsLambda() const = 0; /** @copybrief getFgsLambda * @see ximgproc::EdgeAwareInterpolator, ximgproc::fastGlobalSmootherFilter, getFgsLambda */ CV_WRAP virtual void setFgsLambda(float val) = 0; //! @brief see ximgproc::EdgeAwareInterpolator(). /** Sets the respective fastGlobalSmootherFilter() parameter. * @see ximgproc::EdgeAwareInterpolator, ximgproc::fastGlobalSmootherFilter, setFgsSigma */ CV_WRAP virtual float getFgsSigma() const = 0; /** @copybrief getFgsSigma * @see ximgproc::EdgeAwareInterpolator, ximgproc::fastGlobalSmootherFilter, getFgsSigma */ CV_WRAP virtual void setFgsSigma(float val) = 0; //! @brief enables ximgproc::fastGlobalSmootherFilter /** * @see getUsePostProc */ CV_WRAP virtual void setUsePostProc(bool val) = 0; /** @copybrief setUsePostProc * @see ximgproc::fastGlobalSmootherFilter, setUsePostProc */ CV_WRAP virtual bool getUsePostProc() const = 0; //! @brief enables VariationalRefinement /** * @see getUseVariationalRefinement */ CV_WRAP virtual void setUseVariationalRefinement(bool val) = 0; /** @copybrief setUseVariationalRefinement * @see ximgproc::fastGlobalSmootherFilter, setUsePostProc */ CV_WRAP virtual bool getUseVariationalRefinement() const = 0; //! @brief Parameter to tune the approximate size of the superpixel used for oversegmentation. /** * @see cv::ximgproc::createSuperpixelSLIC, cv::ximgproc::RICInterpolator */ CV_WRAP virtual void setRICSPSize(int val) = 0; /** @copybrief setRICSPSize * @see setRICSPSize */ CV_WRAP virtual int getRICSPSize() const = 0; /** @brief Parameter to choose superpixel algorithm variant to use: * - cv::ximgproc::SLICType SLIC segments image using a desired region_size (value: 100) * - cv::ximgproc::SLICType SLICO will optimize using adaptive compactness factor (value: 101) * - cv::ximgproc::SLICType MSLIC will optimize using manifold methods resulting in more content-sensitive superpixels (value: 102). * @see cv::ximgproc::createSuperpixelSLIC, cv::ximgproc::RICInterpolator */ CV_WRAP virtual void setRICSLICType(int val) = 0; /** @copybrief setRICSLICType * @see setRICSLICType */ CV_WRAP virtual int getRICSLICType() const = 0; //! @brief Creates instance of optflow::DenseRLOFOpticalFlow /** * @param rlofParam see optflow::RLOFOpticalFlowParameter * @param forwardBackwardThreshold see setForwardBackward * @param gridStep see setGridStep * @param interp_type see setInterpolation * @param epicK see setEPICK * @param epicSigma see setEPICSigma * @param epicLambda see setEPICLambda * @param ricSPSize see setRICSPSize * @param ricSLICType see setRICSLICType * @param use_post_proc see setUsePostProc * @param fgsLambda see setFgsLambda * @param fgsSigma see setFgsSigma * @param use_variational_refinement see setUseVariationalRefinement */ CV_WRAP static Ptr create( Ptr rlofParam = Ptr(), float forwardBackwardThreshold = 1.f, Size gridStep = Size(6, 6), InterpolationType interp_type = InterpolationType::INTERP_EPIC, int epicK = 128, float epicSigma = 0.05f, float epicLambda = 999.0f, int ricSPSize = 15, int ricSLICType = 100, bool use_post_proc = true, float fgsLambda = 500.0f, float fgsSigma = 1.5f, bool use_variational_refinement = false); }; /** @brief Class used for calculation sparse optical flow and feature tracking with robust local optical flow (RLOF) algorithms. * * The RLOF is a fast local optical flow approach described in @cite Senst2012 @cite Senst2013 @cite Senst2014 * and @cite Senst2016 similar to the pyramidal iterative Lucas-Kanade method as * proposed by @cite Bouguet00. More details and experiments can be found in the following thesis @cite Senst2019. * The implementation is derived from optflow::calcOpticalFlowPyrLK(). * * For the RLOF configuration see optflow::RLOFOpticalFlowParameter for further details. * Parameters have been described in @cite Senst2012, @cite Senst2013, @cite Senst2014 and @cite Senst2016. * * @note SIMD parallelization is only available when compiling with SSE4.1. * @see optflow::calcOpticalFlowSparseRLOF(), optflow::RLOFOpticalFlowParameter */ class CV_EXPORTS_W SparseRLOFOpticalFlow : public SparseOpticalFlow { public: /** @copydoc DenseRLOFOpticalFlow::setRLOFOpticalFlowParameter */ CV_WRAP virtual void setRLOFOpticalFlowParameter(Ptr val) = 0; /** @copybrief setRLOFOpticalFlowParameter * @see setRLOFOpticalFlowParameter */ CV_WRAP virtual Ptr getRLOFOpticalFlowParameter() const = 0; //! @brief Threshold for the forward backward confidence check /** For each feature point a motion vector \f$ d_{I0,I1}(\mathbf{x}) \f$ is computed. * If the forward backward error \f[ EP_{FB} = || d_{I0,I1} + d_{I1,I0} || \f] * is larger than threshold given by this function then the status will not be used by the following * vector field interpolation. \f$ d_{I1,I0} \f$ denotes the backward flow. Note, the forward backward test * will only be applied if the threshold > 0. This may results into a doubled runtime for the motion estimation. * @see setForwardBackward */ CV_WRAP virtual void setForwardBackward(float val) = 0; /** @copybrief setForwardBackward * @see setForwardBackward */ CV_WRAP virtual float getForwardBackward() const = 0; //! @brief Creates instance of SparseRLOFOpticalFlow /** * @param rlofParam see setRLOFOpticalFlowParameter * @param forwardBackwardThreshold see setForwardBackward */ CV_WRAP static Ptr create( Ptr rlofParam = Ptr(), float forwardBackwardThreshold = 1.f); }; /** @brief Fast dense optical flow computation based on robust local optical flow (RLOF) algorithms and sparse-to-dense interpolation scheme. * * The RLOF is a fast local optical flow approach described in @cite Senst2012 @cite Senst2013 @cite Senst2014 * and @cite Senst2016 similar to the pyramidal iterative Lucas-Kanade method as * proposed by @cite Bouguet00. More details and experiments can be found in the following thesis @cite Senst2019. * The implementation is derived from optflow::calcOpticalFlowPyrLK(). * * The sparse-to-dense interpolation scheme allows for fast computation of dense optical flow using RLOF (see @cite Geistert2016). * For this scheme the following steps are applied: * -# motion vector seeded at a regular sampled grid are computed. The sparsity of this grid can be configured with setGridStep * -# (optinally) errornous motion vectors are filter based on the forward backward confidence. The threshold can be configured * with setForwardBackward. The filter is only applied if the threshold >0 but than the runtime is doubled due to the estimation * of the backward flow. * -# Vector field interpolation is applied to the motion vector set to obtain a dense vector field. * * @param I0 first 8-bit input image. If The cross-based RLOF is used (by selecting optflow::RLOFOpticalFlowParameter::supportRegionType * = SupportRegionType::SR_CROSS) image has to be a 8-bit 3 channel image. * @param I1 second 8-bit input image. If The cross-based RLOF is used (by selecting optflow::RLOFOpticalFlowParameter::supportRegionType * = SupportRegionType::SR_CROSS) image has to be a 8-bit 3 channel image. * @param flow computed flow image that has the same size as I0 and type CV_32FC2. * @param rlofParam see optflow::RLOFOpticalFlowParameter * @param forwardBackwardThreshold Threshold for the forward backward confidence check. * For each grid point \f$ \mathbf{x} \f$ a motion vector \f$ d_{I0,I1}(\mathbf{x}) \f$ is computed. * If the forward backward error \f[ EP_{FB} = || d_{I0,I1} + d_{I1,I0} || \f] * is larger than threshold given by this function then the motion vector will not be used by the following * vector field interpolation. \f$ d_{I1,I0} \f$ denotes the backward flow. Note, the forward backward test * will only be applied if the threshold > 0. This may results into a doubled runtime for the motion estimation. * @param gridStep Size of the grid to spawn the motion vectors. For each grid point a motion vector is computed. * Some motion vectors will be removed due to the forwatd backward threshold (if set >0). The rest will be the * base of the vector field interpolation. * @param interp_type interpolation method used to compute the dense optical flow. Two interpolation algorithms are * supported: * - **INTERP_GEO** applies the fast geodesic interpolation, see @cite Geistert2016. * - **INTERP_EPIC_RESIDUAL** applies the edge-preserving interpolation, see @cite Revaud2015,Geistert2016. * @param epicK see ximgproc::EdgeAwareInterpolator sets the respective parameter. * @param epicSigma see ximgproc::EdgeAwareInterpolator sets the respective parameter. * @param epicLambda see ximgproc::EdgeAwareInterpolator sets the respective parameter. * @param ricSPSize see ximgproc::RICInterpolator sets the respective parameter. * @param ricSLICType see ximgproc::RICInterpolator sets the respective parameter. * @param use_post_proc enables ximgproc::fastGlobalSmootherFilter() parameter. * @param fgsLambda sets the respective ximgproc::fastGlobalSmootherFilter() parameter. * @param fgsSigma sets the respective ximgproc::fastGlobalSmootherFilter() parameter. * @param use_variational_refinement enables VariationalRefinement * * Parameters have been described in @cite Senst2012, @cite Senst2013, @cite Senst2014, @cite Senst2016. * For the RLOF configuration see optflow::RLOFOpticalFlowParameter for further details. * @note If the grid size is set to (1,1) and the forward backward threshold <= 0 that the dense optical flow field is purely * computed with the RLOF. * * @note SIMD parallelization is only available when compiling with SSE4.1. * @note Note that in output, if no correspondences are found between \a I0 and \a I1, the \a flow is set to 0. * * @sa optflow::DenseRLOFOpticalFlow, optflow::RLOFOpticalFlowParameter */ CV_EXPORTS_W void calcOpticalFlowDenseRLOF(InputArray I0, InputArray I1, InputOutputArray flow, Ptr rlofParam = Ptr(), float forwardBackwardThreshold = 0, Size gridStep = Size(6, 6), InterpolationType interp_type = InterpolationType::INTERP_EPIC, int epicK = 128, float epicSigma = 0.05f, float epicLambda = 100.f, int ricSPSize = 15, int ricSLICType = 100, bool use_post_proc = true, float fgsLambda = 500.0f, float fgsSigma = 1.5f, bool use_variational_refinement = false); /** @brief Calculates fast optical flow for a sparse feature set using the robust local optical flow (RLOF) similar * to optflow::calcOpticalFlowPyrLK(). * * The RLOF is a fast local optical flow approach described in @cite Senst2012 @cite Senst2013 @cite Senst2014 * and @cite Senst2016 similar to the pyramidal iterative Lucas-Kanade method as * proposed by @cite Bouguet00. More details and experiments can be found in the following thesis @cite Senst2019. * The implementation is derived from optflow::calcOpticalFlowPyrLK(). * * @param prevImg first 8-bit input image. If The cross-based RLOF is used (by selecting optflow::RLOFOpticalFlowParameter::supportRegionType * = SupportRegionType::SR_CROSS) image has to be a 8-bit 3 channel image. * @param nextImg second 8-bit input image. If The cross-based RLOF is used (by selecting optflow::RLOFOpticalFlowParameter::supportRegionType * = SupportRegionType::SR_CROSS) image has to be a 8-bit 3 channel image. * @param prevPts vector of 2D points for which the flow needs to be found; point coordinates must be single-precision * floating-point numbers. * @param nextPts output vector of 2D points (with single-precision floating-point coordinates) containing the calculated * new positions of input features in the second image; when optflow::RLOFOpticalFlowParameter::useInitialFlow variable is true the vector must * have the same size as in the input and contain the initialization point correspondences. * @param status output status vector (of unsigned chars); each element of the vector is set to 1 if the flow for the * corresponding features has passed the forward backward check. * @param err output vector of errors; each element of the vector is set to the forward backward error for the corresponding feature. * @param rlofParam see optflow::RLOFOpticalFlowParameter * @param forwardBackwardThreshold Threshold for the forward backward confidence check. If forewardBackwardThreshold <=0 the forward * * @note SIMD parallelization is only available when compiling with SSE4.1. * * Parameters have been described in @cite Senst2012, @cite Senst2013, @cite Senst2014 and @cite Senst2016. * For the RLOF configuration see optflow::RLOFOpticalFlowParameter for further details. */ CV_EXPORTS_W void calcOpticalFlowSparseRLOF(InputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray nextPts, OutputArray status, OutputArray err, Ptr rlofParam = Ptr(), float forwardBackwardThreshold = 0); //! Additional interface to the Dense RLOF algorithm - optflow::calcOpticalFlowDenseRLOF() CV_EXPORTS_W Ptr createOptFlow_DenseRLOF(); //! Additional interface to the Sparse RLOF algorithm - optflow::calcOpticalFlowSparseRLOF() CV_EXPORTS_W Ptr createOptFlow_SparseRLOF(); //! @} } // namespace } // namespace #endif