14 #include <Eigen/Dense> 29 profiler,
"internal_computeSpinImageDescriptors");
31 ASSERT_(options.SpinImagesOptions.radius > 1);
39 const unsigned int HIST_N_INT =
40 options.SpinImagesOptions.hist_size_intensity;
41 const unsigned int HIST_N_DIS =
42 options.SpinImagesOptions.hist_size_distance;
43 const unsigned int R = options.SpinImagesOptions.radius;
44 const int img_w =
static_cast<int>(in_img.
getWidth());
45 const int img_h =
static_cast<int>(in_img.
getHeight());
46 const bool img_color = in_img.
isColor();
50 const float k_int2idx = (HIST_N_INT - 1) / 255.0f;
51 const float k_idx2int = 1.0f / k_int2idx;
55 const float k_dis2idx = (HIST_N_DIS - 1) /
d2f(
R);
56 const float k_idx2dis = 1.0f / k_dis2idx;
60 const int STD_TIMES = 2;
61 const int kernel_size_dist =
static_cast<int>(
62 ceil(k_dis2idx * STD_TIMES * options.SpinImagesOptions.std_dist));
64 const float _2var_int =
65 -1.0f / (2 *
square(options.SpinImagesOptions.std_intensity));
66 const float _2var_dist =
67 -1.0f / (2 *
square(options.SpinImagesOptions.std_dist));
73 for (
auto& in_feature : in_features)
76 in_feature.keypoint.octave = options.SpinImagesOptions.radius;
83 int px0 =
round(in_feature.keypoint.pt.x -
R);
84 int px1 =
round(in_feature.keypoint.pt.x +
R);
85 int py0 =
round(in_feature.keypoint.pt.y -
R);
86 int py1 =
round(in_feature.keypoint.pt.y +
R);
90 px1 = min(img_w - 1, px1);
92 py1 = min(img_h - 1, py1);
94 for (
int px = px0; px <= px1; px++)
96 for (
int py = py0; py <= py1; py++)
101 pix_val = in_img.
at<uint8_t>(px, py);
104 auto aux_pix_ptr = in_img.
ptr<uint8_t>(px, py);
106 (aux_pix_ptr[0] + aux_pix_ptr[1] + aux_pix_ptr[2]) / 3;
109 const float pix_dist = hypot(
110 in_feature.keypoint.pt.x - px,
111 in_feature.keypoint.pt.y - py);
112 const int center_bin_dist = k_dis2idx * pix_dist;
125 const int bin_int_low =
126 max(0, static_cast<int>(ceil(
130 options.SpinImagesOptions.std_intensity))));
131 const int bin_int_hi =
132 min(static_cast<int>(HIST_N_INT - 1),
133 static_cast<int>(ceil(
137 options.SpinImagesOptions.std_intensity))));
141 if (center_bin_dist <
142 static_cast<int>(HIST_N_DIS))
147 const int bin_dist_low =
148 max(0, center_bin_dist - kernel_size_dist);
149 const int bin_dist_hi =
150 min(static_cast<int>(HIST_N_DIS - 1),
151 center_bin_dist + kernel_size_dist);
153 int bin_dist, bin_int;
154 float pix_dist_cur_dist =
155 pix_dist - bin_dist_low * k_idx2dis;
157 for (bin_dist = bin_dist_low; bin_dist <= bin_dist_hi;
158 bin_dist++, pix_dist_cur_dist -= k_idx2dis)
160 float pix_val_cur_val =
161 pix_val - (bin_int_low * k_idx2int);
163 for (bin_int = bin_int_low; bin_int <= bin_int_hi;
164 bin_int++, pix_val_cur_val -= k_idx2int)
167 double v = _2var_dist *
square(pix_dist_cur_dist) +
168 _2var_int *
square(pix_val_cur_val);
170 hist2d(bin_int, bin_dist) += exp(v);
184 in_feature.descriptors.SpinImg.emplace();
185 std::vector<float>& ptr_trg = *in_feature.descriptors.SpinImg;
186 ptr_trg.resize(HIST_N_INT * HIST_N_DIS);
188 for (
unsigned i = 0; i < HIST_N_DIS; i++)
189 for (
unsigned j = 0; j < HIST_N_INT; j++)
190 ptr_trg[idx++] = hist2d(j, i);
192 in_feature.descriptors.SpinImg_range_rows = HIST_N_DIS;
A safe way to call enter() and leave() of a mrpt::system::CTimeLogger upon construction and destructi...
size_t getHeight() const override
Returns the height of the image in pixels.
This file implements miscelaneous matrix and matrix/vector operations, and internal functions in mrpt...
const T & at(unsigned int col, unsigned int row, unsigned int channel=0) const
Access to pixels without checking boundaries, and doing a reinterpret_cast<> of the data as the given...
#define ASSERT_(f)
Defines an assertion mechanism.
float d2f(const double d)
shortcut for static_cast<float>(double)
This base provides a set of functions for maths stuff.
size_t getWidth() const override
Returns the width of the image in pixels.
void normalize(CONTAINER &c, Scalar valMin, Scalar valMax)
Scales all elements such as the minimum & maximum values are shifted to the given values...
Classes for computer vision, detectors, features, etc.
A list of visual features, to be used as output by detectors, as input/output by trackers, etc.
return_t square(const num_t x)
Inline function for the square of a number.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
bool isColor() const
Returns true if the image is RGB, false if it is grayscale.
const T * ptr(unsigned int col, unsigned int row, unsigned int channel=0) const
Returns a pointer to a given pixel, without checking for boundaries.
A class for storing images as grayscale or RGB bitmaps.
int round(const T value)
Returns the closer integer (int) to x.