Difference between revisions of "Example Track Point Features"
From BoofCV
Jump to navigationJump to search (Updated for v0.16) |
|||
Line 12: | Line 12: | ||
Example Code: | Example Code: | ||
* [https://github.com/lessthanoptimal/BoofCV/blob/v0. | * [https://github.com/lessthanoptimal/BoofCV/blob/v0.16/examples/src/boofcv/examples/tracking/ExamplePointFeatureTracker.java ExamplePointFeatureTracker.java] | ||
Concepts: | Concepts: | ||
Line 25: | Line 25: | ||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
/** | |||
* <p> | |||
* Example of how to use the {@link boofcv.abst.feature.tracker.PointTracker} to track different types of point features. | |||
* ImagePointTracker hides much of the complexity involved in tracking point features and masks | |||
* the very different underlying structures used by these different trackers. The default trackers | |||
* provided in BoofCV are general purpose trackers, that might not be the best tracker or utility | |||
* the underlying image features the best in all situations. | |||
* </p> | |||
* | |||
* @author Peter Abeles | |||
*/ | |||
public class ExamplePointFeatureTracker< T extends ImageSingleBand, D extends ImageSingleBand> | public class ExamplePointFeatureTracker< T extends ImageSingleBand, D extends ImageSingleBand> | ||
{ | { | ||
Line 97: | Line 108: | ||
*/ | */ | ||
public void createKLT() { | public void createKLT() { | ||
PkltConfig | PkltConfig config = new PkltConfig(); | ||
config.templateRadius = 3; | config.templateRadius = 3; | ||
config.pyramidScaling = new int[]{1,2,4,8}; | config.pyramidScaling = new int[]{1,2,4,8}; | ||
tracker = FactoryPointTracker.klt(config, new ConfigGeneralDetector(200, 3, 1)); | tracker = FactoryPointTracker.klt(config, new ConfigGeneralDetector(200, 3, 1), | ||
imageType, derivType); | |||
} | } | ||
Revision as of 10:36, 26 December 2013
Tracked point features in an image sequence. Blue dots are older tracks and green dots are newly spawned tracks. |
---|
Tracking how point features move inside an image is used to extract the geometric structure and apparent motion of the scene. There are many different ways in which point features are tracked. BoofCV provides a basic tracker that hides much of this complexity and allows a variety of different trackers to be used with out modifying any of the code.
The example code below shows how to use the ImagePointTracker interface to process images and get a list of detected points. Which tracker is used can be changed by toggling comments in the main function.
Example Code:
Concepts:
- Loading image sequences
- Tracking point features abstractly
- Displaying the location of point features
Relevant Applets:
Example Code
/**
* <p>
* Example of how to use the {@link boofcv.abst.feature.tracker.PointTracker} to track different types of point features.
* ImagePointTracker hides much of the complexity involved in tracking point features and masks
* the very different underlying structures used by these different trackers. The default trackers
* provided in BoofCV are general purpose trackers, that might not be the best tracker or utility
* the underlying image features the best in all situations.
* </p>
*
* @author Peter Abeles
*/
public class ExamplePointFeatureTracker< T extends ImageSingleBand, D extends ImageSingleBand>
{
// type of input image
Class<T> imageType;
Class<D> derivType;
// tracks point features inside the image
PointTracker<T> tracker;
// displays the video sequence and tracked features
ImagePanel gui = new ImagePanel();
public ExamplePointFeatureTracker(Class<T> imageType) {
this.imageType = imageType;
this.derivType = GImageDerivativeOps.getDerivativeType(imageType);
}
/**
* Processes the sequence of images and displays the tracked features in a window
*/
public void process(SimpleImageSequence<T> sequence) {
// Figure out how large the GUI window should be
T frame = sequence.next();
gui.setPreferredSize(new Dimension(frame.getWidth(),frame.getHeight()));
ShowImages.showWindow(gui,"KTL Tracker");
// process each frame in the image sequence
while( sequence.hasNext() ) {
frame = sequence.next();
// tell the tracker to process the frame
tracker.process(frame);
// if there are too few tracks spawn more
if( tracker.getActiveTracks(null).size() < 100 )
tracker.spawnTracks();
// visualize tracking results
updateGUI(sequence);
// wait for a fraction of a second so it doesn't process to fast
BoofMiscOps.pause(100);
}
}
/**
* Draw tracked features in blue, or red if they were just spawned.
*/
private void updateGUI(SimpleImageSequence<T> sequence) {
BufferedImage orig = sequence.getGuiImage();
Graphics2D g2 = orig.createGraphics();
// draw active tracks as blue dots
for( PointTrack p : tracker.getActiveTracks(null) ) {
VisualizeFeatures.drawPoint(g2, (int)p.x, (int)p.y, Color.blue);
}
// draw tracks which have just been spawned green
for( PointTrack p : tracker.getNewTracks(null) ) {
VisualizeFeatures.drawPoint(g2, (int)p.x, (int)p.y, Color.green);
}
// tell the GUI to update
gui.setBufferedImage(orig);
gui.repaint();
}
/**
* A simple way to create a Kanade-Lucas-Tomasi (KLT) tracker.
*/
public void createKLT() {
PkltConfig config = new PkltConfig();
config.templateRadius = 3;
config.pyramidScaling = new int[]{1,2,4,8};
tracker = FactoryPointTracker.klt(config, new ConfigGeneralDetector(200, 3, 1),
imageType, derivType);
}
/**
* Creates a SURF feature tracker.
*/
public void createSURF() {
ConfigFastHessian configDetector = new ConfigFastHessian();
configDetector.maxFeaturesPerScale = 200;
configDetector.extractRadius = 3;
configDetector.initialSampleSize = 2;
tracker = FactoryPointTracker.dda_FH_SURF_Fast(configDetector, null, null, imageType);
}
public static void main( String args[] ) throws FileNotFoundException {
Class imageType = ImageFloat32.class;
// loads an MJPEG video sequence
VideoMjpegCodec codec = new VideoMjpegCodec();
List<byte[]> data = codec.read(new FileInputStream("../data/applet/zoom.mjpeg"));
SimpleImageSequence sequence = new JpegByteImageSequence(imageType,data,true);
ExamplePointFeatureTracker app = new ExamplePointFeatureTracker(imageType);
// Comment or un-comment to change the type of tracker being used
app.createKLT();
// app.createSURF();
app.process(sequence);
}
}