public class DescribePointSurf<II extends boofcv.struct.image.ImageGray>
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
| Modifier and Type | Field and Description |
|---|---|
protected int |
featureDOF |
protected boofcv.struct.sparse.SparseScaleGradient<II,?> |
gradient |
protected boofcv.struct.sparse.SparseImageGradient<II,?> |
gradientSafe |
protected II |
ii |
protected boofcv.alg.transform.ii.IntegralKernel |
kerXX |
protected boofcv.alg.transform.ii.IntegralKernel |
kerYY |
protected int |
radiusDescriptor |
protected boofcv.struct.convolve.Kernel2D_F64 |
weight |
protected int |
widthLargeGrid |
protected int |
widthSample |
protected int |
widthSubRegion |
| Constructor and Description |
|---|
DescribePointSurf(java.lang.Class<II> inputType)
Create a SURF-64 descriptor.
|
DescribePointSurf(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.
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
computeLaplaceSign(int x,
int y,
double scale)
Compute the sign of the Laplacian using a sparse convolution.
|
BrightFeature |
createDescription() |
void |
describe(double x,
double y,
double angle,
double scale,
BrightFeature ret)
Computes the SURF descriptor for the specified interest point.
|
void |
describe(double x,
double y,
double angle,
double scale,
TupleDesc_F64 ret)
Compute SURF descriptor, but without laplacian sign
|
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 |
getCanonicalWidth()
Width of sampled region when sampling is aligned with image pixels
|
int |
getDescriptionLength() |
void |
setImage(II integralImage) |
protected int widthLargeGrid
protected int widthSubRegion
protected int widthSample
protected int featureDOF
protected II extends boofcv.struct.image.ImageGray ii
protected boofcv.struct.convolve.Kernel2D_F64 weight
protected boofcv.struct.sparse.SparseScaleGradient<II extends boofcv.struct.image.ImageGray,?> gradient
protected boofcv.struct.sparse.SparseImageGradient<II extends boofcv.struct.image.ImageGray,?> gradientSafe
protected int radiusDescriptor
protected boofcv.alg.transform.ii.IntegralKernel kerXX
protected boofcv.alg.transform.ii.IntegralKernel kerYY
public DescribePointSurf(int widthLargeGrid,
int widthSubRegion,
int widthSample,
double weightSigma,
boolean useHaar,
java.lang.Class<II> inputType)
widthLargeGrid - Number of sub-regions wide the large grid is. Typically 4widthSubRegion - Number of sample points wide a sub-region is. Typically 5widthSample - The width of a sample point. Typically 4weightSigma - Weighting factor's sigma. Try 3.8useHaar - 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.public DescribePointSurf(java.lang.Class<II> inputType)
public BrightFeature createDescription()
public void setImage(II integralImage)
public void describe(double x,
double y,
double angle,
double scale,
BrightFeature 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.
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.public void describe(double x,
double y,
double angle,
double scale,
TupleDesc_F64 ret)
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.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:
c_x - Center of the feature x-coordinate.c_y - Center of the feature y-coordinate.c - cosine of the orientations - sine of the orientationscale - The scale of the wavelets.features - Where the features are written to. Must be 4*(widthLargeGrid*widthSubRegion)^2 large.public boolean computeLaplaceSign(int x,
int y,
double scale)
x - centery - centerscale - scale of the featurepublic int getDescriptionLength()
public int getCanonicalWidth()