@@ -106,7 +106,7 @@ void AKAZEFeatures::Allocate_Memory_Evolution(void) {
106
106
*/
107
107
static inline int getGaussianKernelSize (float sigma) {
108
108
// Compute an appropriate kernel size according to the specified sigma
109
- int ksize = (int )ceil (2 .0f *(1 .0f + (sigma - 0 .8f ) / (0 .3f )));
109
+ int ksize = (int )cvCeil (2 .0f *(1 .0f + (sigma - 0 .8f ) / (0 .3f )));
110
110
ksize |= 1 ; // kernel should be odd
111
111
return ksize;
112
112
}
@@ -1131,20 +1131,17 @@ void AKAZEFeatures::Compute_Descriptors(std::vector<KeyPoint>& kpts, OutputArray
1131
1131
}
1132
1132
1133
1133
// Allocate memory for the matrix with the descriptors
1134
- if (options_.descriptor < AKAZE::DESCRIPTOR_MLDB_UPRIGHT) {
1135
- descriptors.create ((int )kpts.size (), 64 , CV_32FC1);
1136
- }
1137
- else {
1138
- // We use the full length binary descriptor -> 486 bits
1139
- if (options_.descriptor_size == 0 ) {
1140
- int t = (6 + 36 + 120 )*options_.descriptor_channels ;
1141
- descriptors.create ((int )kpts.size (), (int )ceil (t / 8 .), CV_8UC1);
1142
- }
1143
- else {
1144
- // We use the random bit selection length binary descriptor
1145
- descriptors.create ((int )kpts.size (), (int )ceil (options_.descriptor_size / 8 .), CV_8UC1);
1146
- }
1134
+ int descriptor_size = 64 ;
1135
+ int descriptor_type = CV_32FC1;
1136
+ if (options_.descriptor >= AKAZE::DESCRIPTOR_MLDB_UPRIGHT)
1137
+ {
1138
+ int descriptor_bits = (options_.descriptor_size == 0 )
1139
+ ? (6 + 36 + 120 )*options_.descriptor_channels // the full length binary descriptor -> 486 bits
1140
+ : options_.descriptor_size ; // the random bit selection length binary descriptor
1141
+ descriptor_size = divUp (descriptor_bits, 8 );
1142
+ descriptor_type = CV_8UC1;
1147
1143
}
1144
+ descriptors.create ((int )kpts.size (), descriptor_size, descriptor_type);
1148
1145
1149
1146
Mat desc = descriptors.getMat ();
1150
1147
@@ -1701,10 +1698,11 @@ void Upright_MLDB_Full_Descriptor_Invoker::Get_Upright_MLDB_Full_Descriptor(cons
1701
1698
1702
1699
// For 2x2 grid, 3x3 grid and 4x4 grid
1703
1700
const int pattern_size = options_->descriptor_pattern_size ;
1704
- int sample_step[3 ] = {
1701
+ CV_Assert ((pattern_size & 1 ) == 0 );
1702
+ const int sample_step[3 ] = {
1705
1703
pattern_size,
1706
- static_cast < int >( ceil ( pattern_size* 2 ./ 3 .) ),
1707
- pattern_size / 2
1704
+ divUp ( pattern_size * 2 , 3 ),
1705
+ divUp ( pattern_size, 2 )
1708
1706
};
1709
1707
1710
1708
// For the three grids
@@ -1873,8 +1871,16 @@ void MLDB_Full_Descriptor_Invoker::Get_MLDB_Full_Descriptor(const KeyPoint& kpt,
1873
1871
1874
1872
const int max_channels = 3 ;
1875
1873
CV_Assert (options_->descriptor_channels <= max_channels);
1874
+ const int pattern_size = options_->descriptor_pattern_size ;
1875
+
1876
1876
float values[16 *max_channels];
1877
- const double size_mult[3 ] = {1 , 2.0 /3.0 , 1.0 /2.0 };
1877
+ CV_Assert ((pattern_size & 1 ) == 0 );
1878
+ // const double size_mult[3] = {1, 2.0/3.0, 1.0/2.0};
1879
+ const int sample_step[3 ] = { // static_cast<int>(ceil(pattern_size * size_mult[lvl]))
1880
+ pattern_size,
1881
+ divUp (pattern_size * 2 , 3 ),
1882
+ divUp (pattern_size, 2 )
1883
+ };
1878
1884
1879
1885
float ratio = (float )(1 << kpt.octave );
1880
1886
float scale = (float )fRound (0 .5f *kpt.size / ratio);
@@ -1883,14 +1889,12 @@ void MLDB_Full_Descriptor_Invoker::Get_MLDB_Full_Descriptor(const KeyPoint& kpt,
1883
1889
float angle = (kpt.angle * static_cast <float >(CV_PI)) / 180 .f ;
1884
1890
float co = cos (angle);
1885
1891
float si = sin (angle);
1886
- int pattern_size = options_->descriptor_pattern_size ;
1887
1892
1888
1893
int dpos = 0 ;
1889
1894
for (int lvl = 0 ; lvl < 3 ; lvl++) {
1890
1895
1891
1896
int val_count = (lvl + 2 ) * (lvl + 2 );
1892
- int sample_step = static_cast <int >(ceil (pattern_size * size_mult[lvl]));
1893
- MLDB_Fill_Values (values, sample_step, kpt.class_id , xf, yf, co, si, scale);
1897
+ MLDB_Fill_Values (values, sample_step[lvl], kpt.class_id , xf, yf, co, si, scale);
1894
1898
MLDB_Binary_Comparisons (values, desc, val_count, dpos);
1895
1899
}
1896
1900
}
@@ -1930,14 +1934,18 @@ void MLDB_Descriptor_Subset_Invoker::Get_MLDB_Descriptor_Subset(const KeyPoint&
1930
1934
Mat values ((4 + 9 + 16 )*options.descriptor_channels , 1 , CV_32FC1);
1931
1935
1932
1936
// Sample everything, but only do the comparisons
1933
- vector<int > steps (3 );
1934
- steps.at (0 ) = options.descriptor_pattern_size ;
1935
- steps.at (1 ) = (int )ceil (2 .f *options.descriptor_pattern_size / 3 .f );
1936
- steps.at (2 ) = options.descriptor_pattern_size / 2 ;
1937
+ const int pattern_size = options.descriptor_pattern_size ;
1938
+ CV_Assert ((pattern_size & 1 ) == 0 );
1939
+ const int sample_steps[3 ] = {
1940
+ pattern_size,
1941
+ divUp (pattern_size * 2 , 3 ),
1942
+ divUp (pattern_size, 2 )
1943
+ };
1937
1944
1938
1945
for (int i = 0 ; i < descriptorSamples_.rows ; i++) {
1939
1946
const int *coords = descriptorSamples_.ptr <int >(i);
1940
- int sample_step = steps.at (coords[0 ]);
1947
+ CV_Assert (coords[0 ] >= 0 && coords[0 ] < 3 );
1948
+ const int sample_step = sample_steps[coords[0 ]];
1941
1949
di = 0 .0f ;
1942
1950
dx = 0 .0f ;
1943
1951
dy = 0 .0f ;
@@ -2025,14 +2033,18 @@ void Upright_MLDB_Descriptor_Subset_Invoker::Get_Upright_MLDB_Descriptor_Subset(
2025
2033
// Allocate memory for the matrix of values
2026
2034
Mat values ((4 + 9 + 16 )*options.descriptor_channels , 1 , CV_32FC1);
2027
2035
2028
- vector<int > steps (3 );
2029
- steps.at (0 ) = options.descriptor_pattern_size ;
2030
- steps.at (1 ) = static_cast <int >(ceil (2 .f *options.descriptor_pattern_size / 3 .f ));
2031
- steps.at (2 ) = options.descriptor_pattern_size / 2 ;
2036
+ const int pattern_size = options.descriptor_pattern_size ;
2037
+ CV_Assert ((pattern_size & 1 ) == 0 );
2038
+ const int sample_steps[3 ] = {
2039
+ pattern_size,
2040
+ divUp (pattern_size * 2 , 3 ),
2041
+ divUp (pattern_size, 2 )
2042
+ };
2032
2043
2033
2044
for (int i = 0 ; i < descriptorSamples_.rows ; i++) {
2034
2045
const int *coords = descriptorSamples_.ptr <int >(i);
2035
- int sample_step = steps.at (coords[0 ]);
2046
+ CV_Assert (coords[0 ] >= 0 && coords[0 ] < 3 );
2047
+ int sample_step = sample_steps[coords[0 ]];
2036
2048
di = 0 .0f , dx = 0 .0f , dy = 0 .0f ;
2037
2049
2038
2050
for (int k = coords[1 ]; k < coords[1 ] + sample_step; k++) {
@@ -2120,7 +2132,7 @@ void generateDescriptorSubsample(Mat& sampleList, Mat& comparisons, int nbits,
2120
2132
for (int i = 0 , c = 0 ; i < 3 ; i++) {
2121
2133
int gdiv = i + 2 ; // grid divisions, per row
2122
2134
int gsz = gdiv*gdiv;
2123
- int psz = ( int ) ceil ( 2 . f *pattern_size / ( float ) gdiv);
2135
+ int psz = divUp ( 2 *pattern_size, gdiv);
2124
2136
2125
2137
for (int j = 0 ; j < gsz; j++) {
2126
2138
for (int k = j + 1 ; k < gsz; k++, c++) {
@@ -2134,12 +2146,12 @@ void generateDescriptorSubsample(Mat& sampleList, Mat& comparisons, int nbits,
2134
2146
}
2135
2147
2136
2148
RNG rng (1024 );
2137
- Mat_<int > comps = Mat_<int >(nchannels * (int )ceil (nbits / (float )nchannels), 2 );
2149
+ const int npicks = divUp (nbits, nchannels);
2150
+ Mat_<int > comps = Mat_<int >(nchannels * npicks, 2 );
2138
2151
comps = 1000 ;
2139
2152
2140
2153
// Select some samples. A sample includes all channels
2141
2154
int count = 0 ;
2142
- int npicks = (int )ceil (nbits / (float )nchannels);
2143
2155
Mat_<int > samples (29 , 3 );
2144
2156
Mat_<int > fullcopy = fullM.clone ();
2145
2157
samples = -1 ;
0 commit comments