2016-08-02 5 views
3

Ich habe eine numpy Array, die aus einem Bild mit dem Harris Corner Erkennung Algorithmus von opencv extrahiert wurde und ich versuche, vier Punkte, die ähnelt zu sortieren Ein Rechteck.Wie (x, y) Punkte im Array zu vergleichen, um rechteckige Form in Python zu extrahieren

Hier finden Sie die Menge der Punkte:

numpy.array([[194, 438], 
    [495, 431], 
    [512, 519], 
    [490, 311], 
    [548, 28], 
    [407, 194], 
    [181, 698], 
    [169, 93], 
    [408, 99], 
    [221, 251], 
    [395, 692], 
    [574, 424], 
    [431, 785], 
    [538, 249], 
    [397, 615], 
    [306, 237]]) 

Was wäre die beste Methode, um die Punkte für die Winkel in den Quadranten innerhalb einer geringen Abweichung von 90 zusammen mit Vergleichen wie parallele Linien zwischen oberen und unteren Punkte vergleichen und linke und rechte Punkte sollen die vier bestmöglichen Kandidaten zurückgeben?

bearbeiten

Das Bild wird grob mit dem Rechteck ausgerichtet, so dass keine signifikante Rotation oder Verzerrung ist. Die Abweichungstoleranz für perspektivische Transformation und grobe Aufnahme kann ich denke, kann +/- 10 Grad sein

Unten ist ein Bild der geplotteten Linien mit x und y Standorten. Die gewünschten Ecken sind oben links (169,93), oben rechts (408,99), unten rechts (395,692) und unten links (181,698)

+0

sind die Rechtecke "richtige" Rechtecke mit den Rändern des Bildschirms ausgerichtet oder sind sie gedreht oder verzerrt? –

+1

auch das wird fast unmöglich zu beantworten, es sei denn, Sie sagen uns genau * Wie * Sie definieren Rechteck "Güte". Ist Parallelität wichtiger als 90-Grad-Winkel? Ist ein "Rechteck" mit einem perfekten 90 ° -Winkel und einem sehr schlechten Winkel besser als ein "Rechteck" mit zwei mittelmäßigen Winkeln? Wie viel? –

+1

Warum quetschen Sie nicht die zusätzliche Dimension aus, dann machen Sie ein Streudiagramm in matplotlib, um eine Vorstellung davon zu bekommen, mit was Sie arbeiten –

Antwort

0

Dies ist wahrscheinlich nicht der effizienteste Weg die Punkte in vier Quadranten zu gehen um die Ecken zu finden, aber ich aufgeteilt in etwa so:

yThreshM = height/2 
xThreshM = width/2 

tl = dst[ ((dst[:,1]<yThreshM) & (dst[:,0]<xThreshM)) ] 
tr = dst[ ((dst[:,1]<yThreshM) & (dst[:,0]>xThreshM)) ] 
br = dst[ ((dst[:,1]>yThreshM) & (dst[:,0]>xThreshM)) ] 
bl = dst[ ((dst[:,1]>yThreshM) & (dst[:,0]<xThreshM)) ] 

Dann gruppierte ich jeden Abschnitt in ihre jeweiligen Winkel für oben links und unten rechts:

tla = [bl, tl, tr] 
bra = [tr, br, bl] 

tlap = list(it.product(*tla)) 
brap = list(it.product(*bra)) 

Dann Ich berechnete die Richtung der vertikalen Linien und rem Objekte, die nicht innerhalb einer vorgegebenen senkrechten Schwelle liegen. Dann berechnete ich die Winkel und filterte die Punkte heraus, die nicht innerhalb einer Schwelle von +/- 90 Grad lagen.

Schließlich überprüfte ich, dass die entgegengesetzten Endpunkte der Ergebnisse der Iteration durch tlap und brap abgestimmt, den Rest der Punkte zu bekommen und die tl und br Punkte zu überprüfen.

Verwandte Themen