18 Stimmen

Schnittpunkt zweier Linien, die in der Parametrisierung (rho/theta ) definiert sind

Ich habe eine C++-Implementierung der Hough-Transformation zur Erkennung von Linien in Bildern erstellt. Gefundene Linien werden mit rho, theta, wie auf wikipedia beschrieben, dargestellt:

"Der Parameter r gibt den Abstand zwischen der Linie und dem Ursprung an, während der Winkel des Vektors vom Ursprung zu diesem nächstgelegenen Punkt ist.

Wie kann ich den Schnittpunkt im x-, y-Raum für zwei mit r, beschriebene Linien finden?

Als Referenz sind hier meine aktuellen Funktionen für die Konvertierung in und aus dem Hough Space:

//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);
}

Entschuldigung im Voraus, wenn dies etwas offensichtlich ist

20voto

Federico A. Ramponi Punkte 44697

Die Betrachtung der Wikipedia-Seite Ich sehe, dass die Gleichung einer Geraden, die einem gegebenen Paar r entspricht, lautet

r = x cos + y sin 

Wenn ich das richtig verstanden habe, muss man also bei zwei Paaren r1, 1 und r2, 2 für die Unbekannten x, y das folgende lineare 2x2-System lösen, um den Schnittpunkt zu finden:

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

d. h. AX = b, wobei

A = \[cos 1  sin 1\]   b = |r1|   X = |x|
    \[cos 2  sin 2\]       |r2|       |y|

15voto

erisu Punkte 433

Ich hatte vorher noch nie mit Matrizenmathematik zu tun und brauchte daher ein wenig Recherche und Experimente, um das Verfahren für Fredricos Antwort herauszufinden. Danke, ich musste sowieso etwas über Matrizen lernen. ^^

Funktion, um zu ermitteln, wo sich zwei parametrisierte Linien schneiden:

//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);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X