89 const int w =
static_cast<int> (input_->width) - half_window_size_;
90 const int h =
static_cast<int> (input_->height) - half_window_size_;
94#if OPENMP_LEGACY_CONST_DATA_SHARING_RULE
95#pragma omp parallel for \
99#pragma omp parallel for \
102 num_threads(threads_)
104 for(
int j = half_window_size_; j < h; ++j)
106 for(
int i = half_window_size_; i < w; ++i)
108 float center = intensity_ ((*input_) (i,j));
109 float up = intensity_ ((*input_) (i, j-half_window_size_));
110 float down = intensity_ ((*input_) (i, j+half_window_size_));
111 float left = intensity_ ((*input_) (i-half_window_size_, j));
112 float right = intensity_ ((*input_) (i+half_window_size_, j));
124 float d = std::min (
r1,
r2);
126 if (d < first_threshold_)
133 float B = std::min (
b1,
b2);
136 (*response_) (i,j) = ((
B < 0) && ((
B +
A) > 0)) ?
r1 - ((
B*
B)/
A) : d;
142#if OPENMP_LEGACY_CONST_DATA_SHARING_RULE
143#pragma omp parallel for \
145 num_threads(threads_)
147#pragma omp parallel for \
150 num_threads(threads_)
152 for(
int j = half_window_size_; j < h; ++j)
154 for(
int i = half_window_size_; i < w; ++i)
156 float center = intensity_ ((*input_) (i,j));
157 float up = intensity_ ((*input_) (i, j-half_window_size_));
158 float down = intensity_ ((*input_) (i, j+half_window_size_));
159 float left = intensity_ ((*input_) (i-half_window_size_, j));
160 float right = intensity_ ((*input_) (i+half_window_size_, j));
161 float upleft = intensity_ ((*input_) (i-half_window_size_, j-half_window_size_));
162 float upright = intensity_ ((*input_) (i+half_window_size_, j-half_window_size_));
163 float downleft = intensity_ ((*input_) (i-half_window_size_, j+half_window_size_));
164 float downright = intensity_ ((*input_) (i+half_window_size_, j+half_window_size_));
165 std::vector<float> r (4,0);
187 float d = *(std::min_element (r.begin (), r.end ()));
189 if (d < first_threshold_)
192 std::vector<float>
B (4,0);
193 std::vector<float>
A (4,0);
194 std::vector<float>
sumAB (4,0);
203 A[0] = r[1] - r[0] -
B[0] -
B[0];
204 A[1] = r[2] - r[1] -
B[1] -
B[1];
205 A[2] = r[3] - r[2] -
B[2] -
B[2];
206 A[3] = r[0] - r[3] -
B[3] -
B[3];
211 if ((*std::max_element (
B.begin (),
B.end ()) < 0) &&
212 (*std::min_element (
sumAB.begin (),
sumAB.end ()) > 0))
214 std::vector<float>
D (4,0);
215 D[0] =
B[0] *
B[0] /
A[0];
216 D[1] =
B[1] *
B[1] /
A[1];
217 D[2] =
B[2] *
B[2] /
A[2];
218 D[3] =
B[3] *
B[3] /
A[3];
219 (*response_) (i,j) = *(std::min (
D.begin (),
D.end ()));
222 (*response_) (i,j) = d;
229 std::sort (indices.begin (), indices.end (), [
this] (
int p1,
int p2) { return greaterCornernessAtIndices (p1, p2); });
232 output.reserve (input_->size ());
235 const int width (input_->width);
236 const int height (input_->height);
238#if OPENMP_LEGACY_CONST_DATA_SHARING_RULE
239#pragma omp parallel for \
241 shared(indices, occupency_map, output) \
242 num_threads(threads_)
244#pragma omp parallel for \
246 shared(height, indices, occupency_map, output, width) \
247 num_threads(threads_)
249 for (std::size_t i = 0; i < indices.
size (); ++i)
251 int idx = indices[i];
252 if (((*response_)[idx] < second_threshold_) ||
occupency_map[idx])
256 p.getVector3fMap () = (*input_)[idx].getVector3fMap ();
257 p.intensity = response_->points [idx];
262 keypoints_indices_->indices.push_back (idx);
265 const int x = idx % width;
266 const int y = idx / width;
267 const int u_end = std::min (width, x + half_window_size_);
268 const int v_end = std::min (height, y + half_window_size_);
269 for(
int v = std::max (0, y - half_window_size_); v < v_end; ++v)
270 for(
int u = std::max (0, x - half_window_size_); u <
u_end; ++u)
277 output.is_dense = input_->is_dense;