108 static const int width =
static_cast<int> (input_->width);
109 static const int height =
static_cast<int> (input_->height);
111 int x =
static_cast<int> (index % input_->width);
112 int y =
static_cast<int> (index / input_->width);
115 memset (coefficients, 0,
sizeof (
float) * 3);
117 int endx = std::min (width, x + half_window_width_);
118 int endy = std::min (height, y + half_window_height_);
119 for (
int xx = std::max (0, x - half_window_width_);
xx <
endx; ++
xx)
120 for (
int yy = std::max (0, y - half_window_height_);
yy <
endy; ++
yy)
122 const float& ix = derivatives_rows_ (
xx,
yy);
123 const float& iy = derivatives_cols_ (
xx,
yy);
124 coefficients[0]+= ix * ix;
125 coefficients[1]+= ix * iy;
126 coefficients[2]+= iy * iy;
180 derivatives_cols_.resize (input_->width, input_->height);
181 derivatives_rows_.resize (input_->width, input_->height);
184 int w =
static_cast<int> (input_->width) - 1;
185 int h =
static_cast<int> (input_->height) - 1;
188 derivatives_cols_(0,0) = (intensity_ ((*input_) (0,1)) - intensity_ ((*input_) (0,0))) * 0.5;
189 derivatives_rows_(0,0) = (intensity_ ((*input_) (1,0)) - intensity_ ((*input_) (0,0))) * 0.5;
191 for(
int i = 1; i < w; ++i)
193 derivatives_cols_(i,0) = (intensity_ ((*input_) (i,1)) - intensity_ ((*input_) (i,0))) * 0.5;
196 derivatives_rows_(w,0) = (intensity_ ((*input_) (w,0)) - intensity_ ((*input_) (w-1,0))) * 0.5;
197 derivatives_cols_(w,0) = (intensity_ ((*input_) (w,1)) - intensity_ ((*input_) (w,0))) * 0.5;
199 for(
int j = 1; j < h; ++j)
202 derivatives_rows_(0,j) = (intensity_ ((*input_) (1,j)) - intensity_ ((*input_) (0,j))) * 0.5;
203 for(
int i = 1; i < w; ++i)
206 derivatives_rows_(i,j) = (intensity_ ((*input_) (i+1,j)) - intensity_ ((*input_) (i-1,j))) * 0.5;
209 derivatives_cols_(i,j) = (intensity_ ((*input_) (i,j+1)) - intensity_ ((*input_) (i,j-1))) * 0.5;
212 derivatives_rows_(w,j) = (intensity_ ((*input_) (w,j)) - intensity_ ((*input_) (w-1,j))) * 0.5;
216 derivatives_cols_(0,h) = (intensity_ ((*input_) (0,h)) - intensity_ ((*input_) (0,h-1))) * 0.5;
217 derivatives_rows_(0,h) = (intensity_ ((*input_) (1,h)) - intensity_ ((*input_) (0,h))) * 0.5;
219 for(
int i = 1; i < w; ++i)
221 derivatives_cols_(i,h) = (intensity_ ((*input_) (i,h)) - intensity_ ((*input_) (i,h-1))) * 0.5;
223 derivatives_rows_(w,h) = (intensity_ ((*input_) (w,h)) - intensity_ ((*input_) (w-1,h))) * 0.5;
224 derivatives_cols_(w,h) = (intensity_ ((*input_) (w,h)) - intensity_ ((*input_) (w,h-1))) * 0.5;
229 responseHarris(*response_);
232 responseNoble(*response_);
235 responseLowe(*response_);
238 responseTomasi(*response_);
245 for (std::size_t i = 0; i < response_->size (); ++i)
246 keypoints_indices_->indices.push_back (i);
250 std::sort (indices_->begin (), indices_->end (), [
this] (
int p1,
int p2) { return greaterIntensityAtIndices (p1, p2); });
251 const float threshold = threshold_ * (*response_)[indices_->front ()].intensity;
253 output.reserve (response_->size());
255 int width (response_->width);
256 int height (response_->height);
259#if OPENMP_LEGACY_CONST_DATA_SHARING_RULE
260#pragma omp parallel for \
262 shared(occupency_map, output) \
263 firstprivate(width, height) \
264 num_threads(threads_)
266#pragma omp parallel for \
268 shared(occupency_map, occupency_map_size, output, threshold) \
269 firstprivate(width, height) \
270 num_threads(threads_)
274 int idx = indices_->at (i);
282 keypoints_indices_->indices.push_back (idx);
285 int u_end = std::min (width, idx % width + min_distance_);
286 int v_end = std::min (height, idx / width + min_distance_);
287 for(
int u = std::max (0, idx % width - min_distance_); u <
u_end; ++u)
288 for(
int v = std::max (0, idx / width - min_distance_); v < v_end; ++v)
300 output.is_dense = input_->is_dense;