2010-07-12 12 views
56

Soy bastante nuevo en OpenCV (hace unos 2 meses). Tengo el libro Learning OpenCV de Bradski y Kaehler. Mi pregunta es, si deseo hacer todo de una manera 2.0+, ¿cuándo debería usar Matrices (Mat) y cuándo debería usar IplImage?OpenCV: IplImage versus Mat, ¿cuál usar?

El libro de Bradky indica por adelantado que está escrito en OpenCV 2.0 y usa principalmente IplImage en su código de muestra, pero la documentación en línea más reciente lo hace sonar como Mat ahora es un tipo de datos catch-all para imágenes , máscaras, etc., algo así como una matriz básica en Matlab. Esto me deja preguntándome si IplImage debería considerarse obsoleto.

Entonces, ¿debería evitar por completo IplImages cuando escriba un nuevo código? ¿O hay cosas importantes que IplImages me permite hacer que las Mats no me permiten?

Gracias.

Respuesta

72

IplImage ha estado en OpenCV desde el principio. Es una parte de la interfaz C para OpenCV. Debe asignar y desasignar la memoria para las estructuras IplImage usted mismo. (¿recuerda los comandos cvReleaseImage?)

La nueva estructura Mat es parte de la estructura C++. Así que obviamente está orientado a objetos. Además, ¡gestiona toda la memoria para ti! Mantiene una pista de referencias a él. Entonces el número de referencias va a cero, se desasigna automáticamente. Esta es una excelente característica!

Go para Mat. Debe ser fácil de traducir el código de la IplImage cosita a la Mat cosita si está utilizando algún IDE que tiene Intellisense (que se despliega una lista de posibles funciones, variables, etc a medida que escribe)

+2

Mat también tiene algunas características adicionales de manipulación de la matriz. Es más general que IplImage y mucho más fácil de hacer con el álgebra matricial. – rossb83

16

Recomiendo usar Mat. Lo he estado usando por un tiempo, y es genial. Las funciones miembro y las expresiones de la matriz hacen las cosas mucho más simples que tratar con IplImage y, como dijiste, es un tipo de datos general.

¡Vaya para Mat!

12

que diría esto habría de hecho depende de la plataforma en la que va a ejecutar su aplicación. Si está desarrollando una aplicación para un sistema integrado, es más probable que use C. En ese caso, debería usar IplImage. Citando el tutorial:

La desventaja principal de la interfaz de C++ es que muchos sistemas de desarrollo integrados en el soporte de momento solo C. Por lo tanto, a menos que que se dirigen a plataformas integradas, no hay punto de usar el de edad métodos (a menos que seas un programador masoquista y estás preguntando por problemas).

+1

Dado que compilar OpenCV requiere un compilador de C++, esta no es una consideración razonable. – Bull

7

gracias por la ayuda.

También descubrí desde la publicación de esta pregunta que una función con un Mat como un argumento puede tomar una IplImage directamente en el lugar de ese Mat argumento, que hace que sea muy fácil de actualizar el código en trozos si ya está roto en práctica funciones. Simplemente cambie los argumentos de la función de IplImage* a Mat, luego modifique la función para trabajar en un Mat. Otro código que llame a esa función debería funcionar bien (lo ha hecho según mi experiencia).

-2

Al escribir una rutina de detección de Blob me di cuenta de que el uso de

IplImage* img; 
uchar* image_src = (uchar*)img->imageData; 
image_src[x+y*width] = ...; 

es mucho más rápido que usar

Mat image; 
image.at<uchar>(x,y) = ...; 

Acerca 5 veces más rápido. Parte de esto puede deberse a que utilicé un bucle X, Y anidado para Mat y un bucle único para IplImage. Pero si tiene que escribir cualquier rutina que funcione directamente en píxeles, me quedaría con IplImage.

+7

Si bien su observación es probablemente cierta, las dos piezas de código no son equivalentes.Para tener un acceso de datos equivalente, use 'uchar * image_src = image.data;' en el segundo bloque de código ('Mat') y continúe desde allí. Las velocidades serán comparables. – Bee

+2

Seguramente obtendrá un error en tiempo de ejecución con ambos ejemplos y también debe ser 'image.at (y, x)' – Bull

0

Iplimage es una estructura de interfaz C en Opencv, y Mat es más adecuado para C++ y admite algunos estilos C++ como parámetro ref y operador de flujo, etc. Aunque son todos de programación orientada a objetos, Mat incluye más métodos que Iplimage lo hace, como crear y lanzar, lo que Ipliamge llamaría una interfaz cvXXX para completar. Además, Mat es una nueva estructura de Opencv2, que creo que es símbolo de desarrollo para los antiguos. Desearía ayuda.

1

Sugeriría Mat. La recolección de basura es automática y, por lo tanto, la aplicación es más confiable y tiene menos pérdidas de memoria. Además, Mat es una forma más nueva de almacenamiento de datos, por lo que si usted es un novato, al comenzar con OpenCV, Mat es más nuevo y requiere una codificación menos cuidadosa para realizar una aplicación completa.

La compatibilidad es una cosa que Mat será un poco peor. IplImage ha estado disponible por más tiempo y, por lo tanto, tiene una mayor compatibilidad con la mayoría de las cosas. Creo que también puedes usar IplImage con Mat, y si no, IplImage> Mat también es bastante simple de realizar.

Como Iplimage ha estado disponible durante un período de tiempo mucho más largo, es probable que encuentre una mayor selección de muestras.

Aquí están mis dos centavos: Como novato (trucos) que aún están aprendiendo en el procesamiento de visión con OpenCV, elegir uno, Mat o IplImage y obtener muy buenos en eso. Sin embargo, aprenda al menos los conceptos básicos del otro para que sepa qué hacer si necesita usar una función que no sea compatible con la otra.

Pero, repito, si eres un novato, intenta comenzar con Mat. ¡Dado que es una implementación más nueva, es más fácil de aprender y acertar!

1

Mat es mucho más fácil y fácil de usar. Representa la imagen como una matriz. es más rápido también. Recomendaría Mat over IplImage.

0

Creo que el uso de cv :: Mat es mucho más conveniente. es más genérico Podemos ver que IplImage es un subconjunto de cv :: Mat. El tipo de datos predeterminado para IplImage es un entero sin signo, mientras que para cv :: Mat es doble. Por lo tanto, es mucho más fácil utilizar Mat para cualquier tipo de operación matemática.

+0

'" El tipo de datos predeterminado para IplImage es un entero sin signo mientras que para cv :: Mat es doble . "'No creo que eso sea cierto. cv :: Mat almacena los datos internamente como 'uchar *'. No existe el "tipo de datos predeterminado" para estas matrices, tienen el tipo con el que las construyes. – Ela782

0

Empecé a usar opencv en 2012 más o menos. Así que comencé con Mat, que es potente y fácil de usar. PERO para leer o reutilizar este código que era "viejo", tenía que saber algo sobre iplimages, es fácil de usar, también. Pero el futuro es Mat, creo. Y no olvides Mat en una CLASE, es decir, no necesitas liberar una Mat. Por otro lado, DEBES liberar una implícita. Mi inglés es pobre, lo siento.

Cuestiones relacionadas