Пересечение двух линий, определенных в параметризации (rho / theta) - PullRequest
11 голосов
/ 20 декабря 2008

Создана реализация преобразования Хафа в c ++ для обнаружения линий на изображениях. Найденные строки представлены с использованием rho, theta, как описано в википедии:

«Параметр r представляет расстояние между линией и началом координат, а θ - угол вектора от начала координат до этой ближайшей точки»

Как найти точку пересечения в пространстве x, y для двух линий, описанных с использованием r, θ?

Для справки вот мои текущие функции для преобразования в и из свободного пространства:

//get 'r' (length of a line from pole (corner, 0,0, distance from center) perpendicular to a line intersecting point x,y at a given angle) given the point and the angle (in radians)
inline float point2Hough(int x, int y, float theta) {
    return((((float)x)*cosf(theta))+((float)y)*sinf(theta));
}

//get point y for a line at angle theta with a distance from the pole of r intersecting x? bad explanation! >_<
inline float hough2Point(int x, int r, float theta) {
    float y;
    if(theta!=0) {
            y=(-cosf(theta)/sinf(theta))*x+((float)r/sinf(theta));
    } else {
            y=(float)r; //wth theta may == 0?!
    }
    return(y);
}

заранее извините, если это что-то очевидно ..

Ответы [ 2 ]

16 голосов
/ 20 декабря 2008

Глядя на страницу Википедии , я вижу, что уравнение прямой линии, соответствующей данной заданной паре r, θ, равно

r = x cosθ + y sinθ 

Таким образом, если я понимаю, учитывая две пары r1, θ1 и r2, θ2, чтобы найти пересечение, вы должны решить для неизвестных x, y следующую линейную систему 2x2:

x cos θ1 + y sin θ1 = r1
x cos θ2 + y sin θ2 = r2

то есть AX = b, где

A = [cos θ1  sin θ1]   b = |r1|   X = |x|
    [cos θ2  sin θ2]       |r2|       |y|
10 голосов
/ 06 января 2009

Раньше никогда не сталкивался с математикой, поэтому потребовалось немного исследований и экспериментов, чтобы выработать методику ответа Фредрико. Спасибо, все равно нужно было узнать о матрицах. ^^

функция, чтобы найти, где пересекаются две параметризованные линии:

//Find point (x,y) where two parameterized lines intersect :p Returns 0 if lines are parallel 
int parametricIntersect(float r1, float t1, float r2, float t2, int *x, int *y) {
    float ct1=cosf(t1);     //matrix element a
    float st1=sinf(t1);     //b
    float ct2=cosf(t2);     //c
    float st2=sinf(t2);     //d
    float d=ct1*st2-st1*ct2;        //determinative (rearranged matrix for inverse)
    if(d!=0.0f) {   
            *x=(int)((st2*r1-st1*r2)/d);
            *y=(int)((-ct2*r1+ct1*r2)/d);
            return(1);
    } else { //lines are parallel and will NEVER intersect!
            return(0);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...