diff options
Diffstat (limited to 'ml/dlib/dlib/image_keypoint/build_separable_poly_filters.h')
-rw-r--r-- | ml/dlib/dlib/image_keypoint/build_separable_poly_filters.h | 186 |
1 files changed, 0 insertions, 186 deletions
diff --git a/ml/dlib/dlib/image_keypoint/build_separable_poly_filters.h b/ml/dlib/dlib/image_keypoint/build_separable_poly_filters.h deleted file mode 100644 index aea59067d..000000000 --- a/ml/dlib/dlib/image_keypoint/build_separable_poly_filters.h +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright (C) 2011 Davis E. King (davis@dlib.net) -// License: Boost Software License See LICENSE.txt for the full license. -#ifndef DLIB_BUILD_SEPARABLE_PoLY_FILTERS_Hh_ -#define DLIB_BUILD_SEPARABLE_PoLY_FILTERS_Hh_ - -#include "../matrix.h" -#include "surf.h" -#include "../uintn.h" -#include <vector> - -namespace dlib -{ - -// ---------------------------------------------------------------------------------------- - - typedef std::pair<matrix<double,0,1>, matrix<double,0,1> > separable_filter_type; - typedef std::pair<matrix<int32,0,1>, matrix<int32,0,1> > separable_int32_filter_type; - -// ---------------------------------------------------------------------------------------- - - inline std::vector<std::vector<separable_filter_type> > build_separable_poly_filters ( - const long order, - const long window_size - ) - /*! - requires - - 1 <= order <= 6 - - window_size >= 3 && window_size is odd - ensures - - the "first" element is the row_filter, the second is the col_filter. - - Some filters are not totally separable and that's why they are grouped - into vectors of vectors. The groups are all the parts of a partially - separable filter. - !*/ - { - long num_filters = 6; - switch (order) - { - case 1: num_filters = 3; break; - case 2: num_filters = 6; break; - case 3: num_filters = 10; break; - case 4: num_filters = 15; break; - case 5: num_filters = 21; break; - case 6: num_filters = 28; break; - } - - matrix<double> X(window_size*window_size,num_filters); - matrix<double,0,1> G(window_size*window_size,1); - const double sigma = window_size/4.0; - - - long cnt = 0; - for (double x = -window_size/2; x <= window_size/2; ++x) - { - for (double y = -window_size/2; y <= window_size/2; ++y) - { - X(cnt, 0) = 1; - X(cnt, 1) = x; - X(cnt, 2) = y; - - if (X.nc() > 5) - { - X(cnt, 3) = x*x; - X(cnt, 4) = x*y; - X(cnt, 5) = y*y; - } - if (X.nc() > 9) - { - X(cnt, 6) = x*x*x; - X(cnt, 7) = y*x*x; - X(cnt, 8) = y*y*x; - X(cnt, 9) = y*y*y; - } - if (X.nc() > 14) - { - X(cnt, 10) = x*x*x*x; - X(cnt, 11) = y*x*x*x; - X(cnt, 12) = y*y*x*x; - X(cnt, 13) = y*y*y*x; - X(cnt, 14) = y*y*y*y; - } - if (X.nc() > 20) - { - X(cnt, 15) = x*x*x*x*x; - X(cnt, 16) = y*x*x*x*x; - X(cnt, 17) = y*y*x*x*x; - X(cnt, 18) = y*y*y*x*x; - X(cnt, 19) = y*y*y*y*x; - X(cnt, 20) = y*y*y*y*y; - } - if (X.nc() > 27) - { - X(cnt, 21) = x*x*x*x*x*x; - X(cnt, 22) = y*x*x*x*x*x; - X(cnt, 23) = y*y*x*x*x*x; - X(cnt, 24) = y*y*y*x*x*x; - X(cnt, 25) = y*y*y*y*x*x; - X(cnt, 26) = y*y*y*y*y*x; - X(cnt, 27) = y*y*y*y*y*y; - } - - G(cnt) = std::sqrt(gaussian(x,y,sigma)); - ++cnt; - } - } - - X = diagm(G)*X; - - const matrix<double> S = inv(trans(X)*X)*trans(X)*diagm(G); - - matrix<double,0,1> row_filter, col_filter; - - matrix<double> u,v, temp; - matrix<double,0,1> w; - - std::vector<std::vector<separable_filter_type> > results(num_filters); - - for (long r = 0; r < S.nr(); ++r) - { - temp = reshape(rowm(S,r), window_size, window_size); - svd3(temp,u,w,v); - const double thresh = max(w)*1e-8; - for (long i = 0; i < w.size(); ++i) - { - if (w(i) > thresh) - { - col_filter = std::sqrt(w(i))*colm(u,i); - row_filter = std::sqrt(w(i))*colm(v,i); - results[r].push_back(std::make_pair(row_filter, col_filter)); - } - } - } - - return results; - } - -// ---------------------------------------------------------------------------------------- - - inline std::vector<std::vector<separable_int32_filter_type> > build_separable_int32_poly_filters ( - const long order, - const long window_size, - const double max_range = 300.0 - ) - /*! - requires - - 1 <= order <= 6 - - window_size >= 3 && window_size is odd - - max_range > 1 - ensures - - the "first" element is the row_filter, the second is the col_filter. - !*/ - { - const std::vector<std::vector<separable_filter_type> >& filters = build_separable_poly_filters(order, window_size); - std::vector<std::vector<separable_int32_filter_type> > int_filters(filters.size()); - - for (unsigned long i = 0; i < filters.size(); ++i) - { - - double max_val = 0; - for (unsigned long j = 0; j < filters[i].size(); ++j) - { - const separable_filter_type& filt = filters[i][j]; - max_val = std::max(max_val, max(abs(filt.first))); - max_val = std::max(max_val, max(abs(filt.second))); - } - if (max_val == 0) - max_val = 1; - - int_filters[i].resize(filters[i].size()); - for (unsigned long j = 0; j < filters[i].size(); ++j) - { - const separable_filter_type& filt = filters[i][j]; - int_filters[i][j].first = matrix_cast<int32>(round(filt.first*max_range/max_val)); - int_filters[i][j].second = matrix_cast<int32>(round(filt.second*max_range/max_val)); - } - } - - return int_filters; - } - -} - -// ---------------------------------------------------------------------------------------- - -#endif // DLIB_BUILD_SEPARABLE_PoLY_FILTERS_Hh_ - |