web-dev-qa-db-fra.com

OpenCV: IplImage contre Mat, lequel 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 à partir de la version 2.0+, quand devrais-je utiliser des matrices (Mat) et quand devrais-je utiliser IplImage?

Le livre de Bradky indique d'avance (Préface) qu'il est basé sur OpenCV 2.0 et qu'il utilise principalement IplImage dans son exemple de code, mais la documentation en ligne plus récente donne l'impression que Mat est désormais un type de données fourre-tout pour les images, les masques, etc. , un peu comme une matrice 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 de nouveau code? Ou est-ce que les IplImages me permettent de faire des choses importantes que les Mats ne font pas?

Merci.

56
SSilk

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

La nouvelle structure Mat fait partie de la structure C++. Donc, évidemment, il est orienté objet. En outre, il gère toute la mémoire pour vous! Il garde une trace de références à cela. Puis le nombre de références passe à zéro, il est automatiquement libéré. C'est une superbe fonctionnalité!

Optez pour Mat. Il devrait être facile de traduire le code de la variable IplImage en la chose Mat si vous utilisez un IDE doté de Intellisense (une liste des fonctions, variables, etc. possibles lors de la frappe).

73
Utkarsh Sinha

Je recommanderais fortement d'utiliser Mat. Je l'utilise depuis un moment et c'est génial. Les fonctions membres et les expressions de matrice simplifient beaucoup le traitement de IplImage et, comme vous l'avez dit, il s'agit d'un type de données fourre-tout.

Optez pour Mat!

16
Jacob

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

L’inconvénient majeur de l’interface C++ réside dans le fait que beaucoup d’entre elles sont intégrées. Les systèmes de développement actuels ne prennent en charge que le système C. Par conséquent, à moins que vous ciblez des plates-formes intégrées, inutile d'utiliser le les anciennes méthodes (à moins que vous ne soyez un programmeur masochiste et que vous demandiez des ennuis à ).

12
Sunny

merci pour l'aide. 

J'ai également découvert depuis la publication de cette question qu'une fonction avec un argument Mat peut prendre un IplImage directement à la place de cet argument Mat, ce qui facilite la mise à jour de votre code s'il est déjà divisé en fonctions pratiques. Il suffit de changer les arguments de la fonction de IplImage* à Mat, puis de modifier la fonction pour qu’elle fonctionne sur une Mat. Les autres codes appelant cette fonction devraient quand même fonctionner correctement (selon mon expérience).

7
SSilk

Mat est beaucoup plus facile et plus facile à utiliser. Il représente l’image sous forme de matrice ... c'est aussi plus rapide. Je recommanderais Mat à IplImage.

1
Mojo Jojo

Mise à jour rapide:

Avec l'avènement de OpenCV 4 , la réponse à la question sera plus simple, car IplImage et tout ce qu'ils appellent maintenant "l'ancienne API C" seront progressivement supprimés. Dans OpenCV 4.0 "alpha", IplImage est déjà parti - de même que CvMat

Donc, si vous travaillez avec OpenCV4.0 +, utilisez la classe de tapis ... car vous n'avez pas le choix. 

[NB: Bien sûr, si vous utilisez toujours l'ancienne version d'OpenCV, la question est toujours d'actualité.]

1
godot

Je suggérerais Mat. La récupération de place est automatique et l'application est donc plus fiable et génère moins de fuites de mémoire. De plus, Mat est une méthode de stockage de données plus récente. Ainsi, si vous êtes un débutant débutant avec OpenCV, Mat est plus récent et nécessite un codage moins minutieux pour une application complète.

La compatibilité est une chose dans laquelle Mat sera un peu pire. IplImage est disponible depuis plus longtemps et offre donc une plus grande compatibilité avec la plupart des choses. Je pense que vous pouvez aussi utiliser IplImage avec Mat, sinon, IplImage> Mat est également assez simple à réaliser.

Étant donné qu'Iplimage est disponible depuis beaucoup plus longtemps, vous trouverez probablement une plus grande sélection d'échantillons.

Voici mes deux sous-produits: 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 par Mat. Comme il s'agit d'une nouvelle mise en œuvre, il est plus facile d'apprendre et de bien faire les choses!

1
yash101

J’ai commencé par utiliser Mat, qui est puissant et facile à utiliser. MAIS lire ou réutiliser ce code qui était "vieux", je devais savoir quoi faire avec iplimages, c’est facile de Utilisez, aussi . Mais l’avenir, c’est Mat, je pense.Et n'oublions pas Mat dans une CLASSE, cela signifie que vous n’avez pas besoin de libérer un Mat.Au contraire, vous DEVEZ libérer un implimage . Mon anglais est pauvre, désolé.

0
jsxyhelu

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

0
Utkarsh Deshmukh

Iplimage est une structure de l’interface C dans Opencv, et Mat convient mieux aux programmes C++ et prend en charge certains styles C++ tels que les paramètres ref et les opérateurs de flux, etc. créer et libérer, ce que Ipliamge appellera une interface cvXXX à compléter. De plus, Mat est une nouvelle structure de Opencv2 qui, à mon avis, est un symbole de développement pour les anciens. Je lui souhaite de l'aide. 

0
user2226360