KJB
|
This class computes the position of the three vanishing points from a set of line segments. The ass. More...
#include <vanishing_point_detector.h>
Public Types | |
enum | { VPD_HORIZONTAL_VP_1 = 0, VPD_HORIZONTAL_VP_2, VPD_VERTICAL_VP, VPD_OUTLIER } |
Public Member Functions | |
Vanishing_point_detector (const Edge_segment_set &iset, unsigned int img_rows, unsigned int img_cols, double vertical_threshold=VPD_VERTICAL_THRESHOLD, double max_line_segment_fitting_error=VPD_MAX_LINE_SEGMENT_FITTING_ERROR, double ivpts_tolerance=VPD_MAX_PRINCIPAL_POINT_POSITION_TOLERANCE) | |
Vanishing_point_detector (const Line_segment_set &iset, unsigned int img_rows, unsigned int img_cols, double vertical_threshold=VPD_VERTICAL_THRESHOLD, double ivpts_tolerance=VPD_MAX_PRINCIPAL_POINT_POSITION_TOLERANCE) | |
Vanishing_point_detector (const Vanishing_point_detector &src) | |
Vanishing_point_detector & | operator= (const Vanishing_point_detector &src) |
~Vanishing_point_detector () | |
void | init_from_edge_segment_set (const Edge_segment_set &iset, double vertical_threshold, double max_line_segment_fitting_error) |
Inits the edge segment that will be used to estimate the vanishing points. More... | |
void | init_from_edge_segment_set (const Line_segment_set &iset, double vertical_threshold) |
Inits the edge segment that will be used to estimate the vanishing points. More... | |
double | compute_ransac_penalty (double outlier_threshold, unsigned int *total_number_of_outliers, const Vanishing_point &vp1, const Vanishing_point &vp2) |
Computes the RANSAC penalty for the horizontal segments given the input horizontal vanishing points. More... | |
double | jointly_compute_ransac_penalty (double outlier_threshold, double *total_number_of_outliers, double max_outliers_ratio, const Vanishing_point &vp1, const Vanishing_point &vp2, const Vanishing_point &vp3) |
Computes the RANSAC penalty for all segments given the three vanishing points. More... | |
double | groundtruth_compute_ransac_penalty (double outlier_threshold, int *total_number_of_outliers, const Line_segment_set &vertical_bucket, const Line_segment_set &horizontal_bucket1, const Line_segment_set &horizontal_bucket2, const Vanishing_point &vp1, const Vanishing_point &vp2, const Vanishing_point &vp3) |
double | compute_vertical_ransac_penalty (double outlier_threshold, unsigned int *total_number_of_outliers, const Vanishing_point &vertical_vp) |
Computes the RANSAC penalty for the vertical segments given the input vertical vanishing point. More... | |
bool | check_vpts_consistency (const Vanishing_point &vp1, const Vanishing_point &vp2, const Vanishing_point &vertical_vp, double &focal_length) |
Checks that a set of three vanishing points is consistent. It checks that for each pair of vanishing points (v1, v2) v1'*w*v2 equals to zero, where w is the absolute conic. It then retrieves the principal point and focal length from W and tests that the principal point is not too far from the image centre and the focal length is positive. Returns false if any of these checks fails. More... | |
bool | groundtruth_check_vpts_consistency (const Vanishing_point &vp1, const Vanishing_point &vp2, const Vanishing_point &vertical_vp, double &ifocal_length, double &opx, double &opy) |
bool | relaxed_check_vpts_consistency (const Vanishing_point &vp1, const Vanishing_point &vp2, const Vanishing_point &vertical_vp, double &focal_length) |
Checks that a set of three vanishing points is consistent, using basic geometric constraints. For a more thourough check use check_vpts_consistency. More... | |
double | find_vpts_with_ransac (double success_probability, double outlier_threshold, double max_outliers_ratio, std::vector< Vanishing_point > &vpts, double vertical_vp_outlier_threshold=VPD_VERTICAL_VP_OUTLIER_THRESHOLD, double vertical_vp_max_outliers_ratio=VPD_VERTICAL_VP_MAX_OUTLIERS_RATIO) |
Finds an estimate for all three vanishing points using RANSAC. More... | |
bool | find_vertical_vp_with_ransac (double success_probability, double outlier_threshold, double max_outliers_ratio, Vanishing_point &vp) |
Finds an estimate for the vertical vanishing point. More... | |
bool | find_horizontal_vanishing_vpts_with_ransac (double success_probability, double outlier_threshold, double max_outliers_ratio, const Vanishing_point &vertical_vp, Vanishing_point &vp1, Vanishing_point &vp2) |
Finds an estimate for the two horizontal vanishing points. IMPORTANT: It relies on the current estimate of the vertical vanishing point. More... | |
double | jointly_find_vpts_with_ransac (double success_probability, double outlier_threshold, double max_outliers_ratio, std::vector< Vanishing_point > &vpts) |
Finds an estimate of the three vanishing points at once. More... | |
double | find_vpts_from_groundtruth_assignments (double outlier_threshold, const Line_segment_set &vertical_bucket, const Line_segment_set &horizontal_bucket1, const Line_segment_set &horizontal_bucket2, std::vector< Vanishing_point > &vpts) |
bool | get_use_relaxed_checks () const |
Sets the type of geometric constraints to be used. More... | |
void | set_use_relaxed_checks (bool icheck) |
Returns true if realxed checks are used. More... | |
double | compute_focal_length (const std::vector< Vanishing_point > &v_pts) |
Computes the focal length from the vanishing points position. More... | |
bool | guess_horizontal_vpts_from_two_segments (Vanishing_point &vp1, Vanishing_point &vp2) |
bool | guess_horizontal_vpts_from_three_segments (Vanishing_point &vp1, Vanishing_point &vp2) |
int | get_tot_num_segments () |
void | set_vpts_tolerance (double ivpts_tolerance) |
double | geometric_find_vpts_with_ransac (double success_probability, double outlier_threshold, double max_outliers_ratio, std::vector< Vanishing_point > &vpts) |
double | get_best_focal () |
int | get_num_vertical_segments () const |
Static Public Member Functions | |
static double | compute_alpha (const kjb::Vanishing_point &vp, const Line_segment *line) |
Compute the angle between the line segment and the line through the vanishing point and the line segment mid point. More... | |
static void | sample_n_from_m_without_repetitions (unsigned int n, unsigned int m, Int_vector &iv) |
samples n integers without repetitions from the set [0,m] More... | |
Public Attributes | |
enum kjb::Vanishing_point_detector:: { ... } | Vanishing_point_index |
This class computes the position of the three vanishing points from a set of line segments. The ass.
|
inline |
|
inline |
|
inline |
|
inline |
bool Vanishing_point_detector::check_vpts_consistency | ( | const Vanishing_point & | vp1, |
const Vanishing_point & | vp2, | ||
const Vanishing_point & | vertical_vp, | ||
double & | ifocal_length | ||
) |
Checks that a set of three vanishing points is consistent. It checks that for each pair of vanishing points (v1, v2) v1'*w*v2 equals to zero, where w is the absolute conic. It then retrieves the principal point and focal length from W and tests that the principal point is not too far from the image centre and the focal length is positive. Returns false if any of these checks fails.
Checks that a set of three vanishing points is consistent. It checks that for each pair of vanishing points (v1, v2) v1'*w*v2 equals to zero, where w is the absolute conic. It then retrieves the principal point and focal length from W and tests that the principal point is not too far from the image centre and the focal length is positive. Returns false if any of these checks fails.
vp1 | the first horizontal vanishing point |
vp2 | the second horizontal vanishing point |
vertical_vp | the vertical vanishing point |
ifocal_length | will contain the focal length estimated from the vanishing points |
|
static |
Compute the angle between the line segment and the line through the vanishing point and the line segment mid point.
Computes the angle between a edge segment and the line between a segment's mid point and a vanishing point
vp | the vanishing point |
edge_segment | the edge segment |
double Vanishing_point_detector::compute_focal_length | ( | const std::vector< Vanishing_point > & | v_pts | ) |
double Vanishing_point_detector::compute_ransac_penalty | ( | double | outlier_threshold, |
unsigned int * | total_number_of_outliers, | ||
const Vanishing_point & | vp1, | ||
const Vanishing_point & | vp2 | ||
) |
Computes the RANSAC penalty for the horizontal segments given the input horizontal vanishing points.
Computes the RANSAC penalty for non vertical segments. Each edge segment is assigned to the vanishing point that minimizes the angle alpha between the edge segment and the line between the edge segment mid point and the vanishing point, and the angle alpha contributes to the total penalty, unless it is bigger than the input threshold
outlier_threshold | The threshold above which an edge segment is considered an outlier |
total_number_of_outliers | Will store the number of edge segments labeled as outliers |
vp1 | This is the first horizontal vanishing point for which we have to compute the penalty |
vp2 | This is the second horizontal vanishing point for which we have to compute the penalty |
double Vanishing_point_detector::compute_vertical_ransac_penalty | ( | double | outlier_threshold, |
unsigned int * | total_number_of_outliers, | ||
const Vanishing_point & | vertical_vp | ||
) |
Computes the RANSAC penalty for the vertical segments given the input vertical vanishing point.
Computes the RANSAC penalty for vertical segments. Each vertical segment contributes to the penalty proportionally to the angle alpha between the segment and the line between its midpoint and the vertical vanishing point
outlier_threshold | The threshold above which an edge segment is considered an outlier |
total_number_of_outliers | Will store the number of edge segments labeled as outliers |
vertical_vp | The vertical vanishing point to be used to compute the penalty |
bool Vanishing_point_detector::find_horizontal_vanishing_vpts_with_ransac | ( | double | success_probability, |
double | outlier_threshold, | ||
double | max_outliers_ratio, | ||
const Vanishing_point & | vp_vertical, | ||
Vanishing_point & | vp1, | ||
Vanishing_point & | vp2 | ||
) |
Finds an estimate for the two horizontal vanishing points. IMPORTANT: It relies on the current estimate of the vertical vanishing point.
Find the two horizontal vanishing points using RANSAC from the horizontal line segments
success_probability | The probability of finding the right solution This will increase or decrease the number of Ransac iterations. This does not necessarily do what you expect, because the ratio of inliers to outliers needed to compute the number of iterations from this probability is only an estimate It is wise to run RANSAC a little longer than you would think, since very few lines will intersect exactly at their vanishing point due to noise, and if we don't run it long enough we may get a vanishing point that is a little off its correct position |
outlier_threshold | The threshold above which a line segment is considered an outlier (ie it does not converge to any of the 3 vanishing points). It is the maximun difference in orientation allowed between the line segment and the segment between the midpoint of the segment and the vanishing point (in radian) |
max_outliers_ratio | The maximum ratio between outliers and total segments allowed (ie 0.45 means that no more than 45% of the segments can be outliers) |
bool Vanishing_point_detector::find_vertical_vp_with_ransac | ( | double | success_probability, |
double | outlier_threshold, | ||
double | max_outliers_ratio, | ||
Vanishing_point & | vp | ||
) |
Finds an estimate for the vertical vanishing point.
Find the vertical vanishing point from the vertical segments using RANSAC
success_probability | The probability of finding the right solution This will increase or decrease the number of Ransac iterations. This does not necessarily do what you expect, because the ratio of inliers to outliers needed to compute the number of iterations from this probability is only an estimate It is wise to run RANSAC a little longer than you would think, since very few lines will intersect exactly at their vanishing point due to noise, and if we don't run it long enough we may get a vanishing point that is a little off its correct position |
outlier_threshold | The threshold above which a line segment is considered an outlier (ie it does not converge to any of the 3 vanishing points). It is the maximun difference in orientation allowed between the line segment and the segment between the midpoint of the segment and the vanishing point (in radian) |
max_outliers_ratio | The maximum ratio between outliers and total segments allowed (ie 0.45 means that no more than 45% of the segments can be outliers) |
vp | This will contain the estimated vertical vanishing point |
double Vanishing_point_detector::find_vpts_from_groundtruth_assignments | ( | double | outlier_threshold, |
const Line_segment_set & | vertical_bucket, | ||
const Line_segment_set & | horizontal_bucket1, | ||
const Line_segment_set & | horizontal_bucket2, | ||
std::vector< Vanishing_point > & | vpts | ||
) |
double Vanishing_point_detector::find_vpts_with_ransac | ( | double | success_probability, |
double | outlier_threshold, | ||
double | max_outliers_ratio, | ||
std::vector< Vanishing_point > & | vpts, | ||
double | vertical_vp_outlier_threshold = VPD_VERTICAL_VP_OUTLIER_THRESHOLD , |
||
double | vertical_vp_max_outliers_ratio = VPD_VERTICAL_VP_MAX_OUTLIERS_RATIO |
||
) |
Finds an estimate for all three vanishing points using RANSAC.
Find all the three vanishing points using RANSAC
success_probability | The probability of finding the right solution This will increase or decrease the number of Ransac iterations. This does not necessarily do what you expect, because the ratio of inliers to outliers needed to compute the number of iterations from this probability is only an estimate It is wise to run RANSAC a little longer than you would think, since very few lines will intersect exactly at their vanishing point due to noise, and if we don't run it long enough we may get a vanishing point that is a little off its correct position |
outlier_threshold | The threshold above which a line segment is considered an outlier (ie it does not converge to any of the 3 vanishing points). It is the maximun difference in orientation allowed between the line segment and the segment between the midpoint of the segment and the vanishing point (in radian) |
max_outliers_ratio | The maximum ratio between outliers and total segments allowed (ie 0.45 means that no more than 45% of the segments can be outliers) |
vpts | This will contain the three estimated vanishing point, the last being the vertical |
vp_outlier_threshold | equivalent to outlier_threshold, but this is used for the computation of the vertical vanishing point only |
vertical_vp_max_outliers_ratio | equivalent to max_outliers_ratio, but this is used only for the estimation of the vertical vanishing point |
double Vanishing_point_detector::geometric_find_vpts_with_ransac | ( | double | success_probability, |
double | outlier_threshold, | ||
double | max_outliers_ratio, | ||
std::vector< Vanishing_point > & | vpts | ||
) |
|
inline |
|
inline |
int Vanishing_point_detector::get_tot_num_segments | ( | ) |
|
inline |
Sets the type of geometric constraints to be used.
bool Vanishing_point_detector::groundtruth_check_vpts_consistency | ( | const Vanishing_point & | vp1, |
const Vanishing_point & | vp2, | ||
const Vanishing_point & | vertical_vp, | ||
double & | ifocal_length, | ||
double & | opx, | ||
double & | opy | ||
) |
double Vanishing_point_detector::groundtruth_compute_ransac_penalty | ( | double | outlier_threshold, |
int * | total_number_of_outliers, | ||
const Line_segment_set & | vertical_bucket, | ||
const Line_segment_set & | horizontal_bucket1, | ||
const Line_segment_set & | horizontal_bucket2, | ||
const Vanishing_point & | vp1, | ||
const Vanishing_point & | vp2, | ||
const Vanishing_point & | vp3 | ||
) |
bool Vanishing_point_detector::guess_horizontal_vpts_from_three_segments | ( | Vanishing_point & | vp1, |
Vanishing_point & | vp2 | ||
) |
If only three line segments are available, we assume that one vp is at the intersection of two of them, while the third segment converges to the other vp
bool Vanishing_point_detector::guess_horizontal_vpts_from_two_segments | ( | Vanishing_point & | vp1, |
Vanishing_point & | vp2 | ||
) |
If only two line segments are available, we assume that each of them converges to a different vanishing point
void Vanishing_point_detector::init_from_edge_segment_set | ( | const Edge_segment_set & | iset, |
double | vertical_threshold, | ||
double | max_line_segment_fitting_error | ||
) |
Inits the edge segment that will be used to estimate the vanishing points.
Init this vanishing point detector from the input segments. Only segments whose fitting error is reasonably small will be kept. Segments will be divided into two different classes according to their slope (vertical and non vertical, the former will be used to estimate the vertical vanishing point).
vertical_threshold | Segments whose slope is larger than this threshold will be labeled as vertical segments |
iset | the set of edge segments |
max_line_segment_fitting_error | only segments whose fitting error is smaller than this threshold will be used |
void Vanishing_point_detector::init_from_edge_segment_set | ( | const Line_segment_set & | iset, |
double | vertical_threshold | ||
) |
Inits the edge segment that will be used to estimate the vanishing points.
Init this vanishing point detector from the input segments. Only segments whose fitting error is reasonably small will be kept. Segments will be divided into two different classes according to their slope (vertical and non vertical, the former will be used to estimate the vertical vanishing point).
vertical_threshold | Segments whose slope is larger than this threshold will be labeled as vertical segments |
iset | the set of edge segments |
max_line_segment_fitting_error | only segments whose fitting error is smaller than this threshold will be used |
double Vanishing_point_detector::jointly_compute_ransac_penalty | ( | double | outlier_threshold, |
double * | total_number_of_outliers, | ||
double | max_outlier_threshold, | ||
const Vanishing_point & | vp1, | ||
const Vanishing_point & | vp2, | ||
const Vanishing_point & | vp3 | ||
) |
Computes the RANSAC penalty for all segments given the three vanishing points.
Computes the RANSAC penalty for non vertical segments. Each edge segment is assigned to the vanishing point that minimizes the angle alpha between the edge segment and the line between the edge segment mid point and the vanishing point, and the angle alpha contributes to the total penalty, unless it is bigger than the input threshold
outlier_threshold | The threshold above which an edge segment is considered an outlier |
total_number_of_outliers | Will store the number of edge points labeled as outliers. Notice that this is edge points, not segments. This encourages the use of long segments |
vp1 | This is the first horizontal vanishing point for which we have to compute the penalty |
vp2 | This is the second horizontal vanishing point for which we have to compute the penalty |
vp3 | This is the vertical vanishing point for which we have to compute the penalty |
double Vanishing_point_detector::jointly_find_vpts_with_ransac | ( | double | success_probability, |
double | outlier_threshold, | ||
double | max_outliers_ratio, | ||
std::vector< Vanishing_point > & | vpts | ||
) |
Finds an estimate of the three vanishing points at once.
|
inline |
bool Vanishing_point_detector::relaxed_check_vpts_consistency | ( | const Vanishing_point & | vp1, |
const Vanishing_point & | vp2, | ||
const Vanishing_point & | vertical_vp, | ||
double & | ifocal_length | ||
) |
Checks that a set of three vanishing points is consistent, using basic geometric constraints. For a more thourough check use check_vpts_consistency.
Checks that a set of three vanishing points is consistent, using basic geometric constraints. This is mostly for debug purposes, or for specific applications. For a thorough check use check_vpts_consistency.
vp1 | the first horizontal vanishing point |
vp2 | the second horizontal vanishing point |
vertical_vp | the vertical vanishing point |
ifocal_length | will contain the focal length estimated from the vanishing points |
|
static |
samples n integers without repetitions from the set [0,m]
|
inline |
Returns true if realxed checks are used.
|
inline |
enum { ... } kjb::Vanishing_point_detector::Vanishing_point_index |