summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/image_keypoint/nearest_neighbor_feature_image.h
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/image_keypoint/nearest_neighbor_feature_image.h')
-rw-r--r--ml/dlib/dlib/image_keypoint/nearest_neighbor_feature_image.h408
1 files changed, 408 insertions, 0 deletions
diff --git a/ml/dlib/dlib/image_keypoint/nearest_neighbor_feature_image.h b/ml/dlib/dlib/image_keypoint/nearest_neighbor_feature_image.h
new file mode 100644
index 000000000..2ee45da2f
--- /dev/null
+++ b/ml/dlib/dlib/image_keypoint/nearest_neighbor_feature_image.h
@@ -0,0 +1,408 @@
+// Copyright (C) 2011 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#ifndef DLIB_NEAREST_NEIGHBOR_FeATURE_IMAGE_Hh_
+#define DLIB_NEAREST_NEIGHBOR_FeATURE_IMAGE_Hh_
+
+#include "nearest_neighbor_feature_image_abstract.h"
+#include <vector>
+#include "../algs.h"
+#include "../matrix.h"
+#include "../statistics.h"
+
+namespace dlib
+{
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ class nearest_neighbor_feature_image : noncopyable
+ {
+ /*!
+ INITIAL VALUE
+ - nn_feats.size() == 1
+
+ CONVENTION
+ - nn_feats.size() == 1
+
+ !*/
+
+ public:
+
+ typedef std::vector<std::pair<unsigned int,double> > descriptor_type;
+
+ nearest_neighbor_feature_image (
+ );
+
+ void clear (
+ );
+
+ void copy_configuration (
+ const feature_extractor& item
+ );
+
+ void copy_configuration (
+ const nearest_neighbor_feature_image& item
+ );
+
+ template <
+ typename image_type
+ >
+ inline void load (
+ const image_type& img
+ );
+
+ inline size_t size (
+ ) const;
+
+ inline long nr (
+ ) const;
+
+ inline long nc (
+ ) const;
+
+ inline long get_num_dimensions (
+ ) const;
+
+ template <typename vector_type>
+ void set_basis (
+ const vector_type& new_basis
+ );
+
+ inline const descriptor_type& operator() (
+ long row,
+ long col
+ ) const;
+
+ inline const rectangle get_block_rect (
+ long row,
+ long col
+ ) const;
+
+ inline const point image_to_feat_space (
+ const point& p
+ ) const;
+
+ inline const rectangle image_to_feat_space (
+ const rectangle& rect
+ ) const;
+
+ inline const point feat_to_image_space (
+ const point& p
+ ) const;
+
+ inline const rectangle feat_to_image_space (
+ const rectangle& rect
+ ) const;
+
+ template <typename T>
+ friend void serialize (
+ const nearest_neighbor_feature_image<T>& item,
+ std::ostream& out
+ );
+
+ template <typename T>
+ friend void deserialize (
+ nearest_neighbor_feature_image<T>& item,
+ std::istream& in
+ );
+
+ private:
+
+ array2d<unsigned long> feats;
+ feature_extractor fe;
+ std::vector<typename feature_extractor::descriptor_type> basis;
+
+ // This is a transient variable. It is just here so it doesn't have to be
+ // reallocated over and over inside operator()
+ mutable descriptor_type nn_feats;
+
+ };
+
+// ----------------------------------------------------------------------------------------
+
+ template <typename T>
+ void serialize (
+ const nearest_neighbor_feature_image<T>& item,
+ std::ostream& out
+ )
+ {
+ serialize(item.feats, out);
+ serialize(item.fe, out);
+ serialize(item.basis, out);
+ }
+
+ template <typename T>
+ void deserialize (
+ nearest_neighbor_feature_image<T>& item,
+ std::istream& in
+ )
+ {
+ deserialize(item.feats, in);
+ deserialize(item.fe, in);
+ deserialize(item.basis, in);
+ }
+
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+// nearest_neighbor_feature_image member functions
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ nearest_neighbor_feature_image<feature_extractor>::
+ nearest_neighbor_feature_image (
+ )
+ {
+ nn_feats.resize(1);
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ void nearest_neighbor_feature_image<feature_extractor>::
+ clear (
+ )
+ {
+ feats.clear();
+ fe.clear();
+ basis.clear();
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ void nearest_neighbor_feature_image<feature_extractor>::
+ copy_configuration (
+ const feature_extractor& item
+ )
+ {
+ fe.copy_configuration(item);
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ void nearest_neighbor_feature_image<feature_extractor>::
+ copy_configuration (
+ const nearest_neighbor_feature_image& item
+ )
+ {
+ fe.copy_configuration(item.fe);
+ basis = item.basis;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ template <
+ typename image_type
+ >
+ void nearest_neighbor_feature_image<feature_extractor>::
+ load (
+ const image_type& img
+ )
+ {
+ fe.load(img);
+
+ feats.set_size(fe.nr(), fe.nc());
+
+ // find the nearest neighbor for each feature vector and store the
+ // result in feats.
+ for (long r = 0; r < feats.nr(); ++r)
+ {
+ for (long c = 0; c < feats.nc(); ++c)
+ {
+ const typename feature_extractor::descriptor_type& local_feat = fe(r,c);
+
+ double best_dist = std::numeric_limits<double>::infinity();
+ unsigned long best_idx = 0;
+ for (unsigned long i = 0; i < basis.size(); ++i)
+ {
+ double dist = length_squared(local_feat - basis[i]);
+ if (dist < best_dist)
+ {
+ best_dist = dist;
+ best_idx = i;
+ }
+ }
+
+ feats[r][c] = best_idx;
+ }
+ }
+
+ fe.unload();
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ size_t nearest_neighbor_feature_image<feature_extractor>::
+ size (
+ ) const
+ {
+ return feats.size();
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ long nearest_neighbor_feature_image<feature_extractor>::
+ nr (
+ ) const
+ {
+ return feats.nr();
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ long nearest_neighbor_feature_image<feature_extractor>::
+ nc (
+ ) const
+ {
+ return feats.nc();
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ long nearest_neighbor_feature_image<feature_extractor>::
+ get_num_dimensions (
+ ) const
+ {
+ return basis.size();
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <typename feature_extractor>
+ template <typename vector_type>
+ void nearest_neighbor_feature_image<feature_extractor>::
+ set_basis (
+ const vector_type& new_basis
+ )
+ {
+ basis.assign(new_basis.begin(), new_basis.end());
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ const typename nearest_neighbor_feature_image<feature_extractor>::descriptor_type&
+ nearest_neighbor_feature_image<feature_extractor>::
+ operator() (
+ long row,
+ long col
+ ) const
+ {
+ // make sure requires clause is not broken
+ DLIB_ASSERT(0 <= row && row < nr() &&
+ 0 <= col && col < nc(),
+ "\t descriptor_type nearest_neighbor_feature_image::operator(row,col)"
+ << "\n\t Invalid inputs were given to this function"
+ << "\n\t row: " << row
+ << "\n\t col: " << col
+ << "\n\t nr(): " << nr()
+ << "\n\t nc(): " << nc()
+ << "\n\t this: " << this
+ );
+
+ nn_feats[0] = std::make_pair(feats[row][col],1);
+ return nn_feats;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ const rectangle nearest_neighbor_feature_image<feature_extractor>::
+ get_block_rect (
+ long row,
+ long col
+ ) const
+ {
+ return fe.get_block_rect(row,col);
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ const point nearest_neighbor_feature_image<feature_extractor>::
+ image_to_feat_space (
+ const point& p
+ ) const
+ {
+ return fe.image_to_feat_space(p);
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ const rectangle nearest_neighbor_feature_image<feature_extractor>::
+ image_to_feat_space (
+ const rectangle& rect
+ ) const
+ {
+ return fe.image_to_feat_space(rect);
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ const point nearest_neighbor_feature_image<feature_extractor>::
+ feat_to_image_space (
+ const point& p
+ ) const
+ {
+ return fe.feat_to_image_space(p);
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename feature_extractor
+ >
+ const rectangle nearest_neighbor_feature_image<feature_extractor>::
+ feat_to_image_space (
+ const rectangle& rect
+ ) const
+ {
+ return fe.feat_to_image_space(rect);
+ }
+
+// ----------------------------------------------------------------------------------------
+
+}
+
+#endif // DLIB_NEAREST_NEIGHBOR_FeATURE_IMAGE_Hh_
+
+