2017-06-07 5 views
0

ich die cv2 Bibliothek bin mit Schlüsselpunkten von 2 Stereo-Bilder zu erfassen und konvertiert die resultierenden dmatches-Objekten in eine numpy Array:Wie man ein numpy Array basierend auf zwei Bedingungen filtert: eine abhängig von der anderen?

kp_left, des_left = sift.detectAndCompute(im_left, mask_left) 
matches = bf.match(des_left, des_right) # according to assignment pdf 
np_matches = dmatch2np(matches) 

Dann möchte ich Spiele filtern, wenn die wichtigsten Punkte sind Filterung nach y- Richtung, die größer als 3 Pixel nicht unterscheiden soll:

ind = np.where(np.abs(kp_left[np_matches[:, 0], 1] - kp_right[np_matches[:, 1], 1]) < 4) 

und diejenigen Eckpunkte sollte auch keinen Unterschied kleiner als < 0. Dann bedeutet es der entscheidende Punkt ist, hinter der Kamera.

ind = np.where((kp_left[np_matches[ind[0], 0], 0] - kp_right[np_matches[ind[0], 1], 0]) >= 0) 

Wie diese beiden Bedingungen zu kombinieren?

+0

Musterkoffer hinzufügen für 'np_matches',' kp_left', 'kp_right'? – Divakar

+0

Sie könnten die beiden Bedingungen kombinieren, indem Sie eine boolesche Algebra machen. Z.B. 'A = np.bereich (25); np.where ((A> 5) * (A <10)) [0] ', um Werte größer als 5 AND kleiner als 10 zu finden. Hier würden Sie nur das verwenden: 'True * True = True'. Alle anderen Multiplikationen führen zu "Falsch". Es sollte trivial sein, diese Logik auf Ihr Problem zu spezialisieren. * (Eine allgemeine Bemerkung: Eine abstraktere Frage würde bessere Antworten auslösen. Deine Frage hat wenig mit cv2 und all dem zu tun. Es wäre besser, deine Frage zu isolieren) * –

Antwort

1

Die allgemeine Form ist dies:

condition1 = x < 4 
condition2 = y >= 100 
result = np.where(condition1 & condition2) 

Die noch allgemeinerer Form:

conditions = [...] # list of bool arrays 
result = np.where(np.logical_and.reduce(conditions)) 
Verwandte Themen