utilities.boofcv_extensions
Class DescribePointSurfNormalization<II extends boofcv.struct.image.ImageSingleBand>

java.lang.Object
  extended by utilities.boofcv_extensions.DescribePointSurfNormalization<II>
Direct Known Subclasses:
DescribePointSurfModNormalization

public class DescribePointSurfNormalization<II extends boofcv.struct.image.ImageSingleBand>
extends java.lang.Object

Implementation of the SURF feature descriptor, see [1]. SURF features are invariant to illumination, scale, and orientation. Both the orientated and unoriented varieties can be computed. SURF-64 describes an interest point using a 64 values that are computed from 16 sub regions. Each sub-region contributes 4 features, the sum of dx,|dx|,dy,|dy|, where dx and dy are the local derivatives.

To improve performance (stability and/or computational) there are a few (intentional) deviations from the original paper.

Usage Notes:
If the input image is floating point then normalizing it will very slightly improves stability. Normalization in this situation means dividing the input image by the maximum pixel intensity value, typically 255. In stability benchmarks it slightly change the results, but not enough to justify the runtime performance hit.

[1] Bay, Herbert and Ess, Andreas and Tuytelaars, Tinne and Van Gool, Luc, "Speeded-Up Robust Features (SURF)" Comput. Vis. Image Underst., vol 110, issue 3, 2008

Author:
Peter Abeles

Field Summary
protected  int featureDOF
           
protected  boofcv.struct.sparse.SparseScaleGradient<II,?> gradient
           
protected  II ii
           
protected  boofcv.struct.convolve.Kernel2D_F64 weight
           
protected  int widthLargeGrid
           
protected  int widthSample
           
protected  int widthSubRegion
           
 
Constructor Summary
DescribePointSurfNormalization(java.lang.Class<II> inputType)
          Create a SURF-64 descriptor.
DescribePointSurfNormalization(int widthLargeGrid, int widthSubRegion, int widthSample, double weightSigma, boolean useHaar, java.lang.Class<II> inputType)
          Creates a SURF descriptor of arbitrary dimension by changing how the local region is sampled.
 
Method Summary
protected  boolean computeLaplaceSign(int x, int y, double scale)
          Compute the sign of the Laplacian using a sparse convolution.
 boofcv.struct.feature.SurfFeature createDescription()
           
 void describe(double x, double y, double angle, double scale, boofcv.struct.feature.SurfFeature ret)
           Computes the SURF descriptor for the specified interest point.
 void features(double c_x, double c_y, double c, double s, double scale, boofcv.struct.sparse.SparseImageGradient gradient, double[] features)
           Computes features in the SURF descriptor.
 int getDescriptionLength()
           
 int getRadius()
           
 void setImage(II integralImage)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

widthLargeGrid

protected int widthLargeGrid

widthSubRegion

protected int widthSubRegion

widthSample

protected int widthSample

featureDOF

protected int featureDOF

ii

protected II extends boofcv.struct.image.ImageSingleBand ii

weight

protected boofcv.struct.convolve.Kernel2D_F64 weight

gradient

protected boofcv.struct.sparse.SparseScaleGradient<II extends boofcv.struct.image.ImageSingleBand,?> gradient
Constructor Detail

DescribePointSurfNormalization

public DescribePointSurfNormalization(int widthLargeGrid,
                                      int widthSubRegion,
                                      int widthSample,
                                      double weightSigma,
                                      boolean useHaar,
                                      java.lang.Class<II> inputType)
Creates a SURF descriptor of arbitrary dimension by changing how the local region is sampled.

Parameters:
widthLargeGrid - Number of sub-regions wide the large grid is. Typically 4
widthSubRegion - Number of sample points wide a sub-region is. Typically 5
widthSample - The width of a sample point. Typically 4
weightSigma - Weighting factor's sigma. Try 3.8
useHaar - If true the Haar wavelet will be used (what was used in [1]), false means an image gradient approximation will be used. False is recommended.

DescribePointSurfNormalization

public DescribePointSurfNormalization(java.lang.Class<II> inputType)
Create a SURF-64 descriptor. See [1] for details.

Method Detail

createDescription

public boofcv.struct.feature.SurfFeature createDescription()

setImage

public void setImage(II integralImage)

describe

public void describe(double x,
                     double y,
                     double angle,
                     double scale,
                     boofcv.struct.feature.SurfFeature ret)

Computes the SURF descriptor for the specified interest point. If the feature goes outside of the image border (including convolution kernels) then null is returned.

Parameters:
x - Location of interest point.
y - Location of interest point.
angle - The angle the feature is pointing at in radians.
scale - Scale of the interest point. Null is returned if the feature goes outside the image border.
ret - storage for the feature. Must have 64 values.

features

public void features(double c_x,
                     double c_y,
                     double c,
                     double s,
                     double scale,
                     boofcv.struct.sparse.SparseImageGradient gradient,
                     double[] features)

Computes features in the SURF descriptor.

Deviation from paper:

Parameters:
c_x - Center of the feature x-coordinate.
c_y - Center of the feature y-coordinate.
c - cosine of the orientation
s - sine of the orientation
scale - The scale of the wavelets.
features - Where the features are written to. Must be 4*(widthLargeGrid*widthSubRegion)^2 large.

computeLaplaceSign

protected boolean computeLaplaceSign(int x,
                                     int y,
                                     double scale)
Compute the sign of the Laplacian using a sparse convolution.

Parameters:
x - center
y - center
scale - scale of the feature
Returns:
true if positive

getDescriptionLength

public int getDescriptionLength()

getRadius

public int getRadius()