mirror of
https://github.com/opencv/opencv.git
synced 2025-01-18 06:03:15 +08:00
Improve initialization performance of Brisk
reformatting Improve initialization performance of Brisk fix formatting Improve initialization performance of Brisk formatting Improve initialization performance of Brisk make a lookup table for ring use cosine/sine lookup table for theta in brisk and utilize trig identity fix ring lookup table use cosine/sine lookup table for theta in brisk and utilize trig identity formatting use cosine/sine lookup table for theta in brisk and utilize trig identity move scale radius product to ring loop to ensure it's not recomputed for each rot revert change move scale radius product to ring loop to ensure it's not recomputed for each rot remove rings lookup table move scale radius product to ring loop to ensure it's not recomputed for each rot fix formatting of for loop move scale radius product to ring loop to ensure it's not recomputed for each rot use sine/cosine approximations for brisk lookup table. add documentation for sine/cosine lookup tables Improve initialization performance of BRISK
This commit is contained in:
parent
793e7c0d9f
commit
ac177b849c
@ -353,13 +353,30 @@ BRISK_Impl::generateKernel(const std::vector<float> &radiusList,
|
|||||||
const int rings = (int)radiusList.size();
|
const int rings = (int)radiusList.size();
|
||||||
CV_Assert(radiusList.size() != 0 && radiusList.size() == numberList.size());
|
CV_Assert(radiusList.size() != 0 && radiusList.size() == numberList.size());
|
||||||
points_ = 0; // remember the total number of points
|
points_ = 0; // remember the total number of points
|
||||||
|
double sineThetaLookupTable[n_rot_];
|
||||||
|
double cosThetaLookupTable[n_rot_];
|
||||||
for (int ring = 0; ring < rings; ring++)
|
for (int ring = 0; ring < rings; ring++)
|
||||||
{
|
{
|
||||||
points_ += numberList[ring];
|
points_ += numberList[ring];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// using a sine/cosine approximation for the lookup table
|
||||||
|
// utilizes the trig identities:
|
||||||
|
// sin(a + b) = sin(a)cos(b) + cos(a)sin(b)
|
||||||
|
// cos(a + b) = cos(a)cos(b) - sin(a)sin(b)
|
||||||
|
// and the fact that sin(0) = 0, cos(0) = 1
|
||||||
|
double cosval = 1., sinval = 0.;
|
||||||
|
double dcos = cos(2*CV_PI/double(n_rot_)), dsin = sin(2*CV_PI/double(n_rot_));
|
||||||
|
for( size_t rot = 0; rot < n_rot_; ++rot)
|
||||||
|
{
|
||||||
|
sineThetaLookupTable[rot] = sinval;
|
||||||
|
cosThetaLookupTable[rot] = cosval;
|
||||||
|
double t = sinval*dcos + cosval*dsin;
|
||||||
|
cosval = cosval*dcos - sinval*dsin;
|
||||||
|
sinval = t;
|
||||||
|
}
|
||||||
// set up the patterns
|
// set up the patterns
|
||||||
patternPoints_ = new BriskPatternPoint[points_ * scales_ * n_rot_];
|
patternPoints_ = new BriskPatternPoint[points_ * scales_ * n_rot_];
|
||||||
BriskPatternPoint* patternIterator = patternPoints_;
|
|
||||||
|
|
||||||
// define the scale discretization:
|
// define the scale discretization:
|
||||||
static const float lb_scale = (float)(std::log(scalerange_) / std::log(2.0));
|
static const float lb_scale = (float)(std::log(scalerange_) / std::log(2.0));
|
||||||
@ -370,46 +387,51 @@ BRISK_Impl::generateKernel(const std::vector<float> &radiusList,
|
|||||||
|
|
||||||
const float sigma_scale = 1.3f;
|
const float sigma_scale = 1.3f;
|
||||||
|
|
||||||
for (unsigned int scale = 0; scale < scales_; ++scale)
|
for (unsigned int scale = 0; scale < scales_; ++scale) {
|
||||||
{
|
scaleList_[scale] = (float) std::pow((double) 2.0, (double) (scale * lb_scale_step));
|
||||||
scaleList_[scale] = (float)std::pow((double) 2.0, (double) (scale * lb_scale_step));
|
sizeList_[scale] = 0;
|
||||||
sizeList_[scale] = 0;
|
BriskPatternPoint *patternIteratorOuter = patternPoints_ + (scale * n_rot_ * points_);
|
||||||
|
// generate the pattern points look-up
|
||||||
// generate the pattern points look-up
|
for (int ring = 0; ring < rings; ++ring) {
|
||||||
double alpha, theta;
|
double scaleRadiusProduct = scaleList_[scale] * radiusList[ring];
|
||||||
for (size_t rot = 0; rot < n_rot_; ++rot)
|
float patternSigma = 0.0f;
|
||||||
{
|
if (ring == 0) {
|
||||||
theta = double(rot) * 2 * CV_PI / double(n_rot_); // this is the rotation of the feature
|
patternSigma = sigma_scale * scaleList_[scale] * 0.5f;
|
||||||
for (int ring = 0; ring < rings; ++ring)
|
} else {
|
||||||
{
|
patternSigma = (float) (sigma_scale * scaleList_[scale] * (double(radiusList[ring]))
|
||||||
for (int num = 0; num < numberList[ring]; ++num)
|
* sin(CV_PI / numberList[ring]));
|
||||||
{
|
|
||||||
// the actual coordinates on the circle
|
|
||||||
alpha = (double(num)) * 2 * CV_PI / double(numberList[ring]);
|
|
||||||
patternIterator->x = (float)(scaleList_[scale] * radiusList[ring] * cos(alpha + theta)); // feature rotation plus angle of the point
|
|
||||||
patternIterator->y = (float)(scaleList_[scale] * radiusList[ring] * sin(alpha + theta));
|
|
||||||
// and the gaussian kernel sigma
|
|
||||||
if (ring == 0)
|
|
||||||
{
|
|
||||||
patternIterator->sigma = sigma_scale * scaleList_[scale] * 0.5f;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
patternIterator->sigma = (float)(sigma_scale * scaleList_[scale] * (double(radiusList[ring]))
|
|
||||||
* sin(CV_PI / numberList[ring]));
|
|
||||||
}
|
}
|
||||||
// adapt the sizeList if necessary
|
// adapt the sizeList if necessary
|
||||||
const unsigned int size = cvCeil(((scaleList_[scale] * radiusList[ring]) + patternIterator->sigma)) + 1;
|
const unsigned int size = cvCeil(((scaleList_[scale] * radiusList[ring]) + patternSigma)) + 1;
|
||||||
if (sizeList_[scale] < size)
|
if (sizeList_[scale] < size) {
|
||||||
{
|
sizeList_[scale] = size;
|
||||||
sizeList_[scale] = size;
|
|
||||||
}
|
}
|
||||||
|
for (int num = 0; num < numberList[ring]; ++num) {
|
||||||
|
BriskPatternPoint *patternIterator = patternIteratorOuter;
|
||||||
|
double alpha = (double(num)) * 2 * CV_PI / double(numberList[ring]);
|
||||||
|
double sine_alpha = sin(alpha);
|
||||||
|
double cosine_alpha = cos(alpha);
|
||||||
|
|
||||||
// increment the iterator
|
for (size_t rot = 0; rot < n_rot_; ++rot) {
|
||||||
++patternIterator;
|
double cosine_theta = cosThetaLookupTable[rot];
|
||||||
}
|
double sine_theta = sineThetaLookupTable[rot];
|
||||||
|
|
||||||
|
// the actual coordinates on the circle
|
||||||
|
// sin(a + b) = sin(a) cos(b) + cos(a) sin(b)
|
||||||
|
// cos(a + b) = cos(a) cos(b) - sin(a) sin(b)
|
||||||
|
patternIterator->x = (float) (scaleRadiusProduct *
|
||||||
|
(cosine_theta * cosine_alpha -
|
||||||
|
sine_theta * sine_alpha)); // feature rotation plus angle of the point
|
||||||
|
patternIterator->y = (float) (scaleRadiusProduct *
|
||||||
|
(sine_theta * cosine_alpha + cosine_theta * sine_alpha));
|
||||||
|
patternIterator->sigma = patternSigma;
|
||||||
|
// and the gaussian kernel sigma
|
||||||
|
// increment the iterator
|
||||||
|
patternIterator += points_;
|
||||||
|
}
|
||||||
|
++patternIteratorOuter;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// now also generate pairings
|
// now also generate pairings
|
||||||
|
Loading…
Reference in New Issue
Block a user