Difference between revisions of "Example SURF Feature"
From BoofCV
Jump to navigationJump to searchm |
m |
||
Line 1: | Line 1: | ||
Speeded Up Robust Feature (SURF) is a region descriptor and interest point detector. Two different ways of using SURF are demonstrated in this example. The easy way uses a high level interface that is easy to work with, but sacrifices flexibility. The harder way directly creates the SURF classes, is more complex, and requires a better understanding of how the code works. | Speeded Up Robust Feature (SURF) is a region descriptor and interest point detector. Two different ways of using SURF are demonstrated in this example. The easy way uses a high level interface that is easy to work with, but sacrifices flexibility. The harder way directly creates the SURF classes, is more complex, and requires a better understanding of how the code works. | ||
Example File: [https://github.com/lessthanoptimal/BoofCV/blob/v0. | Example File: [https://github.com/lessthanoptimal/BoofCV/blob/v0.21/examples/src/boofcv/examples/features/ExampleFeatureSurf.java ExampleFeatureSurf.java] | ||
Concepts: | Concepts: | ||
Line 30: | Line 30: | ||
public static void easy( ImageFloat32 image ) { | public static void easy( ImageFloat32 image ) { | ||
// create the detector and descriptors | // create the detector and descriptors | ||
DetectDescribePoint<ImageFloat32, | DetectDescribePoint<ImageFloat32,BrightFeature> surf = FactoryDetectDescribe. | ||
surfStable(new ConfigFastHessian(0, 2, 200, 2, 9, 4, 4), null, null,ImageFloat32.class); | surfStable(new ConfigFastHessian(0, 2, 200, 2, 9, 4, 4), null, null,ImageFloat32.class); | ||
Line 56: | Line 56: | ||
FactoryFeatureExtractor.nonmax(new ConfigExtract(2, 0, 5, true)); | FactoryFeatureExtractor.nonmax(new ConfigExtract(2, 0, 5, true)); | ||
FastHessianFeatureDetector<II> detector = | FastHessianFeatureDetector<II> detector = | ||
new FastHessianFeatureDetector<II>(extractor,200,2, 9,4,4); | new FastHessianFeatureDetector<II>(extractor,200,2, 9,4,4,6); | ||
// estimate orientation | // estimate orientation | ||
Line 76: | Line 76: | ||
List<ScalePoint> points = detector.getFoundPoints(); | List<ScalePoint> points = detector.getFoundPoints(); | ||
List< | List<BrightFeature> descriptions = new ArrayList<BrightFeature>(); | ||
for( ScalePoint p : points ) { | for( ScalePoint p : points ) { | ||
// estimate orientation | // estimate orientation | ||
orientation. | orientation.setObjectRadius( p.scale*BoofDefaults.SURF_SCALE_TO_RADIUS); | ||
double angle = orientation.compute(p.x,p.y); | double angle = orientation.compute(p.x,p.y); | ||
// extract the SURF description for this region | // extract the SURF description for this region | ||
BrightFeature desc = descriptor.createDescription(); | |||
descriptor.describe(p.x,p.y,angle,p.scale,desc); | descriptor.describe(p.x,p.y,angle,p.scale,desc); | ||
Revision as of 21:03, 23 January 2016
Speeded Up Robust Feature (SURF) is a region descriptor and interest point detector. Two different ways of using SURF are demonstrated in this example. The easy way uses a high level interface that is easy to work with, but sacrifices flexibility. The harder way directly creates the SURF classes, is more complex, and requires a better understanding of how the code works.
Example File: ExampleFeatureSurf.java
Concepts:
- SURF
- Region Descriptor
- Interest Point
Relevant Applets:
Example Code
/**
* Example of how to use SURF detector and descriptors in BoofCV.
*
* @author Peter Abeles
*/
public class ExampleFeatureSurf {
/**
* Use generalized interfaces for working with SURF. This removes much of the drudgery, but also reduces flexibility
* and slightly increases memory and computational requirements.
*
* @param image Input image type. DOES NOT NEED TO BE ImageFloat32, ImageUInt8 works too
*/
public static void easy( ImageFloat32 image ) {
// create the detector and descriptors
DetectDescribePoint<ImageFloat32,BrightFeature> surf = FactoryDetectDescribe.
surfStable(new ConfigFastHessian(0, 2, 200, 2, 9, 4, 4), null, null,ImageFloat32.class);
// specify the image to process
surf.detect(image);
System.out.println("Found Features: "+surf.getNumberOfFeatures());
System.out.println("First descriptor's first value: "+surf.getDescription(0).value[0]);
}
/**
* Configured exactly the same as the easy example above, but require a lot more code and a more in depth
* understanding of how SURF works and is configured. Instead of TupleDesc_F64, SurfFeature are computed in
* this case. They are almost the same as TupleDesc_F64, but contain the Laplacian's sign which can be used
* to speed up association. That is an example of how using less generalized interfaces can improve performance.
*
* @param image Input image type. DOES NOT NEED TO BE ImageFloat32, ImageUInt8 works too
*/
public static <II extends ImageSingleBand> void harder( ImageFloat32 image ) {
// SURF works off of integral images
Class<II> integralType = GIntegralImageOps.getIntegralType(ImageFloat32.class);
// define the feature detection algorithm
NonMaxSuppression extractor =
FactoryFeatureExtractor.nonmax(new ConfigExtract(2, 0, 5, true));
FastHessianFeatureDetector<II> detector =
new FastHessianFeatureDetector<II>(extractor,200,2, 9,4,4,6);
// estimate orientation
OrientationIntegral<II> orientation =
FactoryOrientationAlgs.sliding_ii(null, integralType);
DescribePointSurf<II> descriptor = FactoryDescribePointAlgs.<II>surfStability(null,integralType);
// compute the integral image of 'image'
II integral = GeneralizedImageOps.createSingleBand(integralType,image.width,image.height);
GIntegralImageOps.transform(image, integral);
// detect fast hessian features
detector.detect(integral);
// tell algorithms which image to process
orientation.setImage(integral);
descriptor.setImage(integral);
List<ScalePoint> points = detector.getFoundPoints();
List<BrightFeature> descriptions = new ArrayList<BrightFeature>();
for( ScalePoint p : points ) {
// estimate orientation
orientation.setObjectRadius( p.scale*BoofDefaults.SURF_SCALE_TO_RADIUS);
double angle = orientation.compute(p.x,p.y);
// extract the SURF description for this region
BrightFeature desc = descriptor.createDescription();
descriptor.describe(p.x,p.y,angle,p.scale,desc);
// save everything for processing later on
descriptions.add(desc);
}
System.out.println("Found Features: "+points.size());
System.out.println("First descriptor's first value: "+descriptions.get(0).value[0]);
}
public static void main( String args[] ) {
ImageFloat32 image = UtilImageIO.loadImage(UtilIO.pathExample("particles01.jpg"), ImageFloat32.class);
// run each example
ExampleFeatureSurf.easy(image);
ExampleFeatureSurf.harder(image);
System.out.println("Done!");
}
}