\cvclass{DynamicAdaptedFeatureDetector} An adaptively adjusting detector that iteratively detects until the desired number of features are found. If the detector is persisted, it will "remember" the parameters used on the last detection. In this way, the detector may be used for consistent numbers of keypoints in a sets of images that are temporally related such as video streams or panorama series. The DynamicAdaptedFeatureDetector uses another detector such as FAST or SURF to do the dirty work, with the help of an AdjusterAdapter. After a detection, and an unsatisfactory number of features are detected, the AdjusterAdapter will adjust the detection parameters so that the next detection will result in more or less features. This is repeated until either the number of desired features are found or the parameters are maxed out. Adapters can easily be implemented for any detector via the AdjusterAdapter interface. Beware that this is not thread safe - as the adjustment of parameters breaks the const of the detection routine... Here is a sample of how to create a DynamicAdaptedFeatureDetector. \begin{lstlisting} //sample usage: //will create a detector that attempts to find //100 - 110 FAST Keypoints, and will at most run //FAST feature detection 10 times until that //number of keypoints are found Ptr detector(new DynamicAdaptedFeatureDetector (100, 110, 10, new FastAdjuster(20,true))); \end{lstlisting} \begin{lstlisting} class DynamicAdaptedFeatureDetector: public FeatureDetector { public: DynamicAdaptedFeatureDetector( const Ptr& adjaster, int min_features=400, int max_features=500, int max_iters=5 ); ... }; \end{lstlisting} \cvCppFunc{DynamicAdaptedFeatureDetector::DynamicAdaptedFeatureDetector} DynamicAdaptedFeatureDetector constructor. \cvdefCpp{ DynamicAdaptedFeatureDetector::DynamicAdaptedFeatureDetector( \par const Ptr\& adjaster, \par int min\_features, \par int max\_features, \par int max\_iters ); } \begin{description} \cvarg{adjaster}{ An \cvCppCross{AdjusterAdapter} that will do the detection and parameter adjustment} \cvarg{min\_features}{This minimum desired number features.} \cvarg{max\_features}{The maximum desired number of features.} \cvarg{max\_iters}{The maximum number of times to try to adjust the feature detector parameters. For the \cvCppCross{FastAdjuster} this number can be high, but with Star or Surf, many iterations can get time consuming. At each iteration the detector is rerun, so keep this in mind when choosing this value.} \end{description} \cvclass{AdjusterAdapter} A feature detector parameter adjuster interface, this is used by the \cvCppCross{DynamicAdaptedFeatureDetector} and is a wrapper for \cvCppCross{FeatureDetecto}r that allow them to be adjusted after a detection. See \cvCppCross{FastAdjuster}, \cvCppCross{StarAdjuster}, \cvCppCross{SurfAdjuster} for concrete implementations. \begin{lstlisting} class AdjusterAdapter: public FeatureDetector { public: virtual ~AdjusterAdapter() {} virtual void tooFew(int min, int n_detected) = 0; virtual void tooMany(int max, int n_detected) = 0; virtual bool good() const = 0; }; \end{lstlisting} \cvCppFunc{AdjusterAdapter::tooFew} \cvdefCpp{ virtual void tooFew(int min, int n\_detected) = 0; } Too few features were detected so, adjust the detector parameters accordingly - so that the next detection detects more features. \begin{description} \cvarg{min}{This minimum desired number features.} \cvarg{n\_detected}{The actual number detected last run.} \end{description} An example implementation of this is \begin{lstlisting} void FastAdjuster::tooFew(int min, int n_detected) { thresh_--; } \end{lstlisting} \cvCppFunc{AdjusterAdapter::tooMany} Too many features were detected so, adjust the detector parameters accordingly - so that the next detection detects less features. \cvdefCpp{ virtual void tooMany(int max, int n\_detected) = 0; } \begin{description} \cvarg{max}{This maximum desired number features.} \cvarg{n\_detected}{The actual number detected last run.} \end{description} An example implementation of this is \begin{lstlisting} void FastAdjuster::tooMany(int min, int n_detected) { thresh_++; } \end{lstlisting} \cvCppFunc{AdjusterAdapter::good} Are params maxed out or still valid? Returns false if the parameters can't be adjusted any more. \cvdefCpp{ virtual bool good() const = 0; } An example implementation of this is \begin{lstlisting} bool FastAdjuster::good() const { return (thresh_ > 1) && (thresh_ < 200); } \end{lstlisting} \cvclass{FastAdjuster} An \cvCppCross{AdjusterAdapter} for the \cvCppCross{FastFeatureDetector}. This will basically decrement or increment the threshhold by 1 \begin{lstlisting} class FastAdjuster FastAdjuster: public AdjusterAdapter { public: FastAdjuster(int init_thresh = 20, bool nonmax = true); ... }; \end{lstlisting} \cvclass{StarAdjuster} An \cvCppCross{AdjusterAdapter} for the \cvCppCross{StarFeatureDetector}. This adjusts the responseThreshhold of StarFeatureDetector. \begin{lstlisting} class StarAdjuster: public AdjusterAdapter { StarAdjuster(double initial_thresh = 30.0); ... }; \end{lstlisting} \cvclass{SurfAdjuster} An \cvCppCross{AdjusterAdapter} for the \cvCppCross{SurfFeatureDetector}. This adjusts the hessianThreshold of SurfFeatureDetector. \begin{lstlisting} class SurfAdjuster: public SurfAdjuster { SurfAdjuster(); ... }; \end{lstlisting}