tutorial para examples descargar opencv

para - opencv python



OpenCV: IplImage versus Mat, ¿cuál usar? (10)

Al escribir una rutina de detección de Blob noté que usando

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) = ...;

Aproximadamente 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.

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?

El libro de Bradky dice por adelantado (Prefacio) que está escrito basado 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.


Comencé 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 acerca de las imágenes, es fácil uso, también. Pero el futuro es Mat, creo. Y no olvides Mat en una CLASE, es decir, no necesitas liberar una Mat. Por otra parte, DEBES liberar una implícita. Mi inglés es pobre, lo siento.


Creo que usar 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.


Diría que esto realmente dependería 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 del tutorial :

La desventaja principal de la interfaz C ++ es que muchos sistemas de desarrollo incrustados en este momento solo admiten C. Por lo tanto, a menos que esté apuntando a plataformas integradas, no tiene sentido usar los métodos antiguos (a menos que sea un programador masoquista y está preguntando para problemas).


Iplimage es una estructura de la interfaz C en Opencv, y Mat es más adecuado para el programa 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 en sí que Iplimage, como crear y lanzar, que Ipliamge llamaría alguna 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.


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 Yo recomendaría Mat sobre IplImage.


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

¡Ve por Mat !


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 en la 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 (aún aprendiendo trucos) en el procesamiento de la visión con OpenCV, elija uno, Mat o IplImage y hágase realmente bueno 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 para repetirme, 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!


gracias por la ayuda.

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


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

La nueva estructura Mat es una 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!

Ir por Mat . Debería ser fácil traducir el código de la IplImage al Mat thingy si está utilizando un IDE que tiene Intellisense (despliega una lista de posibles funciones, variables, etc. a medida que escribe)