2010-02-09 27 views
7

Después de haber instalado exitosamente opencv 2.0 con enlaces de python, estoy empezando a tener problemas y antes de ir más allá me pregunté si debería cambiar a otra opción. Como ezod en este post dice:¿Qué versión de python opencv debo elegir?

"Como advertencia, a partir de la versión 2.0, los nuevos enlaces de Python están incompletos: hay muchas funciones que consideraría bastante importantes como faltantes. Mientras tanto, las vinculaciones SWIG son poco menos que agonizantes para funcionar con. Las vinculaciones ctypes-opencv (proyecto de terceros), a partir de la versión 0.8.0, no son compatibles con OpenCV 2.0. "

Entonces, ¿debería usar Soldier 2.0 o debería buscar ctypes? ¿Qué me estoy perdiendo en ambos sentidos?

Estoy usando OSX, python 2.5 y quiero hacer un seguimiento en 2D de objeto en movimiento y ni un experto en python ni visión artificial.

+0

El tiempo ha resuelto mi problema. La versión actual de opencv 2.2 tiene una buena implementación de Python. Finalmente volviendo a este proyecto habiendo instalado opencv usando homebrew (vea la página wiki en willowgarage para obtener instrucciones). – PhoebeB

+0

Tenga en cuenta que (al menos en este momento) la instalación homebrew predeterminada para opencv no instala los enlaces C++ (opencv. *), Sino solo los enlaces C del espacio de nombres cv. Además, es posible que desee instalar ffmpeg primero. El espacio de nombres de opencv puede estar disponible también dada la instalación de algunos paquetes (¿SWIG, por ejemplo?) –

Respuesta

1

Estoy usando un OpenCV 2.0 autocompilado y está integrado en un enlace de pitón. Hasta ahora me faltaban 2 o 3 funciones (por ejemplo, FindFundamentalMat). Si obtiene el código fuente de OpenCV, encontrará un archivo de texto interfaces/python/api que define el parámetro y los tipos de retorno para cada función de OpenCV disponible en Python. Tras la recompilación, un generador automático analizará este archivo y creará la extensión de Python. Para todos los casos en los que he pasado, encontré que agregar una definición apropiada al api para las funciones que necesitaba, luego recompilar opencv, funcionó bastante bien.

+0

¿Puedes ver las desventajas de utilizar esta ruta en lugar de utilizar los tipos? – PhoebeB

+0

ctypes-opencv no funciona con OpenCV 2.0 afaik (aunque no lo comprueba). Acabo de encontrar uno nuevo, http://code.google.com/p/pyopencv/ ¡Nunca lo intenté pero parece extremadamente prometedor! Afirma tener una buena integración numpy :-) – dudemeister

+0

Acabo de ver que pyopencv (enlace que publiqué) se basa en Boost.Python en lugar de ctypes. Esta es una muy buena decisión, ya que ctypes solo admite el ajuste plano de funciones (no se puede envolver directamente una clase de C++, sino que tiene que codificar a mano el ajuste de objetos de C++ a mano). Esto significa que pyopencv podría ser incluso mejor ya que envuelve un objeto OpenCV real (como Mat). Incluso proporciona la sintaxis clara de numpy-indexing directamente en las matrices OpenCV \ o/ – dudemeister

0

Recomiendo que use the official Python bindings to OpenCV 2.1 que, por lo que he visto, tiene paridad con las bibliotecas C++. La mayoría de ellos tienen un contenedor pythonic o una traducción directa de la versión C++.

La documentación de Python OpenCV no es tan completa como la de C++, pero si crees que las ventajas lingüísticas para la creación de prototipos lo valen, podrás comprender el uso de Python del C++ documentation.

Tenga en cuenta que gran parte del código de ejemplo existente que encontrará es de las versiones anteriores y es incompatible (por ejemplo, ahora todo reside en el paquete cv), pero no es difícil determinar cómo actualizarlo.

3

Una respuesta tardía. Si no tiene que depender de versiones anteriores y desea usar OpenCV con Python, elija la última versión estable. Hoy es OpenCV 2.3.1.

El mayor beneficio de OpenCV ≥ 2,3 para Python usuarios: un nuevo módulo cv2 además de la edad (compatible) cv módulo. El nuevo módulo cv2 es mucho más pitónico y no requiere asignaciones de memoria manual para estructuras de datos intermedias. El antiguo módulo cv se parece más a la traducción directa de la API C++.

Por ejemplo, comparar el nuevo Python cv2.findContours (OpenCV ≥ 2,3):

findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy 

Requiere sólo tres parámetros, y puede manejar todas las asignaciones de memoria de forma automática, sólo devuelve el resultado final. Solo una línea del código de usuario.

vs.los viejos cv.FindContours:

FindContours(image, storage [, mode [, method [, offset]]]) -> None 

Se requiere que el usuario asignar explícitamente "almacenamiento" antes de la llamada (+ 1 o 2 líneas de código). No devuelve el resultado, en cambio lo guarda en el almacenamiento asignado (funciona como una lista vinculada, y el usuario tiene que escribir algún bucle para extraer los datos del almacenamiento). En general, más bajo nivel, y más como C++ que Python. Al menos 4-5 líneas de código en el caso de uso común, en lugar de solo una línea con el nuevo módulo cv2.

+0

y algunas constantes no están mapeadas. Soluciones para encontrarlos aquí: http://stackoverflow.com/questions/9661512/python-opencv-imwrite-cant-find-params/9934725#9934725 – Neon22