OpenCV: IplImage versus Mat, qui utiliser?

Je suis assez nouveau sur OpenCV (environ 2 mois maintenant). J’ai le livre Learning OpenCV de Bradski et Kaehler. Ma question est la suivante: si je veux tout faire en mode 2.0+, quand dois-je utiliser les masortingces (Mat) et quand dois-je utiliser IplImage?

Le livre de Bradky mentionne (Preface) qu’il est basé sur OpenCV 2.0, et qu’il utilise principalement IplImage dans son exemple de code, mais que la documentation en ligne plus récente donne l’impression que Mat est désormais un type de données attrayant pour les images, masques, etc. , un peu comme une masortingce de base dans Matlab. Cela me laisse à me demander si IplImage devrait être considéré comme obsolète.

Alors, devrais-je éviter totalement IplImages lors de l’écriture d’un nouveau code? Ou y a-t-il des choses importantes que IplImages me permet de faire, contrairement à Mats?

Merci.

IplImage a été en OpenCV depuis le tout début. C’est une partie de l’interface C pour OpenCV. Vous devez allouer et désallouer la mémoire pour les structures IplImage vous-même. (rappelez-vous les commandes cvReleaseImage ?)

La nouvelle structure Mat fait partie de la structure C ++. Donc, évidemment, il est orienté object. En outre, il gère toute la mémoire pour vous! Il garde une trace de ses références. Ensuite, le nombre de références passe à zéro, il se désalloue automatiquement. C’est une superbe fonctionnalité!

Aller pour Mat . Il devrait être facile de traduire le code de la chose IplImage en la chose Mat si vous utilisez un IDE qui a Intellisense (il affiche une liste des fonctions possibles, des variables, etc. pendant que vous tapez)

Je recommande fortement l’utilisation de Mat . Je l’utilise depuis un moment, et c’est génial. Les fonctions membres et les expressions masortingcielles simplifient beaucoup plus les choses que l’utilisation d’ IplImage et, comme vous l’avez dit, il s’agit d’un type de données fourre-tout.

Allez pour le Mat !

Je dirais que cela dépend en fait de la plateforme sur laquelle vous allez exécuter votre application. Si vous développez une application pour un système intégré, vous utiliserez probablement C. Dans ce cas, vous devrez utiliser IplImage . Citation du tutoriel :

L’inconvénient majeur de l’interface C ++ réside dans le fait que de nombreux systèmes de développement embarqués ne prennent actuellement en charge que C. Par conséquent, à moins de cibler des plates-formes embarquées, il est inutile d’utiliser les anciennes méthodes pour des problèmes).

Merci pour l’aide.

J’ai également découvert depuis la publication de cette question qu’une fonction avec un Mat comme argument peut prendre une IplImage directement à la place de cet argument Mat , ce qui facilite la mise à jour de votre code en morceaux s’il est déjà divisé en fonctions pratiques. Changez simplement les arguments de fonction de IplImage* en Mat , puis modifiez la fonction pour qu’elle fonctionne sur un Mat . Tout autre code appelant cette fonction devrait toujours fonctionner correctement (cela a été mon expérience).

Je suggérerais Mat. Le ramasse-miettes est automatique et l’application est donc plus fiable et présente moins de memory leaks. En outre, Mat est une nouvelle méthode de stockage des données, donc si vous êtes un débutant, il suffit de commencer par OpenCV, Mat est plus récent et nécessite un codage moins minutieux pour créer une application complète.

La compatibilité est une chose dans laquelle Mat sera un peu pire. IplImage a été disponible plus longtemps et a donc une plus grande compatibilité avec la plupart des choses. Je crois que vous pouvez également utiliser IplImage avec Mat, et sinon, IplImage> Mat est également très simple à réaliser.

Iplimage étant disponible depuis beaucoup plus longtemps, vous trouverez probablement un plus grand choix d’échantillons.

Voici mes deux cents: En tant que recrue (toujours en train d’apprendre des trucs) dans le traitement de la vision avec OpenCV, choisissez-en un, Mat ou IplImage et soyez vraiment doué. Cependant, apprenez au moins les bases de l’autre afin de savoir quoi faire si vous devez utiliser une fonction qui n’est pas compatible avec l’autre.

Mais pour me répéter, si vous êtes un débutant, essayez de commencer avec Mat. Comme il s’agit d’une nouvelle implémentation, il est plus facile d’apprendre et de faire les choses correctement!

Mat est beaucoup plus facile et facile à utiliser. Il représente l’image en tant que masortingce. c’est plus rapide aussi. Je recommanderais Mat over IplImage.

Iplimage est une structure de l’interface C dans Opencv, et Mat est plus adapté au programme C ++ et prend en charge certains styles C ++ comme le paramètre ref et l’opérateur de stream. Bien qu’ils soient tous orientés object, Mat inclut plus de méthodes qu’Iplimage, créer et publier, ce que Ipliamge appellerait une interface cvXXX à compléter. De plus, Mat est une nouvelle structure d’Opencv2, qui, je pense, est un symbole de développement pour les anciens. Je souhaite que cela aide.

Je crois que cv :: Mat est beaucoup plus pratique. c’est plus générique. Nous pouvons voir IplImage être un sous-ensemble de cv :: Mat. Le type de données par défaut pour IplImage est un entier non signé alors que pour cv :: Mat est double. Il est donc beaucoup plus facile d’utiliser Mat pour toute opération mathématique.

J’ai commencé à utiliser opencv à peu près en 2012 ou à peu près. J’ai donc commencé avec Mat, qui est puissant et facile à utiliser. Mais pour lire ou réutiliser ce code qui était “ancien”, utiliser aussi. Mais l’avenir, c’est Mat, je pense. Et n’oubliez pas Mat dans une CLASSE, cela signifie que vous n’avez pas besoin de sortir un Mat. D’autre part, vous devriez libérer une implimage. Mon anglais est pauvre, désolé.

Lors de l’écriture d’une routine de détection Blob, j’ai remarqué qu’en utilisant

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

Est beaucoup plus rapide que d’utiliser

 Mat image; image.at(x,y) = ...; 

Environ 5 fois plus rapide. Cela peut être dû au fait que j’ai utilisé une boucle X, Y nestede pour Mat et une boucle unique pour IplImage. Mais si vous devez écrire des routines qui fonctionnent directement à partir de pixels, je restrai fidèle à IplImage.