2012-08-02 15 views
7

Sto provando a chiamare la funzione OpenCV MinAreaRect2 all'interno di python. Io uso OpenCV 2.4.2 con python 2.7 e numpy 1.6. Sono andato fino a questo punto: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 

posso chiamare questa funzione con un ndarray di forma (N x 2). Ottengo questo tipo di risultati:

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

Si considera che il primo tupla è il centro della scatola, il secondo dà la larghezza e l'altezza e l'ultimo è l'angolo.

Il problema è che non ho potuto ottenere un chiaro riferimento affermando questo. In realtà, la documentazione di opencv mi dice cosa restituisce le funzioni in Python.

Ho trovato il official documentation about this function ma questo non è molto utile.

Quali sono esattamente l'output di MinAreaRect2 in python? Più in generale, dove viene fornita una documentazione precisa sul wrapper python OpenCV?

risposta

11

OpenCV Python documentazione involucro è tenuto insieme con la documentazione normale stesso sito, www.docs.opencv.org

All'inizio modulo Python utilizzata è stata il cv interfaccia, che ha utilizzato i tipi di dati nativi dall'originale C++ interfaccia come cvMat, cvSeq ecc.

Successivamente è stato spostato nell'interfaccia del modulo cv2 più avanzato, semplice e avanzato. In esso, tutto viene restituito come array Numpy o tipi di dati Python nativi.

Qui, la tupla restituita ha gli stessi argomenti di cvBox2D. Puoi trovare maggiori dettagli sulle differenze tra diversi wrapper python qui: What is different between all these OpenCV Python interfaces?

Qui, la tua ipotesi è corretta. Quei valori specificati esattamente quello che hai citato.

Se si desidera disegnare rect ruotato, sono necessari 4 vertici del rettangolo. Per questo, è necessario una funzione che non è mai visto nella documentazione, cioè cv2.cv.BoxPoints() (ma non preoccupatevi, sarà lì nella documentazione quando OpenCV 2.4.3 viene rilasciato.)

È possibile trovare un esempio su come disegnare rettangolo ruotato in questo articolo: Rotated Rectangle

enter image description here

+0

Grazie per il vostro aiuto! –

+1

In qualche modo deludenti, sembra che abbiano [posticipato] (http://code.opencv.org/issues/2023) la tua richiesta di aggiungere BoxPoints alla documentazione, fino a OpenCV 3.0 –

1

Come indicato nella documentazione a cui è collegato, MinAreaRect2 restituisce un Box2D object:

Un oggetto CvBox2D è definito dal suo centro, dimensioni e angolazione, come si presume correttamente, come descritto here.

In generale, la documentazione del wrapper Python è piuttosto scarsa. La soluzione migliore è fare riferimento alla documentazione di C++ e leggere il codice sorgente.

+1

Grazie per la risposta. Ma la funzione python non restituisce un oggetto Box2D ma una tupla python. Mi sono quindi interrogato sulla relazione tra gli elementi tuple e la struttura C++ Box2D.Ho provato a guardare il codice sorgente ma non sono riuscito a trovare un posto che potesse darmi la risposta. Ho difficoltà a capire come la libreria opencv è stata inserita in Python, in realtà. Qualsiasi suggerimento su questo sarebbe molto gradito. –

+0

Ho trovato questo post abbastanza chiarificante: http://opencvpython.blogspot.com.es/2012/06/contours-2-brotherhood.html – Antoni