67 float RangeImageBorderExtractor::getNeighborDistanceChangeScore(
68 const RangeImageBorderExtractor::LocalSurface& local_surface,
69 int x,
int y,
int offset_x,
int offset_y,
int pixel_radius)
const
71 const PointWithRange& point = range_image_->
getPoint(x, y);
73 range_image_->
get1dPointAverage(x+offset_x, y+offset_y, offset_x, offset_y, pixel_radius, neighbor);
76 if (neighbor.range < 0.0f)
86 if (neighbor_distance_squared <= local_surface.max_neighbor_distance_squared)
88 float ret = 1.0f - sqrtf(local_surface.max_neighbor_distance_squared / neighbor_distance_squared);
89 if (neighbor.range < point.range)
120 bool RangeImageBorderExtractor::get3dDirection(
const BorderDescription& border_description, Eigen::Vector3f& direction,
121 const LocalSurface* local_surface)
123 const BorderTraits border_traits = border_description.traits;
125 int delta_x=0, delta_y=0;
135 if (delta_x==0 && delta_y==0)
138 int x=border_description.x, y=border_description.y;
139 const PointWithRange& point = range_image_->
getPoint(x, y);
140 Eigen::Vector3f neighbor_point;
141 range_image_->
calculate3DPoint(static_cast<float> (x+delta_x), static_cast<float> (y+delta_y), point.range, neighbor_point);
144 if (local_surface!=NULL)
147 Eigen::Vector3f sensor_pos = range_image_->
getSensorPos(),
148 viewing_direction = neighbor_point-sensor_pos;
150 float lambda = (local_surface->normal_no_jumps.dot(local_surface->neighborhood_mean_no_jumps-sensor_pos)/
151 local_surface->normal_no_jumps.dot(viewing_direction));
152 neighbor_point = lambda*viewing_direction + sensor_pos;
156 direction = neighbor_point-point.getVector3fMap();
157 direction.normalize();
162 void RangeImageBorderExtractor::calculateBorderDirection(
int x,
int y)
164 int index = y*range_image_->
width + x;
165 Eigen::Vector3f*& border_direction = border_directions_[index];
166 border_direction = NULL;
167 const BorderDescription& border_description = border_descriptions_->
points[index];
168 const BorderTraits& border_traits = border_description.traits;
171 border_direction =
new Eigen::Vector3f(0.0f, 0.0f, 0.0f);
172 if (!get3dDirection(border_description, *border_direction, surface_structure_[index]))
174 delete border_direction;
175 border_direction = NULL;
180 bool RangeImageBorderExtractor::changeScoreAccordingToShadowBorderValue(
int x,
int y,
int offset_x,
int offset_y,
float* border_scores,
181 float* border_scores_other_direction,
int& shadow_border_idx)
const
183 float& border_score = border_scores[y*range_image_->
width+x];
185 shadow_border_idx = -1;
189 if (border_score == 1.0f)
191 if (range_image_->
isMaxRange(x+offset_x, y+offset_y))
193 shadow_border_idx = (y+offset_y)*range_image_->
width + x+offset_x;
198 float best_shadow_border_score = 0.0f;
200 for (
int neighbor_distance=1; neighbor_distance<=parameters_.
pixel_radius_borders; ++neighbor_distance)
202 int neighbor_x=x+neighbor_distance*offset_x, neighbor_y=y+neighbor_distance*offset_y;
203 if (!range_image_->
isInImage(neighbor_x, neighbor_y))
205 float neighbor_shadow_border_score = border_scores_other_direction[neighbor_y*range_image_->
width+neighbor_x];
207 if (neighbor_shadow_border_score < best_shadow_border_score)
209 shadow_border_idx = neighbor_y*range_image_->
width + neighbor_x;
210 best_shadow_border_score = neighbor_shadow_border_score;
213 if (shadow_border_idx >= 0)
217 border_score *= (std::max)(0.9f, 1-powf(1+best_shadow_border_score, 3));
221 shadow_border_idx = -1;
226 float RangeImageBorderExtractor::updatedScoreAccordingToNeighborValues(
int x,
int y,
const float* border_scores)
const
228 float max_score_bonus = 0.5f;
230 float border_score = border_scores[y*range_image_->
width+x];
236 float average_neighbor_score=0.0f, weight_sum=0.0f;
237 for (
int y2=y-1; y2<=y+1; ++y2)
239 for (
int x2=x-1; x2<=x+1; ++x2)
241 if (!range_image_->
isInImage(x2, y2) || (x2==x&&y2==y))
243 average_neighbor_score += border_scores[y2*range_image_->
width+x2];
247 average_neighbor_score /=weight_sum;
249 if (average_neighbor_score*border_score < 0.0f)
252 float new_border_score = border_score + max_score_bonus * average_neighbor_score * (1.0f-fabsf(border_score));
255 return new_border_score;
258 bool RangeImageBorderExtractor::checkPotentialBorder(
int x,
int y,
int offset_x,
int offset_y,
float* border_scores,
259 float* border_scores_other_direction,
int& shadow_border_idx)
const
261 float& border_score = border_scores[y*range_image_->
width+x];
265 shadow_border_idx = -1;
268 for (
int neighbor_distance=1; neighbor_distance<=parameters_.
pixel_radius_borders; ++neighbor_distance)
270 int neighbor_x=x+neighbor_distance*offset_x, neighbor_y=y+neighbor_distance*offset_y;
271 if (!range_image_->
isInImage(neighbor_x, neighbor_y))
273 float neighbor_shadow_border_score = border_scores_other_direction[neighbor_y*range_image_->
width+neighbor_x];
275 if (neighbor_shadow_border_score < best_shadow_border_score)
277 shadow_border_idx = neighbor_y*range_image_->
width + neighbor_x;
278 best_shadow_border_score = neighbor_shadow_border_score;
281 if (shadow_border_idx >= 0)
289 bool RangeImageBorderExtractor::checkIfMaximum(
int x,
int y,
int offset_x,
int offset_y,
float* border_scores,
int shadow_border_idx)
const
291 float border_score = border_scores[y*range_image_->
width+x];
292 int neighbor_x=x-offset_x, neighbor_y=y-offset_y;
293 if (range_image_->
isInImage(neighbor_x, neighbor_y) && border_scores[neighbor_y*range_image_->
width+neighbor_x] > border_score)
296 for (
int neighbor_distance=1; neighbor_distance<=parameters_.
pixel_radius_borders; ++neighbor_distance)
298 neighbor_x=x+neighbor_distance*offset_x; neighbor_y=y+neighbor_distance*offset_y;
299 if (!range_image_->
isInImage(neighbor_x, neighbor_y))
301 int neighbor_index = neighbor_y*range_image_->
width + neighbor_x;
302 if (neighbor_index==shadow_border_idx)
305 float neighbor_border_score = border_scores[neighbor_index];
306 if (neighbor_border_score > border_score)
312 bool RangeImageBorderExtractor::calculateMainPrincipalCurvature(
int x,
int y,
int radius,
float& magnitude,
313 Eigen::Vector3f& main_direction)
const
316 int index = y*range_image_->
width+x;
317 LocalSurface* local_surface = surface_structure_[index];
318 if (local_surface==NULL)
327 for (
int step=1; step<=radius; ++step)
330 for (
int y2=y-step; y2<=y+step; y2+=step)
332 for (
int x2=x-step; x2<=x+step; x2+=step)
334 bool& beam_valid = beams_valid[beam_idx++];
347 if (!range_image_->
isValid(x2,y2))
350 int index2 = y2*range_image_->
width + x2;
360 LocalSurface* local_surface2 = surface_structure_[index2];
361 if (local_surface2==NULL)
366 vector_average.add(normal2);
371 if (vector_average.getNoOfSamples() < 3)
374 Eigen::Vector3f eigen_values, eigen_vector1, eigen_vector2;
375 vector_average.doPCA(eigen_values, eigen_vector1, eigen_vector2, main_direction);
376 magnitude = sqrtf(eigen_values[2]);