Schleife durch die Knoten und Attribute extrahieren in Networkx
Ich in python definiert einige Formen mit den entsprechenden Eckpunkte, wie diese:
square = [[251, 184],
[22, 192],
[41, 350],
[244, 346]]
triangle = [[250, 181],
[133, 43],
[21, 188]]
pentagon = [[131, 37],
[11, 192],
[37, 354],
[247, 350],
[256, 182]]
Dann nutze ich NetworkX-Paket um ein Diagramm zu erstellen:
G = nx.DiGraph()
Dann erstelle ich einen Knoten im Diagramm für jede Form:
G.add_node('square', points = square, center = (139, 265))
G.add_node('triangle', points = triangle, center = (139, 135))
G.add_node('pentagon', points = pentagon, center = (138, 223))
Nun ist das problem, ich haben Sie einige Kanten verbinden zwei Knoten, wenn eine Bedingung erfüllt ist. Die Bedingung zu erfüllen, ist wenn das Zentrum einer Form ist, die innerhalb oder außerhalb einer anderen Form, dann erstellen Sie einen Rand wie diese:
G.add_edge('triangle', 'pentagon', relation = 'inside')
G.add_edge('triangle', 'square', relation = 'outside')
Dazu habe ich eine Schleife über das Knoten, extrahieren Sie die center
einer Form, extrahieren Sie die points
des andere Formen (NICHT selbst, es ist nutzlos) und machen die pointPolygonTest
.
Ich versuche schon Recht viel, aber nicht kam mit einer Lösung. Die nächsten (nicht wirklich effektiv) Lösung, die ich habe ist dieses:
nodes_p=dict([((u),d['points']) for u,d in G.nodes(data=True)])
nodes_c=dict([((u),d['center']) for u,d in G.nodes(data=True)])
for z,c in nodes_c.items():
print z + ' with center', c
for z,p in nodes_p.items():
p_array = np.asarray(p)
if cv2.pointPolygonTest(p_array,c,False)>=0:
print 'inside ' + z
#create edge
else:
print 'outside ' + z
#create edge
Dieser gibt mir folgende Ausgabe, das ist nicht optimal, weil es eine Beziehung, die hätte vermieden werden können (wie triangle inside triangle
) oder falsche Beziehungen (wie pentagon inside square
)
triangle with center (139, 135)
inside triangle
outside square
inside pentagon
square with center (139, 265)
outside triangle
inside square
inside pentagon
pentagon with center (138, 223)
outside triangle
inside square
inside pentagon
Wie kann ich dieses problem lösen? Jede Anregung ist apreciated. Zur Erinnerung: das Hauptproblem ist, wie eine Schleife durch die Knoten, und extrahieren Sie die info. Die Pakete, die ich importieren, die für das gesamte Skript sind:
import numpy as np
import networkx as nx
import cv2
- Sie sollten wahrscheinlich hinzufügen Ihre import-Anweisungen (
numpy
undcv2
) zu helfen, die künftigen Leser
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Bild von Ihrem Polygone
Ersten, es gibt keine Notwendigkeit zu werfen, die die Knoten wie Wörterbücher, können wir die Iteration auf Sie direkt. Dieser code ist aus der Basis von dieses Beispiel
Die Ausgabe ist
Da das Ziel ist zu bestimmen, ob ein polygon ist vollständig in die anderen, sollten wir prüfen alle vertices eines Polygons in einer anderen. Hier ist eine vorläufige (leider nicht getestet) - Lösung.
Die Ausgabe für dieses Beispiel wie folgt und sollten nun korrekt sein.
Beachten Sie, dass ich gemacht habe, die Annahme, dass die Polygone konvex sein. Wenn dies nicht der Fall, dann könnten Sie prüfen alle Punkte auf der Kontur, anstatt nur in der Ecke Punkten. Sie können auch bauen in einer Konvexität überprüfen mit
cv2
finden Sie dieser blog für details.tuple
in der letzten Zeile der Funktion und der[
und]
im Aufrufall
. Ich hoffe, das hilft.