2012-08-02 15 views
7

Estoy intentando llamar a la función OpenCV MinAreaRect2 desde dentro de python. Uso OpenCV 2.4.2 con python 2.7 y numpy 1.6. Fui este momento: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 

puedo llamar a esta función con un ndarray de forma (N x 2). Consigo este tipo de resultados:

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

supongo que la primera tupla es el centro de la caja, el segundo da el ancho y la altura y el último es el ángulo.

El problema es que no pude obtener una referencia clara que indique esto. En realidad, la documentación de opencv me dice qué devuelve la función en Python.

Encontré official documentation about this function pero esto no es muy útil.

¿Cuál es exactamente el resultado de MinAreaRect2 en python? Más en general, ¿dónde obtienes documentación precisa sobre el contenedor de python OpenCV?

Respuesta

11

documentación envoltura OpenCV Python se mantiene junto con la documentación normal en el mismo sitio, www.docs.opencv.org

principios módulo Python utilizado fue cv interfaz, que utiliza tipos de datos nativos de C original de interfaz ++ como cvMat, cvSeq etc.

Más tarde se cambió a una interfaz de módulo cv2 más avanzada, mejor y más simple. En él, todo se devuelve como matrices Numpy o tipos de datos nativos de Python.

Aquí, la tupla devuelta tiene los mismos argumentos que la de cvBox2D. Puede encontrar más detalles sobre las diferencias entre diferentes contenedores de Python aquí: What is different between all these OpenCV Python interfaces?

Aquí, su suposición es correcta. Esos valores especificaron exactamente lo que mencionaste.

Si desea dibujar rect rotado, necesita 4 vértices del rectángulo. Para ello, se necesita una función que nunca se ve en la documentación, es decir, cv2.cv.BoxPoints() (pero no se preocupen, que estará allí cuando en la documentación OpenCV 2.4.3 es liberado.)

Se puede encontrar un ejemplo sobre cómo dibujar rectángulo girado en este artículo: Rotated Rectangle

enter image description here

+0

¡Gracias por su ayuda! –

+1

De alguna manera decepcionante, parece que han [pospuesto] (http://code.opencv.org/issues/2023) su solicitud para agregar BoxPoints a la documentación, hasta que OpenCV 3.0 –

1

como se indica en la documentación para el que se conectó, MinAreaRect2 devuelve un Box2D object:

Un objeto CvBox2D se define por su centro, el tamaño y el ángulo, como usted asumió correctamente, como se describe here.

En términos generales, la documentación del envoltorio de Python es bastante pobre. Su mejor opción es consultar la documentación de C++ y leer el código fuente.

+1

Gracias por su respuesta. Pero la función python no devuelve un objeto Box2D, sino una tupla de python. Entonces me pregunté sobre la relación entre los elementos de tupla y la estructura de C++ Box2D.Traté de ver el código fuente pero no pude encontrar un lugar que pudiera darme la respuesta. Tengo dificultades para entender cómo la biblioteca de opencv está integrada en python, en realidad. Cualquier sugerencia sobre esto sería muy bienvenida. –

+0

Encontré esta publicación bastante aclaradora: http://opencvpython.blogspot.com.es/2012/06/contours-2-brotherhood.html – Antoni