2012-08-02 18 views
7

Ich versuche OpenCV-Funktion MinAreaRect2 aus Python aufrufen. Ich benutze OpenCV 2.4.2 mit Python 2.7 und numpy 1.6. ging ich so weit:Python OpenCV Box2D

import cv 

def nda2ipl(arr, dtype=None): 
    return cv.fromarray(np.ascontiguousarray(arr, dtype=dtype)) 

def min_area_rect2(points): 
    storage = cv.CreateMemStorage() 
    cv_points = nda2ipl(points.reshape((-1, 1, 2))) 
    out = cv.MinAreaRect2(cv_points, storage) 
return out 

ich mit einem ndarray der Form diese Funktion aufrufen können (N x 2). Ich erhalte diese Art der Ergebnisse:

((476.5, 604.5), (951.0, 1207.0), -0.0) 

Ich gehe davon aus, dass das erste Tupel die Mitte der Box ist, gibt der zweite die Breite und die Höhe und die letzte ist der Winkel.

Das Problem ist, dass ich keine klare Referenz erhalten konnte, die das angibt. Die opencv-Dokumentation sagt mir, was die Funktionen in Python zurückgeben.

Ich fand die official documentation about this function, aber das ist nicht sehr hilfreich.

Was genau ist die Ausgabe von MinAreaRect2 in Python? Allgemeiner, wo erhalten Sie genaue Dokumentation über den OpenCV-Python-Wrapper?

Antwort

11

OpenCV Python-Wrapper Dokumentation zusammen mit der normalen Dokumentation in gleicher Stelle gehalten wird, www.docs.opencv.org

Früher Python-Modul verwendet wurde cv-Schnittstelle, die von den ursprünglichen C++ Schnittstelle wie cvMat nativen Datentypen verwendet, cvSeq usw.

Später wurde es zu mehr besser, erweiterte und einfachere Modul cv2 Schnittstelle verschoben. In diesem Fall wird alles entweder als Numpy-Arrays oder als native Python-Datentypen zurückgegeben.

Hier hat das zurückgegebene Tupel dieselben Argumente wie das von cvBox2D. Weitere Details zu den Unterschieden zwischen verschiedenen Python-Wrappern finden Sie hier: What is different between all these OpenCV Python interfaces?

Hier ist Ihre Annahme richtig. Diese Werte spezifizierten genau das, was du erwähnt hast.

Wenn Sie gedrehte Rect zeichnen möchten, benötigen Sie 4 Eckpunkte des Rechtecks. Dafür benötigen Sie eine Funktion, die nie in der Dokumentation zu sehen ist, dh cv2.cv.BoxPoints() (aber keine Sorge, es wird dort in der Dokumentation sein, wenn OpenCV 2.4.3 freigegeben wird.)

Sie können ein Beispiel finden, wie gedrehtes Rechteck in diesem Artikel zeichnen: Rotated Rectangle

enter image description here

+0

Danke für Ihre Hilfe! –

+1

Irgendwie enttäuschend, es scheint, dass sie Ihre Anfrage zum Hinzufügen von BoxPoints zur Dokumentation (bis OpenCV 3.0) verschoben haben (http://code.opencv.org/issues/2023) –

1

Wie in der Dokumentation angegeben, zu dem Sie verbunden sind, gibt MinAreaRect2 ein Box2D object:

Ein CvBox2D Objekt zeichnet sich durch seine Mitte, Größe und Winkel definiert, wie Sie richtig angenommen, wie here beschrieben.

Im Allgemeinen ist die Dokumentation der Python-Wrapper eher schlecht. Am besten ist es, auf die C++ - Dokumentation zu verweisen und den Quellcode zu lesen.

+1

Vielen Dank für Ihre Antwort. Die Python-Funktion gibt jedoch kein Box2D-Objekt zurück, sondern ein Python-Tupel. Also habe ich mich über die Beziehung zwischen den Tuple-Elementen und der C++ Box2D-Struktur gewundert.Ich habe versucht, den Quellcode zu sehen, konnte aber keinen Ort finden, der mir die Antwort geben könnte. Ich habe Schwierigkeiten zu verstehen, wie die opencv-Bibliothek tatsächlich in Python eingebunden ist. Jeder Hinweis darauf wäre sehr willkommen. –

+0

Ich fand diesen Beitrag ziemlich klärend: http://opencvpython.blogspot.com.es/2012/06/contours-2-brotherhood.html – Antoni