From ddaefb6c26aa1e3510b9a05775c45f68357c64c4 Mon Sep 17 00:00:00 2001
From: Davis King <davis@dlib.net>
Date: Sun, 17 Feb 2013 21:25:52 -0500
Subject: [PATCH] Changed how the surf descriptor is computed slightly to
improve its accuracy.
---
dlib/image_keypoint/surf.h | 16 +++++++++-------
dlib/image_keypoint/surf_abstract.h | 4 ++--
2 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/dlib/image_keypoint/surf.h b/dlib/image_keypoint/surf.h
index 09fba3dd..7c1a7c82 100644
--- a/dlib/image_keypoint/surf.h
+++ b/dlib/image_keypoint/surf.h
@@ -93,6 +93,8 @@ namespace dlib
std::vector<double> ang;
std::vector<dlib::vector<double,2> > samples;
+ const long sc = static_cast<long>(scale+0.5);
+
// accumulate a bunch of angle and vector samples
dlib::vector<double,2> vect;
for (long r = -6; r <= 6; ++r)
@@ -103,8 +105,8 @@ namespace dlib
{
// compute a Gaussian weighted gradient and the gradient's angle.
const double gauss = gaussian(c,r, 2.5);
- vect.x() = gauss*haar_x(img, scale*point(c,r)+center, static_cast<long>(4*scale+0.5));
- vect.y() = gauss*haar_y(img, scale*point(c,r)+center, static_cast<long>(4*scale+0.5));
+ vect.x() = gauss*haar_x(img, sc*point(c,r)+center, 4*sc);
+ vect.y() = gauss*haar_y(img, sc*point(c,r)+center, 4*sc);
samples.push_back(vect);
ang.push_back(atan2(vect.y(), vect.x()));
}
@@ -163,7 +165,7 @@ namespace dlib
matrix<double,64,1,MM,L>& des
)
{
- DLIB_ASSERT(get_rect(img).contains(centered_rect(center, (unsigned long)(31*scale),(unsigned long)(31*scale))) == true &&
+ DLIB_ASSERT(get_rect(img).contains(centered_rect(center, (unsigned long)(32*scale),(unsigned long)(32*scale))) == true &&
scale > 0,
"\tvoid compute_surf_descriptor(img, center, scale, angle)"
<< "\n\tAll arguments to this function must be > 0"
@@ -175,6 +177,7 @@ namespace dlib
point_rotator rot(angle);
point_rotator inv_rot(-angle);
+ const long sc = static_cast<long>(scale+0.5);
long count = 0;
// loop over the 4x4 grid of histogram buckets
@@ -192,9 +195,8 @@ namespace dlib
// get the rotated point for this extraction point
point p(rot(point(x,y)*scale) + center);
- const double gauss = gaussian(x,y, 3.3);
- temp.x() = gauss*haar_x(img, p, static_cast<long>(2*scale+0.5));
- temp.y() = gauss*haar_y(img, p, static_cast<long>(2*scale+0.5));
+ temp.x() = haar_x(img, p, 2*sc);
+ temp.y() = haar_y(img, p, 2*sc);
// rotate this vector into alignment with the surf descriptor box
temp = inv_rot(temp);
@@ -252,7 +254,7 @@ namespace dlib
for (unsigned long i = 0; i < std::min((size_t)max_points,points.size()); ++i)
{
// ignore points that are close to the edge of the image
- const double border = 31;
+ const double border = 32;
const unsigned long border_size = static_cast<unsigned long>(border*points[i].scale);
if (get_rect(int_img).contains(centered_rect(points[i].center, border_size, border_size)))
{
diff --git a/dlib/image_keypoint/surf_abstract.h b/dlib/image_keypoint/surf_abstract.h
index f767c4a3..ba82d8bd 100644
--- a/dlib/image_keypoint/surf_abstract.h
+++ b/dlib/image_keypoint/surf_abstract.h
@@ -76,8 +76,8 @@ namespace dlib
- integral_image_type == an object such as dlib::integral_image or another
type that implements the interface defined in image_transforms/integral_image_abstract.h
- scale > 0
- - get_rect(img).contains(centered_rect(center, 31*scale, 31*scale)) == true
- (i.e. center can't be within 31*scale pixels of the edge of the image)
+ - get_rect(img).contains(centered_rect(center, 32*scale, 32*scale)) == true
+ (i.e. center can't be within 32*scale pixels of the edge of the image)
ensures
- computes the 64 dimensional SURF descriptor vector of a box centered
at the given center point, tilted at an angle determined by the given
--
2.18.0