<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://boofcv.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Spam</id>
	<title>BoofCV - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://boofcv.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Spam"/>
	<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Special:Contributions/Spam"/>
	<updated>2026-08-13T15:54:19Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.36.2</generator>
	<entry>
		<id>http://boofcv.org/index.php?title=User:FranceDauby1095&amp;diff=379</id>
		<title>User:FranceDauby1095</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=User:FranceDauby1095&amp;diff=379"/>
		<updated>2011-11-16T00:11:28Z</updated>

		<summary type="html">&lt;p&gt;Spam: Created page with &amp;quot;[http://www.seatmpin.com WHATSSSSS]&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.seatmpin.com WHATSSSSS]&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Performance:SURF&amp;diff=315</id>
		<title>Performance:SURF</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Performance:SURF&amp;diff=315"/>
		<updated>2011-11-01T17:32:05Z</updated>

		<summary type="html">&lt;p&gt;Spam: /* Comparison of SURF implementations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Comparison of SURF implementations =&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/SURF SURF] descriptor is a state-of-the-art image region descriptor that is invariant with regard to scale, orientation, and illumination. By using an integral image, the descriptor can be computed efficiently across different scales.  In recent years it has emerged as one of the more popular and frequently-used feature descriptors, but it is not a trivial algorithm to implement, and several different implementations exist.  The following study compares several different libraries to determine relative stability and runtime performance.&lt;br /&gt;
&lt;br /&gt;
Tested Implementations:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Implementation &lt;br /&gt;
! Version&lt;br /&gt;
! Language &lt;br /&gt;
! Threaded&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
| BoofCV || 10/2011 || Java || || Fast but less accurate. See FactoryDescribeRegionPoint.surf() &lt;br /&gt;
|-&lt;br /&gt;
| BoofCV-M || 10/2011 || Java || || Accurate but slower. See FactoryDescribeRegionPoint.msurf() &lt;br /&gt;
|-&lt;br /&gt;
| OpenSURF || 27/05/2010 || C++ || || http://www.chrisevansdev.com/computer-vision-opensurf.html&lt;br /&gt;
|-&lt;br /&gt;
| Reference || 1.0.9 || C++ || || http://www.vision.ee.ethz.ch/~surf/&lt;br /&gt;
|-&lt;br /&gt;
| JOpenSURF || SVN r24 || Java || || http://code.google.com/p/jopensurf/&lt;br /&gt;
|-&lt;br /&gt;
| JavaSURF || SVN r4 || Java || || http://code.google.com/p/javasurf/&lt;br /&gt;
|-&lt;br /&gt;
| OpenCV || 2.3.1 SVN r6879 || C++ || Yes || http://opencv.willowgarage.com/wiki/&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Benchmark Source Code:&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/benchmark BoofCV benchmark]&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/misc External libraries]&lt;br /&gt;
&lt;br /&gt;
= Conclusions =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/overall_describe_speed.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/overall_detect_speed.gif&lt;br /&gt;
|-&lt;br /&gt;
! Lower is better. !! Lower is better.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| &amp;lt;center&amp;gt;http://www.boofcv.org/notwiki/images/benchmark_surf/overall_stability.gif &amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| Higher is better.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the sake of those with short attention spans, the summary results are posted first and a discussion of testing methodology follows.  The top two plots show feature detection and feature describe speed.  Feature detection is the detection of the location and scale of interest points  inside the image using each library&amp;#039;s implementation of the Fast Hessian detector.  A feature is described by estimating its orientation and computing the SURF-64 descriptor.  The bottommost plot shows a summary of the descriptors&amp;#039; relative stabilities across a standard set of test images.&lt;br /&gt;
&lt;br /&gt;
One reason for JavaSURF&amp;#039;s poor stability is that it only implements an upright version of SURF, so rotated images defeat the descriptor.  Not computing orientation helps JavaSURF on the description runtime benchmark, because it has fewer computations to perform.  JOpenSURF is a straightforward port of the OpenSURF library to Java and shows comparable stability with the expected hit on runtime performance.  JOpenSURF, OpenSURF and BoofCV-M all compute an enhanced version of the SURF descriptor, while the BoofCV descriptor is closer to the SURF paper with some improvements.  I suspect that the descriptor computed by the reference library is also an improvement over what was presented in the SURF paper, but the source code is closed, so this theory cannot be directly verified.&lt;br /&gt;
&lt;br /&gt;
OpenCV is a bit of an oddball library as far as SURF is concerned.  It did not provide an interface that would allow it to be tested in the same manner as the other libraries, and comments in the code indicated that parts of it are multi-threaded.  Every other library tested is single-threaded.  Because of these issues, OpenCV&amp;#039;s own interest points were used instead of the precomputed ones.  Speed-wise, a special test was done for OpenCV where features were detected and described at the same time, which took 1940 (ms) for 6485 features.  This was approximately 20% slower than OpenSURF&amp;#039;s combined detect and describe time.&lt;br /&gt;
&lt;br /&gt;
= Descriptor Stability =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Images from evaluation data set&amp;quot; heights=150 widths=200 &amp;gt;&lt;br /&gt;
Image:Performance-descriptor-Graffiti.jpg|Graffiti&lt;br /&gt;
Image:Performance-descriptor-Boat.jpg|Boat&lt;br /&gt;
Image:Performance-descriptor-Trees.jpg|Trees&lt;br /&gt;
Image:Performance-descriptor-Bricks.jpg|Bricks&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stability benchmark was performed using standardized test images from [http://www.robots.ox.ac.uk/~vgg/research/affine/], which have known transformations. Stability was measured based on the number of correct associations between two images in the data set.  The testing procedure for each library is summarized below:&lt;br /&gt;
&lt;br /&gt;
# For each image, detect features (scale and location) using the fast Hessian detector in BoofCV.&lt;br /&gt;
#* Save results to a file and use the same file for all libraries. &lt;br /&gt;
# For each image, compute a feature description (including orientation) for all features found.&lt;br /&gt;
# In each image sequence, associate features in the first image to the Nth image, where N &amp;gt; 1.&lt;br /&gt;
#* Association is done by minimizing Euclidean error.&lt;br /&gt;
#* Validation is done using reverse association, i.e. the association must be the optimal association going from frame 1 to N and N to 1.&lt;br /&gt;
# Compute the number of correct associations.&lt;br /&gt;
#* An association is correct if it is within 3 pixels of the true location.&lt;br /&gt;
&lt;br /&gt;
Since the transformation is known between images, the true location could have been used.  However, in reality features will not lie at the exact point, and a descriptor needs to be tolerant of this type of error.  Thus, this is a more accurate measure of the descriptor&amp;#039;s strength.&lt;br /&gt;
&lt;br /&gt;
The relative stability metric described above is computed by summing up the total percent of correctly associated features across the whole test data set, and then choosing the library with the best performance. The relative stability is computed by dividing each library&amp;#039;s score by the best performer&amp;#039;s score.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration:&amp;#039;&amp;#039;&amp;#039; All libraries were configured to describe oriented SURF-64 features as defined in the original SURF paper.  JavaSURF does not support orientation estimation.  OpenCV forces orientation to be estimated inside the feature detector; therefore it was decided that the lesser evil would be to let OpenCV detect its own features.  OpenCV&amp;#039;s threshold was adjusted so that it detected about the same number of features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stability Results ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bike.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_boat.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_graf.gif] || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_leuven.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_ubc.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_trees.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_wall.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bark.gif&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Runtime Speed =&lt;br /&gt;
Each library&amp;#039;s speed in describing and detecting features was also benchmarked.  Each test was performed several times, but only the best time is shown.  Java libraries tended to exhibit more variation than native libraries, although all libraries showed a significant amount of variation from trial to trial.  &lt;br /&gt;
&lt;br /&gt;
Only image processing time essential to SURF was measured, not image loading time.  This would include the time to convert an image to integral image format, but not the time to convert the image to grayscale, assuming it was possible to not include the grayscale conversion.  Elapsed time was measured in the actual application using System.currentTimeMillis() in Java and clock() in C++. &lt;br /&gt;
&lt;br /&gt;
Testing Procedure:&lt;br /&gt;
# Kill all extraneous processes. &lt;br /&gt;
# Load feature location and size from file.&lt;br /&gt;
# Compute descriptors (including orientation) for each feature while recording elapsed time.&lt;br /&gt;
# Compute elapsed time 10 times and output best result.&lt;br /&gt;
# Run the whole experiment 4 times for each library and record the best time.&lt;br /&gt;
&lt;br /&gt;
Test Computer:  &lt;br /&gt;
* Ubuntu 10.10 64bit&lt;br /&gt;
* Quadcore Q6600 2.4 GHz&lt;br /&gt;
* Memory 8194 GB&lt;br /&gt;
* g++ 4.4.5&lt;br /&gt;
* Java(TM) SE Runtime Environment (build 1.6.0_26-b03)&lt;br /&gt;
&lt;br /&gt;
Compiler and JRE Configuration:&lt;br /&gt;
* All native libraries were compiled with -O3&lt;br /&gt;
* Java applications were run with no special flags&lt;br /&gt;
&lt;br /&gt;
Describe Specific Setup:&lt;br /&gt;
* input image was boat/img1&lt;br /&gt;
* Fast Hessian features from BoofCV&lt;br /&gt;
** 6415 Total&lt;br /&gt;
&lt;br /&gt;
Detect Specific Setup:&lt;br /&gt;
* Impossible to configure libraries to detect exact same features&lt;br /&gt;
** Adjusted detection threshold to top out at around 2000 features&lt;br /&gt;
* Octaves: 4&lt;br /&gt;
* Scales: 4&lt;br /&gt;
* Base Size: 9&lt;br /&gt;
* Initial Pixel Skip: 1&lt;br /&gt;
&lt;br /&gt;
Results can be found at the top of the page. OpenCV was omitted from runtime results because it could not be configured identically to the other libraries.  A special test was performed just for OpenCV and is discussed above.  It is not known what pixel skip was used inside of OpenCV.&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Performance:SURF&amp;diff=314</id>
		<title>Performance:SURF</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Performance:SURF&amp;diff=314"/>
		<updated>2011-11-01T17:31:54Z</updated>

		<summary type="html">&lt;p&gt;Spam: /* Runtime Speed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Comparison of SURF implementations =&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/SURF SURF] descriptor is a state-of-the-art image region descriptor that is invariant with regard to scale, orientation, and illumination. By using an integral image, the descriptor can be computed efficiently across different scales.  In recent years it has emerged as one of the more popular and frequently-used feature descriptors, but it is not a trivial algorithm to implement, and several different implementations exist.  The following study compares several different libraries to determine relative stability and run-time performance.&lt;br /&gt;
&lt;br /&gt;
Tested Implementations:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Implementation &lt;br /&gt;
! Version&lt;br /&gt;
! Language &lt;br /&gt;
! Threaded&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
| BoofCV || 10/2011 || Java || || Fast but less accurate. See FactoryDescribeRegionPoint.surf() &lt;br /&gt;
|-&lt;br /&gt;
| BoofCV-M || 10/2011 || Java || || Accurate but slower. See FactoryDescribeRegionPoint.msurf() &lt;br /&gt;
|-&lt;br /&gt;
| OpenSURF || 27/05/2010 || C++ || || http://www.chrisevansdev.com/computer-vision-opensurf.html&lt;br /&gt;
|-&lt;br /&gt;
| Reference || 1.0.9 || C++ || || http://www.vision.ee.ethz.ch/~surf/&lt;br /&gt;
|-&lt;br /&gt;
| JOpenSURF || SVN r24 || Java || || http://code.google.com/p/jopensurf/&lt;br /&gt;
|-&lt;br /&gt;
| JavaSURF || SVN r4 || Java || || http://code.google.com/p/javasurf/&lt;br /&gt;
|-&lt;br /&gt;
| OpenCV || 2.3.1 SVN r6879 || C++ || Yes || http://opencv.willowgarage.com/wiki/&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Benchmark Source Code:&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/benchmark BoofCV benchmark]&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/misc External libraries]&lt;br /&gt;
&lt;br /&gt;
= Conclusions =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/overall_describe_speed.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/overall_detect_speed.gif&lt;br /&gt;
|-&lt;br /&gt;
! Lower is better. !! Lower is better.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| &amp;lt;center&amp;gt;http://www.boofcv.org/notwiki/images/benchmark_surf/overall_stability.gif &amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| Higher is better.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the sake of those with short attention spans, the summary results are posted first and a discussion of testing methodology follows.  The top two plots show feature detection and feature describe speed.  Feature detection is the detection of the location and scale of interest points  inside the image using each library&amp;#039;s implementation of the Fast Hessian detector.  A feature is described by estimating its orientation and computing the SURF-64 descriptor.  The bottommost plot shows a summary of the descriptors&amp;#039; relative stabilities across a standard set of test images.&lt;br /&gt;
&lt;br /&gt;
One reason for JavaSURF&amp;#039;s poor stability is that it only implements an upright version of SURF, so rotated images defeat the descriptor.  Not computing orientation helps JavaSURF on the description runtime benchmark, because it has fewer computations to perform.  JOpenSURF is a straightforward port of the OpenSURF library to Java and shows comparable stability with the expected hit on runtime performance.  JOpenSURF, OpenSURF and BoofCV-M all compute an enhanced version of the SURF descriptor, while the BoofCV descriptor is closer to the SURF paper with some improvements.  I suspect that the descriptor computed by the reference library is also an improvement over what was presented in the SURF paper, but the source code is closed, so this theory cannot be directly verified.&lt;br /&gt;
&lt;br /&gt;
OpenCV is a bit of an oddball library as far as SURF is concerned.  It did not provide an interface that would allow it to be tested in the same manner as the other libraries, and comments in the code indicated that parts of it are multi-threaded.  Every other library tested is single-threaded.  Because of these issues, OpenCV&amp;#039;s own interest points were used instead of the precomputed ones.  Speed-wise, a special test was done for OpenCV where features were detected and described at the same time, which took 1940 (ms) for 6485 features.  This was approximately 20% slower than OpenSURF&amp;#039;s combined detect and describe time.&lt;br /&gt;
&lt;br /&gt;
= Descriptor Stability =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Images from evaluation data set&amp;quot; heights=150 widths=200 &amp;gt;&lt;br /&gt;
Image:Performance-descriptor-Graffiti.jpg|Graffiti&lt;br /&gt;
Image:Performance-descriptor-Boat.jpg|Boat&lt;br /&gt;
Image:Performance-descriptor-Trees.jpg|Trees&lt;br /&gt;
Image:Performance-descriptor-Bricks.jpg|Bricks&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stability benchmark was performed using standardized test images from [http://www.robots.ox.ac.uk/~vgg/research/affine/], which have known transformations. Stability was measured based on the number of correct associations between two images in the data set.  The testing procedure for each library is summarized below:&lt;br /&gt;
&lt;br /&gt;
# For each image, detect features (scale and location) using the fast Hessian detector in BoofCV.&lt;br /&gt;
#* Save results to a file and use the same file for all libraries. &lt;br /&gt;
# For each image, compute a feature description (including orientation) for all features found.&lt;br /&gt;
# In each image sequence, associate features in the first image to the Nth image, where N &amp;gt; 1.&lt;br /&gt;
#* Association is done by minimizing Euclidean error.&lt;br /&gt;
#* Validation is done using reverse association, i.e. the association must be the optimal association going from frame 1 to N and N to 1.&lt;br /&gt;
# Compute the number of correct associations.&lt;br /&gt;
#* An association is correct if it is within 3 pixels of the true location.&lt;br /&gt;
&lt;br /&gt;
Since the transformation is known between images, the true location could have been used.  However, in reality features will not lie at the exact point, and a descriptor needs to be tolerant of this type of error.  Thus, this is a more accurate measure of the descriptor&amp;#039;s strength.&lt;br /&gt;
&lt;br /&gt;
The relative stability metric described above is computed by summing up the total percent of correctly associated features across the whole test data set, and then choosing the library with the best performance. The relative stability is computed by dividing each library&amp;#039;s score by the best performer&amp;#039;s score.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration:&amp;#039;&amp;#039;&amp;#039; All libraries were configured to describe oriented SURF-64 features as defined in the original SURF paper.  JavaSURF does not support orientation estimation.  OpenCV forces orientation to be estimated inside the feature detector; therefore it was decided that the lesser evil would be to let OpenCV detect its own features.  OpenCV&amp;#039;s threshold was adjusted so that it detected about the same number of features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stability Results ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bike.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_boat.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_graf.gif] || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_leuven.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_ubc.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_trees.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_wall.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bark.gif&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Runtime Speed =&lt;br /&gt;
Each library&amp;#039;s speed in describing and detecting features was also benchmarked.  Each test was performed several times, but only the best time is shown.  Java libraries tended to exhibit more variation than native libraries, although all libraries showed a significant amount of variation from trial to trial.  &lt;br /&gt;
&lt;br /&gt;
Only image processing time essential to SURF was measured, not image loading time.  This would include the time to convert an image to integral image format, but not the time to convert the image to grayscale, assuming it was possible to not include the grayscale conversion.  Elapsed time was measured in the actual application using System.currentTimeMillis() in Java and clock() in C++. &lt;br /&gt;
&lt;br /&gt;
Testing Procedure:&lt;br /&gt;
# Kill all extraneous processes. &lt;br /&gt;
# Load feature location and size from file.&lt;br /&gt;
# Compute descriptors (including orientation) for each feature while recording elapsed time.&lt;br /&gt;
# Compute elapsed time 10 times and output best result.&lt;br /&gt;
# Run the whole experiment 4 times for each library and record the best time.&lt;br /&gt;
&lt;br /&gt;
Test Computer:  &lt;br /&gt;
* Ubuntu 10.10 64bit&lt;br /&gt;
* Quadcore Q6600 2.4 GHz&lt;br /&gt;
* Memory 8194 GB&lt;br /&gt;
* g++ 4.4.5&lt;br /&gt;
* Java(TM) SE Runtime Environment (build 1.6.0_26-b03)&lt;br /&gt;
&lt;br /&gt;
Compiler and JRE Configuration:&lt;br /&gt;
* All native libraries were compiled with -O3&lt;br /&gt;
* Java applications were run with no special flags&lt;br /&gt;
&lt;br /&gt;
Describe Specific Setup:&lt;br /&gt;
* input image was boat/img1&lt;br /&gt;
* Fast Hessian features from BoofCV&lt;br /&gt;
** 6415 Total&lt;br /&gt;
&lt;br /&gt;
Detect Specific Setup:&lt;br /&gt;
* Impossible to configure libraries to detect exact same features&lt;br /&gt;
** Adjusted detection threshold to top out at around 2000 features&lt;br /&gt;
* Octaves: 4&lt;br /&gt;
* Scales: 4&lt;br /&gt;
* Base Size: 9&lt;br /&gt;
* Initial Pixel Skip: 1&lt;br /&gt;
&lt;br /&gt;
Results can be found at the top of the page. OpenCV was omitted from runtime results because it could not be configured identically to the other libraries.  A special test was performed just for OpenCV and is discussed above.  It is not known what pixel skip was used inside of OpenCV.&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Performance:SURF&amp;diff=312</id>
		<title>Performance:SURF</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Performance:SURF&amp;diff=312"/>
		<updated>2011-11-01T17:20:28Z</updated>

		<summary type="html">&lt;p&gt;Spam: /* Descriptor Stability */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Comparison of SURF implementations =&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/SURF SURF] descriptor is a state-of-the-art image region descriptor that is invariant with regard to scale, orientation, and illumination. By using an integral image, the descriptor can be computed efficiently across different scales.  In recent years it has emerged as one of the more popular and frequently-used feature descriptors, but it is not a trivial algorithm to implement, and several different implementations exist.  The following study compares several different libraries to determine relative stability and run-time performance.&lt;br /&gt;
