Commit e8c6b2a7 authored by Alexander Alekhin's avatar Alexander Alekhin

Merge pull request #503 from cbalint13:daisy

parents 57337b5a cf5fa2d4
...@@ -576,11 +576,11 @@ static void ni_get_histogram( float* histogram, const int y, const int x, const ...@@ -576,11 +576,11 @@ static void ni_get_histogram( float* histogram, const int y, const int x, const
{ {
if ( ! Point( x, y ).inside( if ( ! Point( x, y ).inside(
Rect( 0, 0, hcube->size[2]-1, hcube->size[1]-1 ) ) Rect( 0, 0, hcube->size[1]-1, hcube->size[0]-1 ) )
) return; ) return;
int _hist_th_q_no = hcube->size[0]; int _hist_th_q_no = hcube->size[2];
const float* hptr = hcube->ptr<float>(0,y*_hist_th_q_no,x*_hist_th_q_no); const float* hptr = hcube->ptr<float>(y,x,0);
for( int h=0; h<_hist_th_q_no; h++ ) for( int h=0; h<_hist_th_q_no; h++ )
{ {
int hi = h+shift; int hi = h+shift;
...@@ -593,8 +593,8 @@ static void bi_get_histogram( float* histogram, const double y, const double x, ...@@ -593,8 +593,8 @@ static void bi_get_histogram( float* histogram, const double y, const double x,
{ {
int mnx = int( x ); int mnx = int( x );
int mny = int( y ); int mny = int( y );
int _hist_th_q_no = hcube->size[0]; int _hist_th_q_no = hcube->size[2];
if( mnx >= hcube->size[2]-2 || mny >= hcube->size[1]-2 ) if( mnx >= hcube->size[1]-2 || mny >= hcube->size[0]-2 )
{ {
memset(histogram, 0, sizeof(float)*_hist_th_q_no); memset(histogram, 0, sizeof(float)*_hist_th_q_no);
return; return;
...@@ -602,10 +602,10 @@ static void bi_get_histogram( float* histogram, const double y, const double x, ...@@ -602,10 +602,10 @@ static void bi_get_histogram( float* histogram, const double y, const double x,
// A C --> pixel positions // A C --> pixel positions
// B D // B D
const float* A = hcube->ptr<float>(0, mny , mnx ); const float* A = hcube->ptr<float>( mny , mnx , 0);
const float* B = hcube->ptr<float>(0, (mny+1), mnx ); const float* B = hcube->ptr<float>((mny+1), mnx , 0);
const float* C = hcube->ptr<float>(0, mny , (mnx+1)); const float* C = hcube->ptr<float>( mny , (mnx+1), 0);
const float* D = hcube->ptr<float>(0, (mny+1), (mnx+1)); const float* D = hcube->ptr<float>((mny+1), (mnx+1), 0);
double alpha = mnx+1-x; double alpha = mnx+1-x;
double beta = mny+1-y; double beta = mny+1-y;
...@@ -643,7 +643,7 @@ static void ti_get_histogram( float* histogram, const double y, const double x, ...@@ -643,7 +643,7 @@ static void ti_get_histogram( float* histogram, const double y, const double x,
float thist[MAX_CUBE_NO]; float thist[MAX_CUBE_NO];
bi_get_histogram( thist, y, x, ishift, hcube ); bi_get_histogram( thist, y, x, ishift, hcube );
int _hist_th_q_no = hcube->size[0]; int _hist_th_q_no = hcube->size[2];
for( int h=0; h<_hist_th_q_no-1; h++ ) for( int h=0; h<_hist_th_q_no-1; h++ )
histogram[h] = (float) ((1-layer_alpha)*thist[h]+layer_alpha*thist[h+1]); histogram[h] = (float) ((1-layer_alpha)*thist[h]+layer_alpha*thist[h+1]);
histogram[_hist_th_q_no-1] = (float) ((1-layer_alpha)*thist[_hist_th_q_no-1]+layer_alpha*thist[0]); histogram[_hist_th_q_no-1] = (float) ((1-layer_alpha)*thist[_hist_th_q_no-1]+layer_alpha*thist[0]);
...@@ -661,15 +661,15 @@ static void i_get_histogram( float* histogram, const double y, const double x, c ...@@ -661,15 +661,15 @@ static void i_get_histogram( float* histogram, const double y, const double x, c
static void ni_get_descriptor( const double y, const double x, const int orientation, float* descriptor, const std::vector<Mat>* layers, static void ni_get_descriptor( const double y, const double x, const int orientation, float* descriptor, const std::vector<Mat>* layers,
const Mat* _oriented_grid_points, const double* _orientation_shift_table, const int _th_q_no ) const Mat* _oriented_grid_points, const double* _orientation_shift_table, const int _th_q_no )
{ {
CV_Assert( y >= 0 && y < layers->at(0).size[1] ); CV_Assert( y >= 0 && y < layers->at(0).size[0] );
CV_Assert( x >= 0 && x < layers->at(0).size[2] ); CV_Assert( x >= 0 && x < layers->at(0).size[1] );
CV_Assert( orientation >= 0 && orientation < 360 ); CV_Assert( orientation >= 0 && orientation < 360 );
CV_Assert( !layers->empty() ); CV_Assert( !layers->empty() );
CV_Assert( !_oriented_grid_points->empty() ); CV_Assert( !_oriented_grid_points->empty() );
CV_Assert( descriptor != NULL ); CV_Assert( descriptor != NULL );
int _rad_q_no = (int) layers->size() - 1; int _rad_q_no = (int) layers->size();
int _hist_th_q_no = layers->at(0).size[0]; int _hist_th_q_no = layers->at(0).size[2];
double shift = _orientation_shift_table[orientation]; double shift = _orientation_shift_table[orientation];
int ishift = (int)shift; int ishift = (int)shift;
if( shift - ishift > 0.5 ) ishift++; if( shift - ishift > 0.5 ) ishift++;
...@@ -696,7 +696,7 @@ static void ni_get_descriptor( const double y, const double x, const int orienta ...@@ -696,7 +696,7 @@ static void ni_get_descriptor( const double y, const double x, const int orienta
ix = (int)xx; if( xx - ix > 0.5 ) ix++; ix = (int)xx; if( xx - ix > 0.5 ) ix++;
if ( ! Point2f( (float)xx, (float)yy ).inside( if ( ! Point2f( (float)xx, (float)yy ).inside(
Rect( 0, 0, layers->at(0).size[2]-1, layers->at(0).size[1]-1 ) ) Rect( 0, 0, layers->at(0).size[1]-1, layers->at(0).size[0]-1 ) )
) continue; ) continue;
histogram = descriptor + region*_hist_th_q_no; histogram = descriptor + region*_hist_th_q_no;
...@@ -708,15 +708,15 @@ static void ni_get_descriptor( const double y, const double x, const int orienta ...@@ -708,15 +708,15 @@ static void ni_get_descriptor( const double y, const double x, const int orienta
static void i_get_descriptor( const double y, const double x, const int orientation, float* descriptor, const std::vector<Mat>* layers, static void i_get_descriptor( const double y, const double x, const int orientation, float* descriptor, const std::vector<Mat>* layers,
const Mat* _oriented_grid_points, const double *_orientation_shift_table, const int _th_q_no ) const Mat* _oriented_grid_points, const double *_orientation_shift_table, const int _th_q_no )
{ {
CV_Assert( y >= 0 && y < layers->at(0).size[1] ); CV_Assert( y >= 0 && y < layers->at(0).size[0] );
CV_Assert( x >= 0 && x < layers->at(0).size[2] ); CV_Assert( x >= 0 && x < layers->at(0).size[1] );
CV_Assert( orientation >= 0 && orientation < 360 ); CV_Assert( orientation >= 0 && orientation < 360 );
CV_Assert( !layers->empty() ); CV_Assert( !layers->empty() );
CV_Assert( !_oriented_grid_points->empty() ); CV_Assert( !_oriented_grid_points->empty() );
CV_Assert( descriptor != NULL ); CV_Assert( descriptor != NULL );
int _rad_q_no = (int) layers->size() - 1; int _rad_q_no = (int) layers->size();
int _hist_th_q_no = layers->at(0).size[0]; int _hist_th_q_no = layers->at(0).size[2];
double shift = _orientation_shift_table[orientation]; double shift = _orientation_shift_table[orientation];
i_get_histogram( descriptor, y, x, shift, &layers->at(g_selected_cubes[0]) ); i_get_histogram( descriptor, y, x, shift, &layers->at(g_selected_cubes[0]) );
...@@ -737,7 +737,7 @@ static void i_get_descriptor( const double y, const double x, const int orientat ...@@ -737,7 +737,7 @@ static void i_get_descriptor( const double y, const double x, const int orientat
xx = x + grid.at<double>(2*region + 1); xx = x + grid.at<double>(2*region + 1);
if ( ! Point2f( (float)xx, (float)yy ).inside( if ( ! Point2f( (float)xx, (float)yy ).inside(
Rect( 0, 0, layers->at(0).size[2]-1, layers->at(0).size[1]-1 ) ) Rect( 0, 0, layers->at(0).size[1]-1, layers->at(0).size[0]-1 ) )
) continue; ) continue;
histogram = descriptor + region*_hist_th_q_no; histogram = descriptor + region*_hist_th_q_no;
...@@ -760,11 +760,11 @@ static bool ni_get_descriptor_h( const double y, const double x, const int orien ...@@ -760,11 +760,11 @@ static bool ni_get_descriptor_h( const double y, const double x, const int orien
pt_H(H, x, y, hx, hy ); pt_H(H, x, y, hx, hy );
if ( ! Point2f( (float)hx, (float)hy ).inside( if ( ! Point2f( (float)hx, (float)hy ).inside(
Rect( 0, 0, layers->at(0).size[2]-1, layers->at(0).size[1]-1 ) ) Rect( 0, 0, layers->at(0).size[1]-1, layers->at(0).size[0]-1 ) )
) return false; ) return false;
int _rad_q_no = (int) layers->size() - 1; int _rad_q_no = (int) layers->size();
int _hist_th_q_no = layers->at(0).size[0]; int _hist_th_q_no = layers->at(0).size[2];
double shift = _orientation_shift_table[orientation]; double shift = _orientation_shift_table[orientation];
int ishift = (int)shift; if( shift - ishift > 0.5 ) ishift++; int ishift = (int)shift; if( shift - ishift > 0.5 ) ishift++;
...@@ -803,7 +803,7 @@ static bool ni_get_descriptor_h( const double y, const double x, const int orien ...@@ -803,7 +803,7 @@ static bool ni_get_descriptor_h( const double y, const double x, const int orien
ihy = (int)hy; if( hy - ihy > 0.5 ) ihy++; ihy = (int)hy; if( hy - ihy > 0.5 ) ihy++;
if ( ! Point( ihx, ihy ).inside( if ( ! Point( ihx, ihy ).inside(
Rect( 0, 0, layers->at(0).size[2]-1, layers->at(0).size[1]-1 ) ) Rect( 0, 0, layers->at(0).size[1]-1, layers->at(0).size[0]-1 ) )
) continue; ) continue;
histogram = descriptor + region*_hist_th_q_no; histogram = descriptor + region*_hist_th_q_no;
...@@ -826,10 +826,10 @@ static bool i_get_descriptor_h( const double y, const double x, const int orient ...@@ -826,10 +826,10 @@ static bool i_get_descriptor_h( const double y, const double x, const int orient
pt_H( H, x, y, hx, hy ); pt_H( H, x, y, hx, hy );
if ( ! Point2f( (float)hx, (float)hy ).inside( if ( ! Point2f( (float)hx, (float)hy ).inside(
Rect( 0, 0, layers->at(0).size[2]-1, layers->at(0).size[1]-1 ) ) Rect( 0, 0, layers->at(0).size[1]-1, layers->at(0).size[0]-1 ) )
) return false; ) return false;
int _rad_q_no = (int) layers->size() - 1; int _rad_q_no = (int) layers->size();
int _hist_th_q_no = layers->at(0).size[0]; int _hist_th_q_no = layers->at(0).size[0];
pt_H( H, x+_cube_sigmas.at<double>(g_selected_cubes[0]), y, rx, ry); pt_H( H, x+_cube_sigmas.at<double>(g_selected_cubes[0]), y, rx, ry);
double d0 = rx - hx; double d1 = ry - hy; double d0 = rx - hx; double d1 = ry - hy;
...@@ -862,7 +862,7 @@ static bool i_get_descriptor_h( const double y, const double x, const int orient ...@@ -862,7 +862,7 @@ static bool i_get_descriptor_h( const double y, const double x, const int orient
} }
if ( ! Point2f( (float)hx, (float)hy ).inside( if ( ! Point2f( (float)hx, (float)hy ).inside(
Rect( 0, 0, layers->at(0).size[2]-1, layers->at(0).size[1]-1 ) ) Rect( 0, 0, layers->at(0).size[1]-1, layers->at(0).size[0]-1 ) )
) continue; ) continue;
histogram = descriptor + region*_hist_th_q_no; histogram = descriptor + region*_hist_th_q_no;
...@@ -1096,8 +1096,8 @@ inline void DAISY_Impl::initialize() ...@@ -1096,8 +1096,8 @@ inline void DAISY_Impl::initialize()
CV_Assert(m_image.rows != 0); CV_Assert(m_image.rows != 0);
CV_Assert(m_image.cols != 0); CV_Assert(m_image.cols != 0);
// (m_rad_q_no + 1) matrices // (m_rad_q_no + 1) cubes
// 3 dims matrix (idhist, img_y, img_x); // 3 dims tensor (idhist, img_y, img_x);
m_smoothed_gradient_layers.resize( m_rad_q_no + 1 ); m_smoothed_gradient_layers.resize( m_rad_q_no + 1 );
int dims[3] = { m_hist_th_q_no, m_image.rows, m_image.cols }; int dims[3] = { m_hist_th_q_no, m_image.rows, m_image.cols };
...@@ -1143,23 +1143,20 @@ struct ComputeHistogramsInvoker : ParallelLoopBody ...@@ -1143,23 +1143,20 @@ struct ComputeHistogramsInvoker : ParallelLoopBody
{ {
r = _r; r = _r;
layers = _layers; layers = _layers;
_hist_th_q_no = layers->at(r).size[0]; _hist_th_q_no = layers->at(r).size[2];
} }
void operator ()(const cv::Range& range) const void operator ()(const cv::Range& range) const
{ {
for (int y = range.start; y < range.end; ++y) for (int y = range.start; y < range.end; ++y)
{ {
for( int x = 0; x < layers->at(r).size[2]; x++ ) for( int x = 0; x < layers->at(r).size[1]; x++ )
{ {
if ( ! Point( x, y ).inside( float* hist = layers->at(r).ptr<float>(y,x,0);
Rect( 0, 0, layers->at(r).size[2]-1, layers->at(r).size[1]-1 ) )
) continue;
float* hist = layers->at(r).ptr<float>(0,y,x);
for( int h = 0; h < _hist_th_q_no; h++ ) for( int h = 0; h < _hist_th_q_no; h++ )
{
hist[h] = layers->at(r+1).at<float>(h,y,x); hist[h] = layers->at(r+1).at<float>(h,y,x);
}
} }
} }
} }
...@@ -1172,8 +1169,25 @@ inline void DAISY_Impl::compute_histograms() ...@@ -1172,8 +1169,25 @@ inline void DAISY_Impl::compute_histograms()
{ {
for( int r=0; r<m_rad_q_no; r++ ) for( int r=0; r<m_rad_q_no; r++ )
{ {
// remap cubes from Mat(h,y,x) -> Mat(y,x,h)
// final sampling is speeded up by aligned h dim
int m_h = m_smoothed_gradient_layers.at(r).size[0];
int m_y = m_smoothed_gradient_layers.at(r).size[1];
int m_x = m_smoothed_gradient_layers.at(r).size[2];
// empty targeted cube
m_smoothed_gradient_layers.at(r).release();
// recreate cube space
int dims[3] = { m_y, m_x, m_h };
m_smoothed_gradient_layers.at(r) = Mat( 3, dims, CV_32F );
// copy backward all cubes and realign structure
parallel_for_( Range(0, m_image.rows), ComputeHistogramsInvoker( &m_smoothed_gradient_layers, r ) ); parallel_for_( Range(0, m_image.rows), ComputeHistogramsInvoker( &m_smoothed_gradient_layers, r ) );
} }
// trim unused region from collection of cubes
m_smoothed_gradient_layers[m_rad_q_no].release();
m_smoothed_gradient_layers.pop_back();
} }
inline void DAISY_Impl::compute_smoothed_gradient_layers() inline void DAISY_Impl::compute_smoothed_gradient_layers()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment