summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/image_keypoint/fine_hog_image.h
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/image_keypoint/fine_hog_image.h')
-rw-r--r--ml/dlib/dlib/image_keypoint/fine_hog_image.h378
1 files changed, 0 insertions, 378 deletions
diff --git a/ml/dlib/dlib/image_keypoint/fine_hog_image.h b/ml/dlib/dlib/image_keypoint/fine_hog_image.h
deleted file mode 100644
index a421ffe7c..000000000
--- a/ml/dlib/dlib/image_keypoint/fine_hog_image.h
+++ /dev/null
@@ -1,378 +0,0 @@
-// Copyright (C) 2012 Davis E. King (davis@dlib.net)
-// License: Boost Software License See LICENSE.txt for the full license.
-#ifndef DLIB_FINE_HOG_IMaGE_Hh_
-#define DLIB_FINE_HOG_IMaGE_Hh_
-
-#include "fine_hog_image_abstract.h"
-#include "../array2d.h"
-#include "../matrix.h"
-#include "hog.h"
-
-
-namespace dlib
-{
- template <
- unsigned long cell_size_,
- unsigned long block_size_,
- unsigned long pixel_stride_,
- unsigned char num_orientation_bins_,
- int gradient_type_
- >
- class fine_hog_image : noncopyable
- {
- COMPILE_TIME_ASSERT(cell_size_ > 1);
- COMPILE_TIME_ASSERT(block_size_ > 0);
- COMPILE_TIME_ASSERT(pixel_stride_ > 0);
- COMPILE_TIME_ASSERT(num_orientation_bins_ > 0);
-
- COMPILE_TIME_ASSERT( gradient_type_ == hog_signed_gradient ||
- gradient_type_ == hog_unsigned_gradient);
-
-
- public:
-
- const static unsigned long cell_size = cell_size_;
- const static unsigned long block_size = block_size_;
- const static unsigned long pixel_stride = pixel_stride_;
- const static unsigned long num_orientation_bins = num_orientation_bins_;
- const static int gradient_type = gradient_type_;
-
- const static long min_size = cell_size*block_size+2;
-
- typedef matrix<double, block_size*block_size*num_orientation_bins, 1> descriptor_type;
-
- fine_hog_image (
- ) :
- num_block_rows(0),
- num_block_cols(0)
- {}
-
- void clear (
- )
- {
- num_block_rows = 0;
- num_block_cols = 0;
- hist_counts.clear();
- }
-
- void copy_configuration (
- const fine_hog_image&
- ){}
-
- template <
- typename image_type
- >
- inline void load (
- const image_type& img
- )
- {
- COMPILE_TIME_ASSERT( pixel_traits<typename image_traits<image_type>::pixel_type>::has_alpha == false );
- load_impl(mat(img));
- }
-
- inline void unload(
- ) { clear(); }
-
- inline size_t size (
- ) const { return static_cast<size_t>(nr()*nc()); }
-
- inline long nr (
- ) const { return num_block_rows; }
-
- inline long nc (
- ) const { return num_block_cols; }
-
- long get_num_dimensions (
- ) const
- {
- return block_size*block_size*num_orientation_bins;
- }
-
- inline const descriptor_type& 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 fine_hog_image::operator()()"
- << "\n\t invalid row or col argument"
- << "\n\t row: " << row
- << "\n\t col: " << col
- << "\n\t nr(): " << nr()
- << "\n\t nc(): " << nc()
- << "\n\t this: " << this
- );
-
- row *= pixel_stride;
- col *= pixel_stride;
-
- des = 0;
- unsigned long off = 0;
- for (unsigned long r = 0; r < block_size; ++r)
- {
- for (unsigned long c = 0; c < block_size; ++c)
- {
- for (unsigned long rr = 0; rr < cell_size; ++rr)
- {
- for (unsigned long cc = 0; cc < cell_size; ++cc)
- {
- const histogram_count& hist = hist_counts[row + r*cell_size + rr][col + c*cell_size + cc];
- des(off + hist.quantized_angle_lower) += hist.lower_strength;
- des(off + hist.quantized_angle_upper) += hist.upper_strength;
- }
- }
-
- off += num_orientation_bins;
- }
- }
-
- des /= length(des) + 1e-8;
-
- return des;
- }
-
- const rectangle get_block_rect (
- long row,
- long col
- ) const
- {
- row *= pixel_stride;
- col *= pixel_stride;
-
- // do this to account for the 1 pixel padding we use all around the image
- ++row;
- ++col;
-
- return rectangle(col, row, col+cell_size*block_size-1, row+cell_size*block_size-1);
- }
-
- const point image_to_feat_space (
- const point& p
- ) const
- {
- const long border_size = 1 + cell_size*block_size/2;
- return (p-point(border_size,border_size))/(long)pixel_stride;
- }
-
- const rectangle image_to_feat_space (
- const rectangle& rect
- ) const
- {
- return rectangle(image_to_feat_space(rect.tl_corner()), image_to_feat_space(rect.br_corner()));
- }
-
- const point feat_to_image_space (
- const point& p
- ) const
- {
- const long border_size = 1 + cell_size*block_size/2;
- return p*(long)pixel_stride + point(border_size,border_size);
- }
-
- const rectangle feat_to_image_space (
- const rectangle& rect
- ) const
- {
- return rectangle(feat_to_image_space(rect.tl_corner()), feat_to_image_space(rect.br_corner()));
- }
-
-
-
- // these _PRIVATE_ functions are only here as a workaround for a bug in visual studio 2005.
- void _PRIVATE_serialize (std::ostream& out) const
- {
- // serialize hist_counts
- serialize(hist_counts.nc(),out);
- serialize(hist_counts.nr(),out);
- hist_counts.reset();
- while (hist_counts.move_next())
- hist_counts.element().serialize(out);
- hist_counts.reset();
-
-
- serialize(num_block_rows, out);
- serialize(num_block_cols, out);
- }
-
- void _PRIVATE_deserialize (std::istream& in )
- {
- // deserialize item.hist_counts
- long nc, nr;
- deserialize(nc,in);
- deserialize(nr,in);
- hist_counts.set_size(nr,nc);
- while (hist_counts.move_next())
- hist_counts.element().deserialize(in);
- hist_counts.reset();
-
-
- deserialize(num_block_rows, in);
- deserialize(num_block_cols, in);
- }
-
- private:
-
- template <
- typename image_type
- >
- void load_impl (
- const image_type& img
- )
- {
- // Note that we keep a border of 1 pixel all around the image so that we don't have
- // to worry about running outside the image when computing the horizontal and vertical
- // gradients.
-
-
-
- // check if the window is just too small
- if (img.nr() < min_size || img.nc() < min_size)
- {
- // If the image is smaller than our windows then there aren't any descriptors at all!
- num_block_rows = 0;
- num_block_cols = 0;
- hist_counts.clear();
- return;
- }
-
- hist_counts.set_size(img.nr()-2, img.nc()-2);
-
-
-
-
- for (long r = 0; r < hist_counts.nr(); ++r)
- {
- for (long c = 0; c < hist_counts.nc(); ++c)
- {
- unsigned long left;
- unsigned long right;
- unsigned long top;
- unsigned long bottom;
-
- assign_pixel(left, img(r+1,c));
- assign_pixel(right, img(r+1,c+2));
- assign_pixel(top, img(r ,c+1));
- assign_pixel(bottom, img(r+2,c+1));
-
- double grad_x = (long)right-(long)left;
- double grad_y = (long)top-(long)bottom;
-
- // obtain the angle of the gradient. Make sure it is scaled between 0 and 1.
- double angle = std::max(0.0, std::atan2(grad_y, grad_x)/pi + 1)/2;
-
-
- if (gradient_type == hog_unsigned_gradient)
- {
- angle *= 2;
- if (angle >= 1)
- angle -= 1;
- }
-
-
- // now scale angle to between 0 and num_orientation_bins
- angle *= num_orientation_bins;
-
-
- const double strength = std::sqrt(grad_y*grad_y + grad_x*grad_x);
-
-
- unsigned char quantized_angle_lower = static_cast<unsigned char>(std::floor(angle));
- unsigned char quantized_angle_upper = static_cast<unsigned char>(std::ceil(angle));
-
- quantized_angle_lower %= num_orientation_bins;
- quantized_angle_upper %= num_orientation_bins;
-
- const double angle_split = (angle-std::floor(angle));
- const double upper_strength = angle_split*strength;
- const double lower_strength = (1-angle_split)*strength;
-
- // Stick into gradient counts. Note that we linearly interpolate between neighboring
- // histogram buckets.
- hist_counts[r][c].quantized_angle_lower = quantized_angle_lower;
- hist_counts[r][c].quantized_angle_upper = quantized_angle_upper;
- hist_counts[r][c].lower_strength = lower_strength;
- hist_counts[r][c].upper_strength = upper_strength;
-
- }
- }
-
-
- // Now figure out how many feature extraction blocks we should have.
- num_block_rows = (hist_counts.nr() - block_size*cell_size + 1)/(long)pixel_stride;
- num_block_cols = (hist_counts.nc() - block_size*cell_size + 1)/(long)pixel_stride;
-
- }
-
- struct histogram_count
- {
- unsigned char quantized_angle_lower;
- unsigned char quantized_angle_upper;
- float lower_strength;
- float upper_strength;
-
- void serialize(std::ostream& out) const
- {
- dlib::serialize(quantized_angle_lower, out);
- dlib::serialize(quantized_angle_upper, out);
- dlib::serialize(lower_strength, out);
- dlib::serialize(upper_strength, out);
- }
- void deserialize(std::istream& in)
- {
- dlib::deserialize(quantized_angle_lower, in);
- dlib::deserialize(quantized_angle_upper, in);
- dlib::deserialize(lower_strength, in);
- dlib::deserialize(upper_strength, in);
- }
- };
-
- array2d<histogram_count> hist_counts;
-
- mutable descriptor_type des;
-
- long num_block_rows;
- long num_block_cols;
-
-
- };
-
-// ----------------------------------------------------------------------------------------
-
- template <
- unsigned long T1,
- unsigned long T2,
- unsigned long T3,
- unsigned char T4,
- int T5
- >
- void serialize (
- const fine_hog_image<T1,T2,T3,T4,T5>& item,
- std::ostream& out
- )
- {
- item._PRIVATE_serialize(out);
- }
-
- template <
- unsigned long T1,
- unsigned long T2,
- unsigned long T3,
- unsigned char T4,
- int T5
- >
- void deserialize (
- fine_hog_image<T1,T2,T3,T4,T5>& item,
- std::istream& in
- )
- {
- item._PRIVATE_deserialize(in);
- }
-
-// ----------------------------------------------------------------------------------------
-
-}
-
-#endif // DLIB_FINE_HOG_IMaGE_Hh_
-