160 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
\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<FeatureDetector> detector(new DynamicAdaptedFeatureDetector (100, 110, 10,
 | 
						|
                              new FastAdjuster(20,true)));
 | 
						|
\end{lstlisting}
 | 
						|
 
 | 
						|
\begin{lstlisting}
 | 
						|
class DynamicAdaptedFeatureDetector: public FeatureDetector 
 | 
						|
{
 | 
						|
public:
 | 
						|
    DynamicAdaptedFeatureDetector( const Ptr<AdjusterAdapter>& 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<AdjusterAdapter>\& 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}
 |