&lt;br /&gt;
Tested Implementations:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Implementation &lt;br /&gt;
! Version&lt;br /&gt;
! Language &lt;br /&gt;
! Threaded&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
| BoofCV || 10/2011 || Java || || Fast but less accurate. See FactoryDescribeRegionPoint.surf() &lt;br /&gt;
|-&lt;br /&gt;
| BoofCV-M || 10/2011 || Java || || Accurate but slower. See FactoryDescribeRegionPoint.msurf() &lt;br /&gt;
|-&lt;br /&gt;
| OpenSURF || 27/05/2010 || C++ || || http://www.chrisevansdev.com/computer-vision-opensurf.html&lt;br /&gt;
|-&lt;br /&gt;
| Reference || 1.0.9 || C++ || || http://www.vision.ee.ethz.ch/~surf/&lt;br /&gt;
|-&lt;br /&gt;
| JOpenSURF || SVN r24 || Java || || http://code.google.com/p/jopensurf/&lt;br /&gt;
|-&lt;br /&gt;
| JavaSURF || SVN r4 || Java || || http://code.google.com/p/javasurf/&lt;br /&gt;
|-&lt;br /&gt;
| OpenCV || 2.3.1 SVN r6879 || C++ || Yes || http://opencv.willowgarage.com/wiki/&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Benchmark Source Code:&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/benchmark BoofCV benchmark]&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/misc External libraries]&lt;br /&gt;
&lt;br /&gt;
= Conclusions =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/overall_describe_speed.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/overall_detect_speed.gif&lt;br /&gt;
|-&lt;br /&gt;
! Lower is better. !! Lower is better.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| &amp;lt;center&amp;gt;http://www.boofcv.org/notwiki/images/benchmark_surf/overall_stability.gif &amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| Higher is better.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the sake of those with short attention spans, the summary results are posted first and a discussion of testing methodology follows.  The top two plots show feature detection and feature describe speed.  Feature detection is the detection of the location and scale of interest points  inside the image using each library&amp;#039;s implementation of the Fast Hessian detector.  A feature is described by estimating its orientation and computing the SURF-64 descriptor.  The bottommost plot shows a summary of the descriptors&amp;#039; relative stabilities across a standard set of test images.&lt;br /&gt;
&lt;br /&gt;
One reason for JavaSURF&amp;#039;s poor stability is that it only implements an upright version of SURF, so rotated images defeat the descriptor.  Not computing orientation helps JavaSURF on the description runtime benchmark, because it has fewer computations to perform.  JOpenSURF is a straightforward port of the OpenSURF library to Java and shows comparable stability with the expected hit on runtime performance.  JOpenSURF, OpenSURF and BoofCV-M all compute an enhanced version of the SURF descriptor, while the BoofCV descriptor is closer to the SURF paper with some improvements.  I suspect that the descriptor computed by the reference library is also an improvement over what was presented in the SURF paper, but the source code is closed, so this theory cannot be directly verified.&lt;br /&gt;
&lt;br /&gt;
OpenCV is a bit of an oddball library as far as SURF is concerned.  It did not provide an interface that would allow it to be tested in the same manner as the other libraries, and comments in the code indicated that parts of it are multi-threaded.  Every other library tested is single-threaded.  Because of these issues, OpenCV&amp;#039;s own interest points were used instead of the precomputed ones.  Speed-wise, a special test was done for OpenCV where features were detected and described at the same time, which took 1940 (ms) for 6485 features.  This was approximately 20% slower than OpenSURF&amp;#039;s combined detect and describe time.&lt;br /&gt;
&lt;br /&gt;
= Descriptor Stability =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Images from evaluation data set&amp;quot; heights=150 widths=200 &amp;gt;&lt;br /&gt;
Image:Performance-descriptor-Graffiti.jpg|Graffiti&lt;br /&gt;
Image:Performance-descriptor-Boat.jpg|Boat&lt;br /&gt;
Image:Performance-descriptor-Trees.jpg|Trees&lt;br /&gt;
Image:Performance-descriptor-Bricks.jpg|Bricks&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stability benchmark was performed using standardized test images from [http://www.robots.ox.ac.uk/~vgg/research/affine/], which have known transformations. Stability was measured based on the number of correct associations between two images in the data set.  The testing procedure for each library is summarized below:&lt;br /&gt;
&lt;br /&gt;
# For each image, detect features (scale and location) using the fast Hessian detector in BoofCV.&lt;br /&gt;
#* Save results to a file and use the same file for all libraries. &lt;br /&gt;
# For each image, compute a feature description (including orientation) for all features found.&lt;br /&gt;
# In each image sequence, associate features in the first image to the Nth image, where N &amp;gt; 1.&lt;br /&gt;
#* Association is done by minimizing Euclidean error.&lt;br /&gt;
#* Validation is done using reverse association, i.e. the association must be the optimal association going from frame 1 to N and N to 1.&lt;br /&gt;
# Compute the number of correct associations.&lt;br /&gt;
#* An association is correct if it is within 3 pixels of the true location.&lt;br /&gt;
&lt;br /&gt;
Since the transformation is known between images, the true location could have been used.  However, in reality features will not lie at the exact point, and a descriptor needs to be tolerant of this type of error.  Thus, this is a more accurate measure of the descriptor&amp;#039;s strength.&lt;br /&gt;
&lt;br /&gt;
The relative stability metric described above is computed by summing up the total percent of correctly associated features across the whole test data set, and then choosing the library with the best performance. The relative stability is computed by dividing each library&amp;#039;s score by the best performer&amp;#039;s score.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration:&amp;#039;&amp;#039;&amp;#039; All libraries were configured to describe oriented SURF-64 features as defined in the original SURF paper.  JavaSURF does not support orientation estimation.  OpenCV forces orientation to be estimated inside the feature detector; therefore it was decided that the lesser evil would be to let OpenCV detect its own features.  OpenCV&amp;#039;s threshold was adjusted so that it detected about the same number of features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stability Results ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bike.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_boat.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_graf.gif] || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_leuven.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_ubc.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_trees.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_wall.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bark.gif&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Runtime Speed =&lt;br /&gt;
How fast enough library can compute the description and detect features was also benchmarked.  Each test was performed several times with only the best time being shown.  Java libraries tended to exhibit more variability than native libraries, while all libraries showed a significant amount of variability from trial to trial.  &lt;br /&gt;
&lt;br /&gt;
Only image processing time essential to SURF was measured and not loading in images.  This would include converting an image to integral image format, but not converting the image to gray scale.  Assuming that it was possible to not include the gray scale conversion.  Elapsed time was measured in the actual application using System.currentTimeMillis() in Java and clock() in C++. &lt;br /&gt;
&lt;br /&gt;
Testing Procedure:&lt;br /&gt;
# Kill all extraneous processes. &lt;br /&gt;
# Load feature location and size from file.&lt;br /&gt;
# Compute descriptors (including orientation) for each feature while recording elapsed time.&lt;br /&gt;
# Compute elapsed time 10 times and output best result.&lt;br /&gt;
# Run the whole experiment 4 times for each library and record the best time.&lt;br /&gt;
&lt;br /&gt;
Test Computer:  &lt;br /&gt;
* Ubuntu 10.10 64bit&lt;br /&gt;
* Quadcore Q6600 2.4 GHz&lt;br /&gt;
* Memory 8194 GB&lt;br /&gt;
* g++ 4.4.5&lt;br /&gt;
* Java(TM) SE Runtime Environment (build 1.6.0_26-b03)&lt;br /&gt;
&lt;br /&gt;
Compiler and JRE Configuration&lt;br /&gt;
* All native libraries were compiled with -O3&lt;br /&gt;
* Java applications were run with no special flags&lt;br /&gt;
&lt;br /&gt;
Describe Specific Setup:&lt;br /&gt;
* input image was boat/img1&lt;br /&gt;
* Fast Hessian features from BoofCV&lt;br /&gt;
** 6415 Total&lt;br /&gt;
&lt;br /&gt;
Detect Specific Setup:&lt;br /&gt;
* Impossible to configure libraries to detect exact same features.&lt;br /&gt;
** Adjusted detection threshold to top out at around 2000 features&lt;br /&gt;
* Octaves: 4&lt;br /&gt;
* Scales: 4&lt;br /&gt;
* Base Size: 9&lt;br /&gt;
* Initial Pixel Skip: 1&lt;br /&gt;
&lt;br /&gt;
Results can be found at the top of the page. OpenCV was ommited from runtime results because it could not be configured the same way as the other libraries.  A special test was performed just for OpenCV and is discussed above.  It should also be noted that it is not known what pixel skip was used inside of OpenCV.&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Performance:SURF&amp;diff=311</id>
		<title>Performance:SURF</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Performance:SURF&amp;diff=311"/>
		<updated>2011-11-01T17:08:52Z</updated>

		<summary type="html">&lt;p&gt;Spam: /* Conclusions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Comparison of SURF implementations =&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/SURF SURF] descriptor is a state-of-the-art image region descriptor that is invariant with regard to scale, orientation, and illumination. By using an integral image, the descriptor can be computed efficiently across different scales.  In recent years it has emerged as one of the more popular and frequently-used feature descriptors, but it is not a trivial algorithm to implement, and several different implementations exist.  The following study compares several different libraries to determine relative stability and run-time performance.&lt;br /&gt;
&lt;br /&gt;
Tested Implementations:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Implementation &lt;br /&gt;
! Version&lt;br /&gt;
! Language &lt;br /&gt;
! Threaded&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
| BoofCV || 10/2011 || Java || || Fast but less accurate. See FactoryDescribeRegionPoint.surf() &lt;br /&gt;
|-&lt;br /&gt;
| BoofCV-M || 10/2011 || Java || || Accurate but slower. See FactoryDescribeRegionPoint.msurf() &lt;br /&gt;
|-&lt;br /&gt;
| OpenSURF || 27/05/2010 || C++ || || http://www.chrisevansdev.com/computer-vision-opensurf.html&lt;br /&gt;
|-&lt;br /&gt;
| Reference || 1.0.9 || C++ || || http://www.vision.ee.ethz.ch/~surf/&lt;br /&gt;
|-&lt;br /&gt;
| JOpenSURF || SVN r24 || Java || || http://code.google.com/p/jopensurf/&lt;br /&gt;
|-&lt;br /&gt;
| JavaSURF || SVN r4 || Java || || http://code.google.com/p/javasurf/&lt;br /&gt;
|-&lt;br /&gt;
| OpenCV || 2.3.1 SVN r6879 || C++ || Yes || http://opencv.willowgarage.com/wiki/&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Benchmark Source Code:&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/benchmark BoofCV benchmark]&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/misc External libraries]&lt;br /&gt;
&lt;br /&gt;
= Conclusions =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/overall_describe_speed.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/overall_detect_speed.gif&lt;br /&gt;
|-&lt;br /&gt;
! Lower is better. !! Lower is better.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| &amp;lt;center&amp;gt;http://www.boofcv.org/notwiki/images/benchmark_surf/overall_stability.gif &amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| Higher is better.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the sake of those with short attention spans, the summary results are posted first and a discussion of testing methodology follows.  The top two plots show feature detection and feature describe speed.  Feature detection is the detection of the location and scale of interest points  inside the image using each library&amp;#039;s implementation of the Fast Hessian detector.  A feature is described by estimating its orientation and computing the SURF-64 descriptor.  The bottommost plot shows a summary of the descriptors&amp;#039; relative stabilities across a standard set of test images.&lt;br /&gt;
&lt;br /&gt;
One reason for JavaSURF&amp;#039;s poor stability is that it only implements an upright version of SURF, so rotated images defeat the descriptor.  Not computing orientation helps JavaSURF on the description runtime benchmark, because it has fewer computations to perform.  JOpenSURF is a straightforward port of the OpenSURF library to Java and shows comparable stability with the expected hit on runtime performance.  JOpenSURF, OpenSURF and BoofCV-M all compute an enhanced version of the SURF descriptor, while the BoofCV descriptor is closer to the SURF paper with some improvements.  I suspect that the descriptor computed by the reference library is also an improvement over what was presented in the SURF paper, but the source code is closed, so this theory cannot be directly verified.&lt;br /&gt;
&lt;br /&gt;
OpenCV is a bit of an oddball library as far as SURF is concerned.  It did not provide an interface that would allow it to be tested in the same manner as the other libraries, and comments in the code indicated that parts of it are multi-threaded.  Every other library tested is single-threaded.  Because of these issues, OpenCV&amp;#039;s own interest points were used instead of the precomputed ones.  Speed-wise, a special test was done for OpenCV where features were detected and described at the same time, which took 1940 (ms) for 6485 features.  This was approximately 20% slower than OpenSURF&amp;#039;s combined detect and describe time.&lt;br /&gt;
&lt;br /&gt;
= Descriptor Stability =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Images from evaluation data set&amp;quot; heights=150 widths=200 &amp;gt;&lt;br /&gt;
Image:Performance-descriptor-Graffiti.jpg|Graffiti&lt;br /&gt;
Image:Performance-descriptor-Boat.jpg|Boat&lt;br /&gt;
Image:Performance-descriptor-Trees.jpg|Trees&lt;br /&gt;
Image:Performance-descriptor-Bricks.jpg|Bricks&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stability benchmark was performed using standardized test images from [http://www.robots.ox.ac.uk/~vgg/research/affine/], which have known transformations. Stability was measured based upon the number of correct associations between two images in the data set.  The testing procedure for each library is summarized below:&lt;br /&gt;
&lt;br /&gt;
# For each image, detect features (scale and location) using the fast Hessian detector in BoofCV.&lt;br /&gt;
#* Save results to a file and use the same file for all libraries. &lt;br /&gt;
# For each image, compute a feature description (including orientation) for all found features.&lt;br /&gt;
# In each image sequence, associate features in the first image to the Nth image, where N &amp;gt; 1.&lt;br /&gt;
#* Association is done by minimizing Euclidean error&lt;br /&gt;
#* Validation is done using reverse association. E.g. This association must be the optimal association going from frame 1 to N and N to 1.&lt;br /&gt;
# Compute the number of correct associations.&lt;br /&gt;
#* An association is correct if it is within 3 pixels of the true location.&lt;br /&gt;
&lt;br /&gt;
Since the transformation is known between images the true location could have been used.  However, in reality features will not lie at the exact point and a descriptor needs to be tolerant to this type of errors.  Thus this is a more accurate measure of the description&amp;#039;s strength.&lt;br /&gt;
&lt;br /&gt;
The relative stability metric shown in the conclusions section above is computed by first summing up the total percent of correctly associated features across the whole test data set.  Then the library with the best performance is found and the relative stability is computed by dividing each library&amp;#039;s score by the best performer&amp;#039;s score.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration:&amp;#039;&amp;#039;&amp;#039; All libraries were configured to describe oriented SURF-64 features as defined in the original SURF paper.  JavaSURF does not support orientation estimation.  OpenCV forces orientation to be estimated inside the feature detector.  Thus it was decided that the lesser evil for OpenCV was to let it detect its own features.  OpenCV&amp;#039;s threshold was adjusted so that it detected about the same number of features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stability Results ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bike.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_boat.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_graf.gif] || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_leuven.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_ubc.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_trees.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_wall.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bark.gif&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Runtime Speed =&lt;br /&gt;
How fast enough library can compute the description and detect features was also benchmarked.  Each test was performed several times with only the best time being shown.  Java libraries tended to exhibit more variability than native libraries, while all libraries showed a significant amount of variability from trial to trial.  &lt;br /&gt;
&lt;br /&gt;
Only image processing time essential to SURF was measured and not loading in images.  This would include converting an image to integral image format, but not converting the image to gray scale.  Assuming that it was possible to not include the gray scale conversion.  Elapsed time was measured in the actual application using System.currentTimeMillis() in Java and clock() in C++. &lt;br /&gt;
&lt;br /&gt;
Testing Procedure:&lt;br /&gt;
# Kill all extraneous processes. &lt;br /&gt;
# Load feature location and size from file.&lt;br /&gt;
# Compute descriptors (including orientation) for each feature while recording elapsed time.&lt;br /&gt;
# Compute elapsed time 10 times and output best result.&lt;br /&gt;
# Run the whole experiment 4 times for each library and record the best time.&lt;br /&gt;
&lt;br /&gt;
Test Computer:  &lt;br /&gt;
* Ubuntu 10.10 64bit&lt;br /&gt;
* Quadcore Q6600 2.4 GHz&lt;br /&gt;
* Memory 8194 GB&lt;br /&gt;
* g++ 4.4.5&lt;br /&gt;
* Java(TM) SE Runtime Environment (build 1.6.0_26-b03)&lt;br /&gt;
&lt;br /&gt;
Compiler and JRE Configuration&lt;br /&gt;
* All native libraries were compiled with -O3&lt;br /&gt;
* Java applications were run with no special flags&lt;br /&gt;
&lt;br /&gt;
Describe Specific Setup:&lt;br /&gt;
* input image was boat/img1&lt;br /&gt;
* Fast Hessian features from BoofCV&lt;br /&gt;
** 6415 Total&lt;br /&gt;
&lt;br /&gt;
Detect Specific Setup:&lt;br /&gt;
* Impossible to configure libraries to detect exact same features.&lt;br /&gt;
** Adjusted detection threshold to top out at around 2000 features&lt;br /&gt;
* Octaves: 4&lt;br /&gt;
* Scales: 4&lt;br /&gt;
* Base Size: 9&lt;br /&gt;
* Initial Pixel Skip: 1&lt;br /&gt;
&lt;br /&gt;
Results can be found at the top of the page. OpenCV was ommited from runtime results because it could not be configured the same way as the other libraries.  A special test was performed just for OpenCV and is discussed above.  It should also be noted that it is not known what pixel skip was used inside of OpenCV.&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Performance:SURF&amp;diff=309</id>
		<title>Performance:SURF</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Performance:SURF&amp;diff=309"/>
		<updated>2011-11-01T16:39:51Z</updated>

		<summary type="html">&lt;p&gt;Spam: /* Conclusions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Comparison of SURF implementations =&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/SURF SURF] descriptor is a state-of-the-art image region descriptor that is invariant with regard to scale, orientation, and illumination. By using an integral image, the descriptor can be computed efficiently across different scales.  In recent years it has emerged as one of the more popular and frequently-used feature descriptors, but it is not a trivial algorithm to implement, and several different implementations exist.  The following study compares several different libraries to determine relative stability and run-time performance.&lt;br /&gt;
&lt;br /&gt;
Tested Implementations:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Implementation &lt;br /&gt;
! Version&lt;br /&gt;
! Language &lt;br /&gt;
! Threaded&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
| BoofCV || 10/2011 || Java || || Fast but less accurate. See FactoryDescribeRegionPoint.surf() &lt;br /&gt;
|-&lt;br /&gt;
| BoofCV-M || 10/2011 || Java || || Accurate but slower. See FactoryDescribeRegionPoint.msurf() &lt;br /&gt;
|-&lt;br /&gt;
| OpenSURF || 27/05/2010 || C++ || || http://www.chrisevansdev.com/computer-vision-opensurf.html&lt;br /&gt;
|-&lt;br /&gt;
| Reference || 1.0.9 || C++ || || http://www.vision.ee.ethz.ch/~surf/&lt;br /&gt;
|-&lt;br /&gt;
| JOpenSURF || SVN r24 || Java || || http://code.google.com/p/jopensurf/&lt;br /&gt;
|-&lt;br /&gt;
| JavaSURF || SVN r4 || Java || || http://code.google.com/p/javasurf/&lt;br /&gt;
|-&lt;br /&gt;
| OpenCV || 2.3.1 SVN r6879 || C++ || Yes || http://opencv.willowgarage.com/wiki/&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Benchmark Source Code:&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/benchmark BoofCV benchmark]&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/misc External libraries]&lt;br /&gt;
&lt;br /&gt;
= Conclusions =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/overall_describe_speed.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/overall_detect_speed.gif&lt;br /&gt;
|-&lt;br /&gt;
! Lower is better. !! Lower is better.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| &amp;lt;center&amp;gt;http://www.boofcv.org/notwiki/images/benchmark_surf/overall_stability.gif &amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| Higher is better.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For the sake of those with short attention spans, the summary results are posted first and a discussion of testing methodology follows.  The top two plots show feature detection and feature describe speed.  Detection is when the location and scale of interest points are detected inside the image using each library&amp;#039;s implementation of the Fast Hessian detector.  A feature is described by estimating its orientation and computing the SURF-64 descriptor.  The bottommost plot shows a summary of the descriptors&amp;#039; relative stabilities across a standard set of test images.&lt;br /&gt;
&lt;br /&gt;
One reason for JavaSURF&amp;#039;s poor stability performance is that it only implements an upright version of SURF, so images with any rotation cause it to fail.  Not computing the orientation also helps JavaSURF on the description runtime benchmark because it has fewer computations to perform.  JOpenSURF is a straight forward port of the OpenSURF library to Java and shows comparable stability with the expected hit on runtime performance.  JOpenSURF, OpenSURF and BoofCV-M all compute an enhanced version of the SURF descriptor, while the BoofCV descriptor is closer to the SURF paper with some improvements.  I suspect that the descriptor computed by the reference library is also an improvement over what was presented in the SURF paper, but source code is closed so this theory cannot be directly verified.&lt;br /&gt;
&lt;br /&gt;
OpenCV is a bit of an odd ball library as far as SURF is concerned.  It did not provide an interface which allowed it to be tested in the same manor as the other libraries and comments in the code mention that parts of it are multi-threaded.  Every other library tested is single threaded.  Because of these issues, its own interest points were used instead of the precomputed ones.  Speed wise a special test was done for OpenCV where both features were detected and described at the same time, which took 1940 (ms) for 6485 features.  Making it about 20% slower than OpenSURF&amp;#039;s combined detect and describe time.&lt;br /&gt;
&lt;br /&gt;
= Descriptor Stability =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Images from evaluation data set&amp;quot; heights=150 widths=200 &amp;gt;&lt;br /&gt;
Image:Performance-descriptor-Graffiti.jpg|Graffiti&lt;br /&gt;
Image:Performance-descriptor-Boat.jpg|Boat&lt;br /&gt;
Image:Performance-descriptor-Trees.jpg|Trees&lt;br /&gt;
Image:Performance-descriptor-Bricks.jpg|Bricks&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stability benchmark was performed using standardized test images from [http://www.robots.ox.ac.uk/~vgg/research/affine/], which have known transformations. Stability was measured based upon the number of correct associations between two images in the data set.  The testing procedure for each library is summarized below:&lt;br /&gt;
&lt;br /&gt;
# For each image, detect features (scale and location) using the fast Hessian detector in BoofCV.&lt;br /&gt;
#* Save results to a file and use the same file for all libraries. &lt;br /&gt;
# For each image, compute a feature description (including orientation) for all found features.&lt;br /&gt;
# In each image sequence, associate features in the first image to the Nth image, where N &amp;gt; 1.&lt;br /&gt;
#* Association is done by minimizing Euclidean error&lt;br /&gt;
#* Validation is done using reverse association. E.g. This association must be the optimal association going from frame 1 to N and N to 1.&lt;br /&gt;
# Compute the number of correct associations.&lt;br /&gt;
#* An association is correct if it is within 3 pixels of the true location.&lt;br /&gt;
&lt;br /&gt;
Since the transformation is known between images the true location could have been used.  However, in reality features will not lie at the exact point and a descriptor needs to be tolerant to this type of errors.  Thus this is a more accurate measure of the description&amp;#039;s strength.&lt;br /&gt;
&lt;br /&gt;
The relative stability metric shown in the conclusions section above is computed by first summing up the total percent of correctly associated features across the whole test data set.  Then the library with the best performance is found and the relative stability is computed by dividing each library&amp;#039;s score by the best performer&amp;#039;s score.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration:&amp;#039;&amp;#039;&amp;#039; All libraries were configured to describe oriented SURF-64 features as defined in the original SURF paper.  JavaSURF does not support orientation estimation.  OpenCV forces orientation to be estimated inside the feature detector.  Thus it was decided that the lesser evil for OpenCV was to let it detect its own features.  OpenCV&amp;#039;s threshold was adjusted so that it detected about the same number of features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stability Results ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bike.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_boat.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_graf.gif] || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_leuven.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_ubc.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_trees.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_wall.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bark.gif&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Runtime Speed =&lt;br /&gt;
How fast enough library can compute the description and detect features was also benchmarked.  Each test was performed several times with only the best time being shown.  Java libraries tended to exhibit more variability than native libraries, while all libraries showed a significant amount of variability from trial to trial.  &lt;br /&gt;
&lt;br /&gt;
Only image processing time essential to SURF was measured and not loading in images.  This would include converting an image to integral image format, but not converting the image to gray scale.  Assuming that it was possible to not include the gray scale conversion.  Elapsed time was measured in the actual application using System.currentTimeMillis() in Java and clock() in C++. &lt;br /&gt;
&lt;br /&gt;
Testing Procedure:&lt;br /&gt;
# Kill all extraneous processes. &lt;br /&gt;
# Load feature location and size from file.&lt;br /&gt;
# Compute descriptors (including orientation) for each feature while recording elapsed time.&lt;br /&gt;
# Compute elapsed time 10 times and output best result.&lt;br /&gt;
# Run the whole experiment 4 times for each library and record the best time.&lt;br /&gt;
&lt;br /&gt;
Test Computer:  &lt;br /&gt;
* Ubuntu 10.10 64bit&lt;br /&gt;
* Quadcore Q6600 2.4 GHz&lt;br /&gt;
* Memory 8194 GB&lt;br /&gt;
* g++ 4.4.5&lt;br /&gt;
* Java(TM) SE Runtime Environment (build 1.6.0_26-b03)&lt;br /&gt;
&lt;br /&gt;
Compiler and JRE Configuration&lt;br /&gt;
* All native libraries were compiled with -O3&lt;br /&gt;
* Java applications were run with no special flags&lt;br /&gt;
&lt;br /&gt;
Describe Specific Setup:&lt;br /&gt;
* input image was boat/img1&lt;br /&gt;
* Fast Hessian features from BoofCV&lt;br /&gt;
** 6415 Total&lt;br /&gt;
&lt;br /&gt;
Detect Specific Setup:&lt;br /&gt;
* Impossible to configure libraries to detect exact same features.&lt;br /&gt;
** Adjusted detection threshold to top out at around 2000 features&lt;br /&gt;
* Octaves: 4&lt;br /&gt;
* Scales: 4&lt;br /&gt;
* Base Size: 9&lt;br /&gt;
* Initial Pixel Skip: 1&lt;br /&gt;
&lt;br /&gt;
Results can be found at the top of the page. OpenCV was ommited from runtime results because it could not be configured the same way as the other libraries.  A special test was performed just for OpenCV and is discussed above.  It should also be noted that it is not known what pixel skip was used inside of OpenCV.&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Performance:SURF&amp;diff=308</id>
		<title>Performance:SURF</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Performance:SURF&amp;diff=308"/>
		<updated>2011-11-01T16:26:33Z</updated>

		<summary type="html">&lt;p&gt;Spam: /* Comparison of SURF implementations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Comparison of SURF implementations =&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/SURF SURF] descriptor is a state-of-the-art image region descriptor that is invariant with regard to scale, orientation, and illumination. By using an integral image, the descriptor can be computed efficiently across different scales.  In recent years it has emerged as one of the more popular and frequently-used feature descriptors, but it is not a trivial algorithm to implement, and several different implementations exist.  The following study compares several different libraries to determine relative stability and run-time performance.&lt;br /&gt;
&lt;br /&gt;
Tested Implementations:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Implementation &lt;br /&gt;
! Version&lt;br /&gt;
! Language &lt;br /&gt;
! Threaded&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
| BoofCV || 10/2011 || Java || || Fast but less accurate. See FactoryDescribeRegionPoint.surf() &lt;br /&gt;
|-&lt;br /&gt;
| BoofCV-M || 10/2011 || Java || || Accurate but slower. See FactoryDescribeRegionPoint.msurf() &lt;br /&gt;
|-&lt;br /&gt;
| OpenSURF || 27/05/2010 || C++ || || http://www.chrisevansdev.com/computer-vision-opensurf.html&lt;br /&gt;
|-&lt;br /&gt;
| Reference || 1.0.9 || C++ || || http://www.vision.ee.ethz.ch/~surf/&lt;br /&gt;
|-&lt;br /&gt;
| JOpenSURF || SVN r24 || Java || || http://code.google.com/p/jopensurf/&lt;br /&gt;
|-&lt;br /&gt;
| JavaSURF || SVN r4 || Java || || http://code.google.com/p/javasurf/&lt;br /&gt;
|-&lt;br /&gt;
| OpenCV || 2.3.1 SVN r6879 || C++ || Yes || http://opencv.willowgarage.com/wiki/&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Benchmark Source Code:&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/benchmark BoofCV benchmark]&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/misc External libraries]&lt;br /&gt;
&lt;br /&gt;
= Conclusions =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/overall_describe_speed.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/overall_detect_speed.gif&lt;br /&gt;
|-&lt;br /&gt;
! Lower is better. !! Lower is better.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| &amp;lt;center&amp;gt;http://www.boofcv.org/notwiki/images/benchmark_surf/overall_stability.gif &amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| Higher is better.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For sake of those with no attention span, the summary results are posted first and a discussion of testing methodology follows below.  The top two plots show feature detection and feature describe speed.  Detection is when the location and scale of interest points are detected inside the image using each library&amp;#039;s implementation of the Fast Hessian detector.  A feature is described by estimating its orientation and computing the SURF-64 descriptor.  The bottom most plot shows a summary of the descriptors relative stability across a standard set of test images.&lt;br /&gt;
&lt;br /&gt;
One reason for JavaSURF&amp;#039;s poor stability performance is that is only implements an upright version of SURF, so images with any rotation cause it to fail.  Not computing the orientation also helps JavaSURF on the description runtime benchmark because it has fewer computations to perform.  JOpenSURF is a straight forward port of the OpenSURF library to Java and shows comparable stability with the expected hit on runtime performance.  JOpenSURF, OpenSURF and BoofCV-M all compute an enhanced version of the SURF descriptor, while the BoofCV descriptor is closer to the SURF paper with some improvements.  I suspect that the descriptor computed by the reference library is also an improvement over what was presented in the SURF paper, but source code is closed so this theory cannot be directly verified.&lt;br /&gt;
&lt;br /&gt;
OpenCV is a bit of an odd ball library as far as SURF is concerned.  It did not provide an interface which allowed it to be tested in the same manor as the other libraries and comments in the code mention that parts of it are multi-threaded.  Every other library tested is single threaded.  Because of these issues, its own interest points were used instead of the precomputed ones.  Speed wise a special test was done for OpenCV where both features were detected and described at the same time, which took 1940 (ms) for 6485 features.  Making it about 20% slower than OpenSURF&amp;#039;s combined detect and describe time.&lt;br /&gt;
&lt;br /&gt;
= Descriptor Stability =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Images from evaluation data set&amp;quot; heights=150 widths=200 &amp;gt;&lt;br /&gt;
Image:Performance-descriptor-Graffiti.jpg|Graffiti&lt;br /&gt;
Image:Performance-descriptor-Boat.jpg|Boat&lt;br /&gt;
Image:Performance-descriptor-Trees.jpg|Trees&lt;br /&gt;
Image:Performance-descriptor-Bricks.jpg|Bricks&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stability benchmark was performed using standardized test images from [http://www.robots.ox.ac.uk/~vgg/research/affine/], which have known transformations. Stability was measured based upon the number of correct associations between two images in the data set.  The testing procedure for each library is summarized below:&lt;br /&gt;
&lt;br /&gt;
# For each image, detect features (scale and location) using the fast Hessian detector in BoofCV.&lt;br /&gt;
#* Save results to a file and use the same file for all libraries. &lt;br /&gt;
# For each image, compute a feature description (including orientation) for all found features.&lt;br /&gt;
# In each image sequence, associate features in the first image to the Nth image, where N &amp;gt; 1.&lt;br /&gt;
#* Association is done by minimizing Euclidean error&lt;br /&gt;
#* Validation is done using reverse association. E.g. This association must be the optimal association going from frame 1 to N and N to 1.&lt;br /&gt;
# Compute the number of correct associations.&lt;br /&gt;
#* An association is correct if it is within 3 pixels of the true location.&lt;br /&gt;
&lt;br /&gt;
Since the transformation is known between images the true location could have been used.  However, in reality features will not lie at the exact point and a descriptor needs to be tolerant to this type of errors.  Thus this is a more accurate measure of the description&amp;#039;s strength.&lt;br /&gt;
&lt;br /&gt;
The relative stability metric shown in the conclusions section above is computed by first summing up the total percent of correctly associated features across the whole test data set.  Then the library with the best performance is found and the relative stability is computed by dividing each library&amp;#039;s score by the best performer&amp;#039;s score.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration:&amp;#039;&amp;#039;&amp;#039; All libraries were configured to describe oriented SURF-64 features as defined in the original SURF paper.  JavaSURF does not support orientation estimation.  OpenCV forces orientation to be estimated inside the feature detector.  Thus it was decided that the lesser evil for OpenCV was to let it detect its own features.  OpenCV&amp;#039;s threshold was adjusted so that it detected about the same number of features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stability Results ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bike.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_boat.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_graf.gif] || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_leuven.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_ubc.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_trees.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_wall.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bark.gif&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Runtime Speed =&lt;br /&gt;
How fast enough library can compute the description and detect features was also benchmarked.  Each test was performed several times with only the best time being shown.  Java libraries tended to exhibit more variability than native libraries, while all libraries showed a significant amount of variability from trial to trial.  &lt;br /&gt;
&lt;br /&gt;
Only image processing time essential to SURF was measured and not loading in images.  This would include converting an image to integral image format, but not converting the image to gray scale.  Assuming that it was possible to not include the gray scale conversion.  Elapsed time was measured in the actual application using System.currentTimeMillis() in Java and clock() in C++. &lt;br /&gt;
&lt;br /&gt;
Testing Procedure:&lt;br /&gt;
# Kill all extraneous processes. &lt;br /&gt;
# Load feature location and size from file.&lt;br /&gt;
# Compute descriptors (including orientation) for each feature while recording elapsed time.&lt;br /&gt;
# Compute elapsed time 10 times and output best result.&lt;br /&gt;
# Run the whole experiment 4 times for each library and record the best time.&lt;br /&gt;
&lt;br /&gt;
Test Computer:  &lt;br /&gt;
* Ubuntu 10.10 64bit&lt;br /&gt;
* Quadcore Q6600 2.4 GHz&lt;br /&gt;
* Memory 8194 GB&lt;br /&gt;
* g++ 4.4.5&lt;br /&gt;
* Java(TM) SE Runtime Environment (build 1.6.0_26-b03)&lt;br /&gt;
&lt;br /&gt;
Compiler and JRE Configuration&lt;br /&gt;
* All native libraries were compiled with -O3&lt;br /&gt;
* Java applications were run with no special flags&lt;br /&gt;
&lt;br /&gt;
Describe Specific Setup:&lt;br /&gt;
* input image was boat/img1&lt;br /&gt;
* Fast Hessian features from BoofCV&lt;br /&gt;
** 6415 Total&lt;br /&gt;
&lt;br /&gt;
Detect Specific Setup:&lt;br /&gt;
* Impossible to configure libraries to detect exact same features.&lt;br /&gt;
** Adjusted detection threshold to top out at around 2000 features&lt;br /&gt;
* Octaves: 4&lt;br /&gt;
* Scales: 4&lt;br /&gt;
* Base Size: 9&lt;br /&gt;
* Initial Pixel Skip: 1&lt;br /&gt;
&lt;br /&gt;
Results can be found at the top of the page. OpenCV was ommited from runtime results because it could not be configured the same way as the other libraries.  A special test was performed just for OpenCV and is discussed above.  It should also be noted that it is not known what pixel skip was used inside of OpenCV.&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Performance:SURF&amp;diff=307</id>
		<title>Performance:SURF</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Performance:SURF&amp;diff=307"/>
		<updated>2011-11-01T16:19:46Z</updated>

		<summary type="html">&lt;p&gt;Spam: /* Comparison of SURF implementations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Comparison of SURF implementations =&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/SURF SURF] descriptor is a state-of-the-art image region descriptor that is invariant with regard to scale, orientation, and illumination. By using an integral image, it can be computed efficiently across different scales.  In recent years it has emerged as one of the more popular and frequently-used feature descriptors, but it is not a trivial algorithm to implement, and several different implementations exist.  The following study compares several different libraries to determine relative stability and run-time performance.&lt;br /&gt;
&lt;br /&gt;
Tested Implementations:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Implementation &lt;br /&gt;
! Version&lt;br /&gt;
! Language &lt;br /&gt;
! Threaded&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
| BoofCV || 10/2011 || Java || || Fast but less accurate. See FactoryDescribeRegionPoint.surf() &lt;br /&gt;
|-&lt;br /&gt;
| BoofCV-M || 10/2011 || Java || || Accurate but slower. See FactoryDescribeRegionPoint.msurf() &lt;br /&gt;
|-&lt;br /&gt;
| OpenSURF || 27/05/2010 || C++ || || http://www.chrisevansdev.com/computer-vision-opensurf.html&lt;br /&gt;
|-&lt;br /&gt;
| Reference || 1.0.9 || C++ || || http://www.vision.ee.ethz.ch/~surf/&lt;br /&gt;
|-&lt;br /&gt;
| JOpenSURF || SVN r24 || Java || || http://code.google.com/p/jopensurf/&lt;br /&gt;
|-&lt;br /&gt;
| JavaSURF || SVN r4 || Java || || http://code.google.com/p/javasurf/&lt;br /&gt;
|-&lt;br /&gt;
| OpenCV || 2.3.1 SVN r6879 || C++ || Yes || http://opencv.willowgarage.com/wiki/&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Benchmark Source Code:&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/benchmark BoofCV benchmark]&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/misc External libraries]&lt;br /&gt;
&lt;br /&gt;
= Conclusions =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/overall_describe_speed.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/overall_detect_speed.gif&lt;br /&gt;
|-&lt;br /&gt;
! Lower is better. !! Lower is better.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| &amp;lt;center&amp;gt;http://www.boofcv.org/notwiki/images/benchmark_surf/overall_stability.gif &amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| Higher is better.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For sake of those with no attention span, the summary results are posted first and a discussion of testing methodology follows below.  The top two plots show feature detection and feature describe speed.  Detection is when the location and scale of interest points are detected inside the image using each library&amp;#039;s implementation of the Fast Hessian detector.  A feature is described by estimating its orientation and computing the SURF-64 descriptor.  The bottom most plot shows a summary of the descriptors relative stability across a standard set of test images.&lt;br /&gt;
&lt;br /&gt;
One reason for JavaSURF&amp;#039;s poor stability performance is that is only implements an upright version of SURF, so images with any rotation cause it to fail.  Not computing the orientation also helps JavaSURF on the description runtime benchmark because it has fewer computations to perform.  JOpenSURF is a straight forward port of the OpenSURF library to Java and shows comparable stability with the expected hit on runtime performance.  JOpenSURF, OpenSURF and BoofCV-M all compute an enhanced version of the SURF descriptor, while the BoofCV descriptor is closer to the SURF paper with some improvements.  I suspect that the descriptor computed by the reference library is also an improvement over what was presented in the SURF paper, but source code is closed so this theory cannot be directly verified.&lt;br /&gt;
&lt;br /&gt;
OpenCV is a bit of an odd ball library as far as SURF is concerned.  It did not provide an interface which allowed it to be tested in the same manor as the other libraries and comments in the code mention that parts of it are multi-threaded.  Every other library tested is single threaded.  Because of these issues, its own interest points were used instead of the precomputed ones.  Speed wise a special test was done for OpenCV where both features were detected and described at the same time, which took 1940 (ms) for 6485 features.  Making it about 20% slower than OpenSURF&amp;#039;s combined detect and describe time.&lt;br /&gt;
&lt;br /&gt;
= Descriptor Stability =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Images from evaluation data set&amp;quot; heights=150 widths=200 &amp;gt;&lt;br /&gt;
Image:Performance-descriptor-Graffiti.jpg|Graffiti&lt;br /&gt;
Image:Performance-descriptor-Boat.jpg|Boat&lt;br /&gt;
Image:Performance-descriptor-Trees.jpg|Trees&lt;br /&gt;
Image:Performance-descriptor-Bricks.jpg|Bricks&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stability benchmark was performed using standardized test images from [http://www.robots.ox.ac.uk/~vgg/research/affine/], which have known transformations. Stability was measured based upon the number of correct associations between two images in the data set.  The testing procedure for each library is summarized below:&lt;br /&gt;
&lt;br /&gt;
# For each image, detect features (scale and location) using the fast Hessian detector in BoofCV.&lt;br /&gt;
#* Save results to a file and use the same file for all libraries. &lt;br /&gt;
# For each image, compute a feature description (including orientation) for all found features.&lt;br /&gt;
# In each image sequence, associate features in the first image to the Nth image, where N &amp;gt; 1.&lt;br /&gt;
#* Association is done by minimizing Euclidean error&lt;br /&gt;
#* Validation is done using reverse association. E.g. This association must be the optimal association going from frame 1 to N and N to 1.&lt;br /&gt;
# Compute the number of correct associations.&lt;br /&gt;
#* An association is correct if it is within 3 pixels of the true location.&lt;br /&gt;
&lt;br /&gt;
Since the transformation is known between images the true location could have been used.  However, in reality features will not lie at the exact point and a descriptor needs to be tolerant to this type of errors.  Thus this is a more accurate measure of the description&amp;#039;s strength.&lt;br /&gt;
&lt;br /&gt;
The relative stability metric shown in the conclusions section above is computed by first summing up the total percent of correctly associated features across the whole test data set.  Then the library with the best performance is found and the relative stability is computed by dividing each library&amp;#039;s score by the best performer&amp;#039;s score.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration:&amp;#039;&amp;#039;&amp;#039; All libraries were configured to describe oriented SURF-64 features as defined in the original SURF paper.  JavaSURF does not support orientation estimation.  OpenCV forces orientation to be estimated inside the feature detector.  Thus it was decided that the lesser evil for OpenCV was to let it detect its own features.  OpenCV&amp;#039;s threshold was adjusted so that it detected about the same number of features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stability Results ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bike.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_boat.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_graf.gif] || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_leuven.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_ubc.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_trees.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_wall.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bark.gif&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Runtime Speed =&lt;br /&gt;
How fast enough library can compute the description and detect features was also benchmarked.  Each test was performed several times with only the best time being shown.  Java libraries tended to exhibit more variability than native libraries, while all libraries showed a significant amount of variability from trial to trial.  &lt;br /&gt;
&lt;br /&gt;
Only image processing time essential to SURF was measured and not loading in images.  This would include converting an image to integral image format, but not converting the image to gray scale.  Assuming that it was possible to not include the gray scale conversion.  Elapsed time was measured in the actual application using System.currentTimeMillis() in Java and clock() in C++. &lt;br /&gt;
&lt;br /&gt;
Testing Procedure:&lt;br /&gt;
# Kill all extraneous processes. &lt;br /&gt;
# Load feature location and size from file.&lt;br /&gt;
# Compute descriptors (including orientation) for each feature while recording elapsed time.&lt;br /&gt;
# Compute elapsed time 10 times and output best result.&lt;br /&gt;
# Run the whole experiment 4 times for each library and record the best time.&lt;br /&gt;
&lt;br /&gt;
Test Computer:  &lt;br /&gt;
* Ubuntu 10.10 64bit&lt;br /&gt;
* Quadcore Q6600 2.4 GHz&lt;br /&gt;
* Memory 8194 GB&lt;br /&gt;
* g++ 4.4.5&lt;br /&gt;
* Java(TM) SE Runtime Environment (build 1.6.0_26-b03)&lt;br /&gt;
&lt;br /&gt;
Compiler and JRE Configuration&lt;br /&gt;
* All native libraries were compiled with -O3&lt;br /&gt;
* Java applications were run with no special flags&lt;br /&gt;
&lt;br /&gt;
Describe Specific Setup:&lt;br /&gt;
* input image was boat/img1&lt;br /&gt;
* Fast Hessian features from BoofCV&lt;br /&gt;
** 6415 Total&lt;br /&gt;
&lt;br /&gt;
Detect Specific Setup:&lt;br /&gt;
* Impossible to configure libraries to detect exact same features.&lt;br /&gt;
** Adjusted detection threshold to top out at around 2000 features&lt;br /&gt;
* Octaves: 4&lt;br /&gt;
* Scales: 4&lt;br /&gt;
* Base Size: 9&lt;br /&gt;
* Initial Pixel Skip: 1&lt;br /&gt;
&lt;br /&gt;
Results can be found at the top of the page. OpenCV was ommited from runtime results because it could not be configured the same way as the other libraries.  A special test was performed just for OpenCV and is discussed above.  It should also be noted that it is not known what pixel skip was used inside of OpenCV.&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Performance:SURF&amp;diff=306</id>
		<title>Performance:SURF</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Performance:SURF&amp;diff=306"/>
		<updated>2011-11-01T16:15:16Z</updated>

		<summary type="html">&lt;p&gt;Spam: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Comparison of SURF implementations =&lt;br /&gt;
&lt;br /&gt;
The [http://en.wikipedia.org/wiki/SURF SURF] descriptor is a state-of-the-art image region descriptor that is scale-, orientation-, and illumination-invariant. By using an integral image, it can be computed efficiently across different scales.  In recent years it has emerged as one of the more popular and frequently-used feature descriptors, but it is not a trivial algorithm to implement, and several different implementations exist.  The following study compares several different libraries to determine relative stability and run-time performance.&lt;br /&gt;
&lt;br /&gt;
Tested Implementations:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Implementation &lt;br /&gt;
! Version&lt;br /&gt;
! Language &lt;br /&gt;
! Threaded&lt;br /&gt;
! Comment&lt;br /&gt;
|-&lt;br /&gt;
| BoofCV || 10/2011 || Java || || Fast but less accurate. See FactoryDescribeRegionPoint.surf() &lt;br /&gt;
|-&lt;br /&gt;
| BoofCV-M || 10/2011 || Java || || Accurate but slower. See FactoryDescribeRegionPoint.msurf() &lt;br /&gt;
|-&lt;br /&gt;
| OpenSURF || 27/05/2010 || C++ || || http://www.chrisevansdev.com/computer-vision-opensurf.html&lt;br /&gt;
|-&lt;br /&gt;
| Reference || 1.0.9 || C++ || || http://www.vision.ee.ethz.ch/~surf/&lt;br /&gt;
|-&lt;br /&gt;
| JOpenSURF || SVN r24 || Java || || http://code.google.com/p/jopensurf/&lt;br /&gt;
|-&lt;br /&gt;
| JavaSURF || SVN r4 || Java || || http://code.google.com/p/javasurf/&lt;br /&gt;
|-&lt;br /&gt;
| OpenCV || 2.3.1 SVN r6879 || C++ || Yes || http://opencv.willowgarage.com/wiki/&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Benchmark Source Code:&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/benchmark BoofCV benchmark]&lt;br /&gt;
* [https://github.com/lessthanoptimal/BoofCV/tree/master/evaluation/misc External libraries]&lt;br /&gt;
&lt;br /&gt;
= Conclusions =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/overall_describe_speed.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/overall_detect_speed.gif&lt;br /&gt;
|-&lt;br /&gt;
! Lower is better. !! Lower is better.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| &amp;lt;center&amp;gt;http://www.boofcv.org/notwiki/images/benchmark_surf/overall_stability.gif &amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| Higher is better.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For sake of those with no attention span, the summary results are posted first and a discussion of testing methodology follows below.  The top two plots show feature detection and feature describe speed.  Detection is when the location and scale of interest points are detected inside the image using each library&amp;#039;s implementation of the Fast Hessian detector.  A feature is described by estimating its orientation and computing the SURF-64 descriptor.  The bottom most plot shows a summary of the descriptors relative stability across a standard set of test images.&lt;br /&gt;
&lt;br /&gt;
One reason for JavaSURF&amp;#039;s poor stability performance is that is only implements an upright version of SURF, so images with any rotation cause it to fail.  Not computing the orientation also helps JavaSURF on the description runtime benchmark because it has fewer computations to perform.  JOpenSURF is a straight forward port of the OpenSURF library to Java and shows comparable stability with the expected hit on runtime performance.  JOpenSURF, OpenSURF and BoofCV-M all compute an enhanced version of the SURF descriptor, while the BoofCV descriptor is closer to the SURF paper with some improvements.  I suspect that the descriptor computed by the reference library is also an improvement over what was presented in the SURF paper, but source code is closed so this theory cannot be directly verified.&lt;br /&gt;
&lt;br /&gt;
OpenCV is a bit of an odd ball library as far as SURF is concerned.  It did not provide an interface which allowed it to be tested in the same manor as the other libraries and comments in the code mention that parts of it are multi-threaded.  Every other library tested is single threaded.  Because of these issues, its own interest points were used instead of the precomputed ones.  Speed wise a special test was done for OpenCV where both features were detected and described at the same time, which took 1940 (ms) for 6485 features.  Making it about 20% slower than OpenSURF&amp;#039;s combined detect and describe time.&lt;br /&gt;
&lt;br /&gt;
= Descriptor Stability =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;gallery caption=&amp;quot;Images from evaluation data set&amp;quot; heights=150 widths=200 &amp;gt;&lt;br /&gt;
Image:Performance-descriptor-Graffiti.jpg|Graffiti&lt;br /&gt;
Image:Performance-descriptor-Boat.jpg|Boat&lt;br /&gt;
Image:Performance-descriptor-Trees.jpg|Trees&lt;br /&gt;
Image:Performance-descriptor-Bricks.jpg|Bricks&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stability benchmark was performed using standardized test images from [http://www.robots.ox.ac.uk/~vgg/research/affine/], which have known transformations. Stability was measured based upon the number of correct associations between two images in the data set.  The testing procedure for each library is summarized below:&lt;br /&gt;
&lt;br /&gt;
# For each image, detect features (scale and location) using the fast Hessian detector in BoofCV.&lt;br /&gt;
#* Save results to a file and use the same file for all libraries. &lt;br /&gt;
# For each image, compute a feature description (including orientation) for all found features.&lt;br /&gt;
# In each image sequence, associate features in the first image to the Nth image, where N &amp;gt; 1.&lt;br /&gt;
#* Association is done by minimizing Euclidean error&lt;br /&gt;
#* Validation is done using reverse association. E.g. This association must be the optimal association going from frame 1 to N and N to 1.&lt;br /&gt;
# Compute the number of correct associations.&lt;br /&gt;
#* An association is correct if it is within 3 pixels of the true location.&lt;br /&gt;
&lt;br /&gt;
Since the transformation is known between images the true location could have been used.  However, in reality features will not lie at the exact point and a descriptor needs to be tolerant to this type of errors.  Thus this is a more accurate measure of the description&amp;#039;s strength.&lt;br /&gt;
&lt;br /&gt;
The relative stability metric shown in the conclusions section above is computed by first summing up the total percent of correctly associated features across the whole test data set.  Then the library with the best performance is found and the relative stability is computed by dividing each library&amp;#039;s score by the best performer&amp;#039;s score.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration:&amp;#039;&amp;#039;&amp;#039; All libraries were configured to describe oriented SURF-64 features as defined in the original SURF paper.  JavaSURF does not support orientation estimation.  OpenCV forces orientation to be estimated inside the feature detector.  Thus it was decided that the lesser evil for OpenCV was to let it detect its own features.  OpenCV&amp;#039;s threshold was adjusted so that it detected about the same number of features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stability Results ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bike.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_boat.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_graf.gif] || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_leuven.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_ubc.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_trees.gif&lt;br /&gt;
|-&lt;br /&gt;
| http://www.boofcv.org/notwiki/images/benchmark_surf/stability_wall.gif || http://www.boofcv.org/notwiki/images/benchmark_surf/stability_bark.gif&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Runtime Speed =&lt;br /&gt;
How fast enough library can compute the description and detect features was also benchmarked.  Each test was performed several times with only the best time being shown.  Java libraries tended to exhibit more variability than native libraries, while all libraries showed a significant amount of variability from trial to trial.  &lt;br /&gt;
&lt;br /&gt;
Only image processing time essential to SURF was measured and not loading in images.  This would include converting an image to integral image format, but not converting the image to gray scale.  Assuming that it was possible to not include the gray scale conversion.  Elapsed time was measured in the actual application using System.currentTimeMillis() in Java and clock() in C++. &lt;br /&gt;
&lt;br /&gt;
Testing Procedure:&lt;br /&gt;
# Kill all extraneous processes. &lt;br /&gt;
# Load feature location and size from file.&lt;br /&gt;
# Compute descriptors (including orientation) for each feature while recording elapsed time.&lt;br /&gt;
# Compute elapsed time 10 times and output best result.&lt;br /&gt;
# Run the whole experiment 4 times for each library and record the best time.&lt;br /&gt;
&lt;br /&gt;
Test Computer:  &lt;br /&gt;
* Ubuntu 10.10 64bit&lt;br /&gt;
* Quadcore Q6600 2.4 GHz&lt;br /&gt;
* Memory 8194 GB&lt;br /&gt;
* g++ 4.4.5&lt;br /&gt;
* Java(TM) SE Runtime Environment (build 1.6.0_26-b03)&lt;br /&gt;
&lt;br /&gt;
Compiler and JRE Configuration&lt;br /&gt;
* All native libraries were compiled with -O3&lt;br /&gt;
* Java applications were run with no special flags&lt;br /&gt;
&lt;br /&gt;
Describe Specific Setup:&lt;br /&gt;
* input image was boat/img1&lt;br /&gt;
* Fast Hessian features from BoofCV&lt;br /&gt;
** 6415 Total&lt;br /&gt;
&lt;br /&gt;
Detect Specific Setup:&lt;br /&gt;
* Impossible to configure libraries to detect exact same features.&lt;br /&gt;
** Adjusted detection threshold to top out at around 2000 features&lt;br /&gt;
* Octaves: 4&lt;br /&gt;
* Scales: 4&lt;br /&gt;
* Base Size: 9&lt;br /&gt;
* Initial Pixel Skip: 1&lt;br /&gt;
&lt;br /&gt;
Results can be found at the top of the page. OpenCV was ommited from runtime results because it could not be configured the same way as the other libraries.  A special test was performed just for OpenCV and is discussed above.  It should also be noted that it is not known what pixel skip was used inside of OpenCV.&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Manual&amp;diff=133</id>
		<title>Manual</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Manual&amp;diff=133"/>
		<updated>2011-10-06T02:56:04Z</updated>

		<summary type="html">&lt;p&gt;Spam: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development with BoofCV =&lt;br /&gt;
&lt;br /&gt;
The following manual provides an introduction to development with BoofCV.  It is assumed that the reader is familiar with development in the Java programming language and the basics of computer vision. This manual primarily takes the form of tutorials.  However, before going through the tutorials one should be familiar with coding standards use in BoofCV.  Once these are understood one will be able to efficiently search the library or even guess the names of classes which are needed. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Click here for [[Coding Standards]].&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
= List of Tutorial =&lt;br /&gt;
&lt;br /&gt;
A few simple tutorials are provided to provide the basic concepts of development with BoofCV.  For more advanced usage example fully functional demos and applets are provided.&lt;br /&gt;
&lt;br /&gt;
* Abstracted interface versus algorithm.&lt;br /&gt;
* Gaussian blur and other convolutions.&lt;br /&gt;
* Detecting image features.&lt;br /&gt;
* Binary images.&lt;br /&gt;
&lt;br /&gt;
Other resources:&lt;br /&gt;
&lt;br /&gt;
* [[List of Applets]]&lt;br /&gt;
* [[List of Application Demos]]&lt;br /&gt;
&lt;br /&gt;
= Building BoofCV =&lt;br /&gt;
&lt;br /&gt;
The easiest way to build the library from source is using the provided ant scripts.&lt;br /&gt;
&lt;br /&gt;
# Download source code.&lt;br /&gt;
# Run the ant script inside the boofcv/main directory.&lt;br /&gt;
# Copy the BoofCV.jar from boofcv/lib.&lt;br /&gt;
&lt;br /&gt;
In Linux this looks something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd boofcv/main/&lt;br /&gt;
$ ant&lt;br /&gt;
---- lots of text -----&lt;br /&gt;
    [javac] Note: Some input files use unchecked or unsafe operations.&lt;br /&gt;
    [javac] Note: Recompile with -Xlint:unchecked for details.&lt;br /&gt;
    [javac] 15 warnings&lt;br /&gt;
&lt;br /&gt;
jar:&lt;br /&gt;
      [jar] Building jar: /home/pja/projects/boofcv/main/jar/BoofCV_IO.jar&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
      [jar] Building jar: /home/pja/projects/boofcv/lib/BoofCV.jar&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
&lt;br /&gt;
BUILD SUCCESSFUL&lt;br /&gt;
Total time: 7 seconds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Coding_Standards&amp;diff=132</id>
		<title>Coding Standards</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Coding_Standards&amp;diff=132"/>
		<updated>2011-10-06T02:45:22Z</updated>

		<summary type="html">&lt;p&gt;Spam: Created page with &amp;quot;== Coding Standards ==  One of the primary reasons Java was selected as a programming language for this library are the set of development tools available for Java.  Less restric...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Coding Standards ==&lt;br /&gt;
&lt;br /&gt;
One of the primary reasons Java was selected as a programming language for this library are the set of development tools available for Java.  Less restrictive and structured languages such as C/C++ essentially allow the developer to redefine much of the language on the fly.  While at first this sounds like a positive characteristic, it has hindered the ability to create development tools which allow [http://en.wikipedia.org/wiki/Code_refactoring refactoring] and other modern techniques.  BoofCV&amp;#039;s API has been designed to take full advantage of integrated development environments (IDE) such as [http://www.jetbrains.com/idea/ IntelliJ] and [http://www.eclipse.org/ Eclipse].&lt;br /&gt;
&lt;br /&gt;
Unfortunately Java does not provide templates.  For example, if two classes are identical in every respect except that they use different primitive data structures internally in Java you need to create to classes.  In languages such as C++ you can create one template class.  The later is easier to maintain and requires less code.  To get around this issue auto code generation is extensively used throughout the library.&lt;br /&gt;
&lt;br /&gt;
A common pitfall which developers fall into is over abstraction.  This leads to code which is difficult to use or develop because of its complexity and layers of abstraction.  Computer vision has many complex algorithms and competing ideologies on how to catalog these algorithms together.  To mitigate this issue the code in BoofCV has been divided into algorithms and abstractions.  Code inside of algorithms has minimal abstraction and is implemented in whichever way makes the most sense to that particular algorithm.  Abstraction containers generalized interfaced and wrappers around the algorithms so that they fit that particular formalism.  This also greatly reduces unnecessary dependencies between the code allowing pieces of BoofCV to be cut off and used independently.&lt;br /&gt;
&lt;br /&gt;
PROCEDURAL VS OOP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Packages&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each project module (e.g. image processing) has a standardized package structure.  &lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 640px;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Java Package &lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| boofcv.abst&lt;br /&gt;
| Contains abstracted interfaces or wrappers for algorithms in the same family or to enforce different formalisms.  Sometimes to conform to these algorithms performance or unique capabilities are lost but added flexibility is gained by making it easier to switch algorithms.&lt;br /&gt;
|-&lt;br /&gt;
| boofcv.alg&lt;br /&gt;
| Bare algorithms which minimal abstraction.  Using algorithms directly allows for greater performance and or for a developer to wrap inside their own interface/frame work.&lt;br /&gt;
|-&lt;br /&gt;
| boofcv.factory&lt;br /&gt;
| Contains factories for creating raw algorithms or abstracted implementations of algorithms easily.  Using a factory makes it easier to get started but the simplicity comes at the cost of flexibility.  Flexibility is lost because factories hard code some parameters.  &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;h3&amp;gt;Directory Structure&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each project module also has a standardized directory structure.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 640px;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Directory &lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| src/&lt;br /&gt;
| Contains library source code.&lt;br /&gt;
|-&lt;br /&gt;
| test/&lt;br /&gt;
| Contains unit tests for source code.&lt;br /&gt;
|-&lt;br /&gt;
| generate/&lt;br /&gt;
| Source code for auto-generating source code in &amp;quot;src/&amp;quot;.  The package of the generator corresponds to the package the output should be placed inside.&lt;br /&gt;
|-&lt;br /&gt;
| benchmark/&lt;br /&gt;
| Contains simple codes for testing runtime performance of different algorithms.  Used during development to ensure efficiency.&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Class Name Standards&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following standard prefixes and suffices are used throughout the code base.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 640px;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! name &lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Impl* || Is a low level (often auto-generated image type specific) implementation of an algorithm.  Directly accessing these class is rarely required and discouraged. &lt;br /&gt;
|-&lt;br /&gt;
| Wrap* || Wrapper around an algorithm for a specific interface.  These classes are found inside the boofcv.abst package and its children.&lt;br /&gt;
|-&lt;br /&gt;
| Factory* || Factory for creating abstracted algorithms. &lt;br /&gt;
|-&lt;br /&gt;
| Factory*Alg || Factory for creating a raw algorithms.&lt;br /&gt;
|-&lt;br /&gt;
| *_F32, *_F64 || Implementation for 32-bit/64-bit floating point images or data structures, respectively.&lt;br /&gt;
|-&lt;br /&gt;
| *_S32 || Implementation for signed 32-bit integer images or data structures.&lt;br /&gt;
|-&lt;br /&gt;
| *_U16, *_S16 || Implementation for unsigned/signed 16-bit integer images or data structures, respectively.&lt;br /&gt;
|-&lt;br /&gt;
| *_U8, *_S8 || Implementation for unsigned/signed 8-bit integer images or data structures, respectively.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Manual&amp;diff=131</id>
		<title>Manual</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Manual&amp;diff=131"/>
		<updated>2011-10-06T02:44:21Z</updated>

		<summary type="html">&lt;p&gt;Spam: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development with BoofCV =&lt;br /&gt;
&lt;br /&gt;
The following manual provides an introduction to development with BoofCV.  It is assumed that the reader is familiar with development in the Java programming language and the basics of computer vision. This manual primarily takes the form of tutorials.  However, before going through the tutorials one should be familiar with coding standards use in BoofCV.  Once these are understood one will be able to efficiently search the library or even guess the names of classes which are needed. &lt;br /&gt;
&lt;br /&gt;
== Coding Standards ==&lt;br /&gt;
&lt;br /&gt;
One of the primary reasons Java was selected as a programming language for this library are the set of development tools available for Java.  Less restrictive and structured languages such as C/C++ essentially allow the developer to redefine much of the language on the fly.  While at first this sounds like a positive characteristic, it has hindered the ability to create development tools which allow [http://en.wikipedia.org/wiki/Code_refactoring refactoring] and other modern techniques.  BoofCV&amp;#039;s API has been designed to take full advantage of integrated development environments (IDE) such as [http://www.jetbrains.com/idea/ IntelliJ] and [http://www.eclipse.org/ Eclipse].&lt;br /&gt;
&lt;br /&gt;
Unfortunately Java does not provide templates.  For example, if two classes are identical in every respect except that they use different primitive data structures internally in Java you need to create to classes.  In languages such as C++ you can create one template class.  The later is easier to maintain and requires less code.  To get around this issue auto code generation is extensively used throughout the library.&lt;br /&gt;
&lt;br /&gt;
A common pitfall which developers fall into is over abstraction.  This leads to code which is difficult to use or develop because of its complexity and layers of abstraction.  Computer vision has many complex algorithms and competing ideologies on how to catalog these algorithms together.  To mitigate this issue the code in BoofCV has been divided into algorithms and abstractions.  Code inside of algorithms has minimal abstraction and is implemented in whichever way makes the most sense to that particular algorithm.  Abstraction containers generalized interfaced and wrappers around the algorithms so that they fit that particular formalism.  This also greatly reduces unnecessary dependencies between the code allowing pieces of BoofCV to be cut off and used independently.&lt;br /&gt;
&lt;br /&gt;
PROCEDURAL VS OOP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Packages&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each project module (e.g. image processing) has a standardized package structure.  &lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 640px;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Java Package &lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| boofcv.abst&lt;br /&gt;
| Contains abstracted interfaces or wrappers for algorithms in the same family or to enforce different formalisms.  Sometimes to conform to these algorithms performance or unique capabilities are lost but added flexibility is gained by making it easier to switch algorithms.&lt;br /&gt;
|-&lt;br /&gt;
| boofcv.alg&lt;br /&gt;
| Bare algorithms which minimal abstraction.  Using algorithms directly allows for greater performance and or for a developer to wrap inside their own interface/frame work.&lt;br /&gt;
|-&lt;br /&gt;
| boofcv.factory&lt;br /&gt;
| Contains factories for creating raw algorithms or abstracted implementations of algorithms easily.  Using a factory makes it easier to get started but the simplicity comes at the cost of flexibility.  Flexibility is lost because factories hard code some parameters.  &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;h3&amp;gt;Directory Structure&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each project module also has a standardized directory structure.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 640px;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Directory &lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| src/&lt;br /&gt;
| Contains library source code.&lt;br /&gt;
|-&lt;br /&gt;
| test/&lt;br /&gt;
| Contains unit tests for source code.&lt;br /&gt;
|-&lt;br /&gt;
| generate/&lt;br /&gt;
| Source code for auto-generating source code in &amp;quot;src/&amp;quot;.  The package of the generator corresponds to the package the output should be placed inside.&lt;br /&gt;
|-&lt;br /&gt;
| benchmark/&lt;br /&gt;
| Contains simple codes for testing runtime performance of different algorithms.  Used during development to ensure efficiency.&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Class Name Standards&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following standard prefixes and suffices are used throughout the code base.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 640px;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! name &lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Impl* || Is a low level (often auto-generated image type specific) implementation of an algorithm.  Directly accessing these class is rarely required and discouraged. &lt;br /&gt;
|-&lt;br /&gt;
| Wrap* || Wrapper around an algorithm for a specific interface.  These classes are found inside the boofcv.abst package and its children.&lt;br /&gt;
|-&lt;br /&gt;
| Factory* || Factory for creating abstracted algorithms. &lt;br /&gt;
|-&lt;br /&gt;
| Factory*Alg || Factory for creating a raw algorithms.&lt;br /&gt;
|-&lt;br /&gt;
| *_F32, *_F64 || Implementation for 32-bit/64-bit floating point images or data structures, respectively.&lt;br /&gt;
|-&lt;br /&gt;
| *_S32 || Implementation for signed 32-bit integer images or data structures.&lt;br /&gt;
|-&lt;br /&gt;
| *_U16, *_S16 || Implementation for unsigned/signed 16-bit integer images or data structures, respectively.&lt;br /&gt;
|-&lt;br /&gt;
| *_U8, *_S8 || Implementation for unsigned/signed 8-bit integer images or data structures, respectively.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= List of Tutorial =&lt;br /&gt;
&lt;br /&gt;
= Building BoofCV =&lt;br /&gt;
&lt;br /&gt;
The easiest way to build the library from source is using the provided ant scripts.&lt;br /&gt;
&lt;br /&gt;
# Download source code.&lt;br /&gt;
# Run the ant script inside the boofcv/main directory.&lt;br /&gt;
# Copy the BoofCV.jar from boofcv/lib.&lt;br /&gt;
&lt;br /&gt;
In Linux this looks something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd boofcv/main/&lt;br /&gt;
$ ant&lt;br /&gt;
---- lots of text -----&lt;br /&gt;
    [javac] Note: Some input files use unchecked or unsafe operations.&lt;br /&gt;
    [javac] Note: Recompile with -Xlint:unchecked for details.&lt;br /&gt;
    [javac] 15 warnings&lt;br /&gt;
&lt;br /&gt;
jar:&lt;br /&gt;
      [jar] Building jar: /home/pja/projects/boofcv/main/jar/BoofCV_IO.jar&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
      [jar] Building jar: /home/pja/projects/boofcv/lib/BoofCV.jar&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
&lt;br /&gt;
BUILD SUCCESSFUL&lt;br /&gt;
Total time: 7 seconds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Main_Page&amp;diff=87</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Main_Page&amp;diff=87"/>
		<updated>2011-09-23T21:48:07Z</updated>

		<summary type="html">&lt;p&gt;Spam: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:600pt;&amp;quot;&lt;br /&gt;
| style=&amp;quot;background-color:#ffffdd;&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
= BoofCV = &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A Computer Vision Library with Style&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
BoofCV is a Java library for real-time computer vision and robotics applications.  Written from scratch for ease of use and high performance, it provides both basic and advanced features needed for creating a modern computer vision system.  Functionality include highly optimized low level image processing routines (e.g. convolution, interpolation, gradient) to high level functionality such as image stabilization.&lt;br /&gt;
&lt;br /&gt;
It is divided up into four package, 1) image processing, 2) features, 3) geometric vision, and 4) input output.  Image processing contains core functionality which are most commonly used and typically operate directly on pixels.  Features contains feature (e.g. points, lines, and regions) extraction algorithms for use in higher level operations.  Geometric vision contains routines for processing extracted image features using 2D and 3D geometry. IO stands for input/output and contains common routines for reading in and displaying compute images.&lt;br /&gt;
&lt;br /&gt;
BoofCV is still in an early development phase, but is still highly capable.  To demonstrate this capability several example applets have been provided which can be run in your own browser, provided you have&lt;br /&gt;
version 1.6 or later of Java installed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:600pt;&amp;quot;&lt;br /&gt;
| colspan=2 style=&amp;quot;background-color:#ffffdd;&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
== Table of Contents ==&lt;br /&gt;
|-&lt;br /&gt;
| Introduction &lt;br /&gt;
| asdfaf &lt;br /&gt;
|-&lt;br /&gt;
| Examples &lt;br /&gt;
| asfasdf &lt;br /&gt;
|-&lt;br /&gt;
| JavaDOC &lt;br /&gt;
| asdfasdf &lt;br /&gt;
|-&lt;br /&gt;
| Applets &lt;br /&gt;
| List of example applets [[List of Applets]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Main_Page&amp;diff=86</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Main_Page&amp;diff=86"/>
		<updated>2011-09-23T21:39:18Z</updated>

		<summary type="html">&lt;p&gt;Spam: /* BoofCV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:600pt;&amp;quot;&lt;br /&gt;
| style=&amp;quot;background-color:#ffffdd;&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
= BoofCV = &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; A Computer Vision Library with Style&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
BoofCV is a Java library for real-time computer vision and robotics applications.  Written from scratch for ease of use and high performance, it provides both basic and advanced features needed for creating a modern computer vision system.  Functionality include highly optimized low level image processing routines (e.g. convolution, interpolation, gradient) to high level functionality such as image stabilization.&lt;br /&gt;
&lt;br /&gt;
It is divided up into four package, 1) image processing, 2) features, 3) geometric vision, and 4) input output.  Image processing contains core functionality which are most commonly used and typically operate directly on pixels.  Features contains feature (e.g. points, lines, and regions) extraction algorithms for use in higher level operations.  Geometric vision contains routines for processing extracted image features using 2D and 3D geometry. IO stands for input/output and contains common routines for reading in and displaying compute images.&lt;br /&gt;
&lt;br /&gt;
BoofCV is still in an early development phase, but is still highly capable.  To demonstrate this capability several example applets have been provided which can be run in your own browser, provided you have&lt;br /&gt;
version 1.6 or later of Java installed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
List of example applets [[List of Applets]]&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
	<entry>
		<id>http://boofcv.org/index.php?title=Main_Page&amp;diff=1</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://boofcv.org/index.php?title=Main_Page&amp;diff=1"/>
		<updated>2011-09-14T02:17:47Z</updated>

		<summary type="html">&lt;p&gt;Spam: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;MediaWiki has been successfully installed.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Consult the [http://meta.wikimedia.org/wiki/Help:Contents User&amp;#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;/div&gt;</summary>
		<author><name>Spam</name></author>
	</entry>
</feed>