Vous êtes sur la page 1sur 6

Introduction à la classe Mat

OpenCV a été libéré en 2001. À cette époque, il avait une API C qui était extrêmement lourd à
utiliser.
a été lancé OpenCV 2.0 avec une interface C ++ qui a rendu la vie des programmeurs plus facile.
L'API C ++ est une amélioration substantielle par rapport à l'API C avec de nombreuses
fonctionnalités intéressantes, y compris la gestion automatique de la mémoire.
La classe Mat, introduit dans OpenCV 2.0, a deux objectifs très importants
• Il sert de récipient d'image de base.
• Il sert également de la matrice.

1. Mat comme un conteneur d'image


OpenCV classe Mat contient deux parties
• En- tête : L' en- tête de matrice qui comprend des détails tels que la taille de la matrice,
moyen de stockage, l'adresse de stockage, etc.
• Données : La deuxième partie est un pointeur sur l'adresse en mémoire qui stocke les
valeurs de pixels de l'image.
Parce que la classe Mat enveloppe un pointeur vers les données de pixel réel, copie explicite de
données d'image est empêchée, ce qui conduit à l'accélération du temps d'exécution. Lorsqu'une
copie de la matrice de données de pixels réelle est nécessaire, la classe Mat fournit des méthodes
faciles à cloner ainsi.
Passons en revue quelques-unes des méthodes de la classe Mat lorsqu'il est utilisé comme un
conteneur d'image.

1.1. Lire une image


Vous pouvez lire dans une image à partir d' un fichier stocké en utilisant la fonction imread
// Read image in BGR format
Mat A = imread("image.jpg", IMREAD_COLOR);
// Read image in grayscale
Mat A = imread("image.jpg", IMREAD_GRAYSCALE);

Remarque : Lorsqueutilisez l'interface C ++,données allouées dans la classe Mat est gérée par
OpenCV. Vous n'avez pas besoin de libérer cette mémoire explicitesauf dans certaines circonstances
rares.

1.2. opération d'affectation


Dans une opération d'affectation, la partie de données d'une matrice n'est pas copiée. Dans les
exemples ci-dessous B et C pointent vers les mêmes données que A, mais ils ont des en-têtes
différents.
// Pointer of B points to the same data matrix as A
Mat B(A);
// C is assigned the same data matrix as A but a different header
Mat C = A;

1.3. Copier une partie d'une image


Dans les applications de vision par ordinateur, plusieurs fois nous travaillons avec seulement une
partie d'une image et non l'ensemble de l' image. Par exemple, dans une application, on peut d'
abord détecter un visage dans une image. Après le visage est détecté, nous ne sommes pas intéressés
par l'ensemble de l' image. Nous voulons travailler dans le système de coordonnées du rectangle
autour du visage.
Les opérations de copie en OpenCV fournit un moyen très efficace de le faire. Dans les exemples ci
- dessous, aucune donnée est copiée; seuls les en- têtes sont modifiés. L'image B pointe vers les
mêmes données que A, mais à tout algorithme de OpenCV, B apparaît comme une version recadrée
de A!
// Copy a Rectangle of width 50 and height 50 from point (15,15)
Mat B(A, Rect(15, 15, 50, 50));
/* Specific rows and columns can also be selected using
the Range function */
// Copies from rows 2 to 4 and columns 4 to 6
Mat B = A(Range(2, 4), Range(4,6));

1.4. Cloner une image


Si vous souhaitez copier l' en- tête et les données matrice que vous pouvez utiliser le clone ()
fonctions.
// The clone method is used to copy data and header.
B = A.clone();

1.5. Cloner une image avec un masque


Pour cloner une image avec un masque, utilisez copyTo
// The copyTo method allows you to clone with a binary mask.
A.copyTo(B,mask);

Dans l'exemple ci-dessous, l'image d'un original est clone avec le masque binaire dans le centre
pour produire une sortie B. Seuls les pixels ayant une valeur> 0 sont copiés vers B.
Image originale (A) Masque Clone (B) en utilisant copyTo

1.6. Trouver nombre de lignes, des colonnes et des canaux


Pour trouver le nombre de lignes, des colonnes et des canaux d'un objet Mat, il y a les fonctions
suivantes / attributs:
// Find rows and columns of a Mat object
Mat M;
// To find the number of rows
M.rows;
// To find the number of columns
M.cols;
// To find the number of channels
M.channels()

En variante, la taille () méthode retourne un objet de taille des caractères Taille (colonnes, lignes) .
Remarque: Le nombre de colonnes est égalelargeur et le nombre de lignes est égalela hauteur.
Ainsilorsspécification Tailleutilisanthauteur etlargeur, il faut utiliser la taille (largeur, hauteur) .
// Find height and width using Size
Mat M;
Size sz = M.size();
// number of rows
sz.height;
// number of columns
sz.width;

2. Mat comme une matrice


La classe Mat sert également de la classe Matrix par défaut dans OpenCV. Chaque objet Mat a un
type qui lui est associé. Les types de données sont spécifiés par des constantes de la forme suivante
CV_ <profondeur de bit> {U | S | F} C <number_of_channels>
Lorsque, U, S et F pour support Unsigned, Signée et virgule flottante respectivement.
Par exemple, quand on lit une image en couleurs dans un objet mat, le type de données est
CV_8UC3 ce qui signifie que chaque élément de la matrice (par exemple un pixel) comporte 8 bits
par canal (parce que l'intensité du pixel peut prendre 256 valeurs différentes), non signé (car pixel
les valeurs d'intensité ne vont pas en dessous de 0), et 3, à la fin représente les trois canaux de
l'image couleur.
D'autre part, si vous voulez créer une matrice 2x2 de nombres à virgule flottante, vous utilisez le
type d'être CV_32FC1 qui signifie données à virgule flottante 32 bits avec un seul canal.
Remarque : CV_32FC1 etpoint de CV_32F au même typedonnées.

2.1. Créer un objet Mat


Une matrice peut être créée de plusieurs façons.

2.1.1. L'utilisation Constructor


Mat M (no. De lignes, no. De cols, pas de canaux., Couleur)
// Create a 3x3 Matrix using the constructor
Mat M(3,3,CV_8UC3, Scalar(0,255,180));

Crée un 3 par 3 matrice ayant 9 éléments. Chaque élément comporte trois volets.
// Print a matrix using
cout << M << endl;

// Ouput
[0,255,180, 0,255,180, 0,255,180;
0,255,180, 0,255,180, 0,255,180;
0,255,180, 0,255,180, 0,255,180]

2.1.2. L'utilisation de tableaux de C / C ++


Un objet Mat peut également être créé en utilisant des tableaux de C / C ++.
L'exemple ci-dessous montre comment créer des matrices multidimensionnelles. Le premier
argument passé au constructeur Mat est le nombre de dimensions. la matrice de AC / C est d'abord
utilisée pour spécifier la taille de chaque dimension. Un pointeur vers le tableau est ensuite transmis
au constructeur de Mat. La fonction scalaire :: tous (0) initialise tous les pixels / éléments de la
matrice avec la valeur 0.
Exemple
// Create Mat using C/C++ arrays
// First define the size of the matrix
int size[]={4,4};

// Create a 2-dimensional matrix with the above size filled with 20.
Mat L(2, size, CV_8U, Scalar::all(20));

// It should be noted that here we have used a 2-dimensional matrix


// so that we can print the output.
// You can also create higher dimensional matrices
// but then it cannot be printed directly with a simple cout.

cout << L << endl;

// Output
[ 20, 20, 20, 20;
20, 20, 20, 20;
20, 20, 20, 20;
20, 20, 20, 20]

2.1.3. L'utilisation méthode de création


La méthode de création de la classe Mat peut être utilisé pour créer une matrice aussi bien.
M.create (lignes, cols, nombre de canaux)
// Create a matrix using the create method
M.create(4, 4, CV_8UC(2));
cout << M << endl;

// Output
[ 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0]

En utilisant cette méthode nous ne pouvons pas initialiser la matrice selon notre choix de valeur.
Cela crée une matrice 4 x 4 avec toutes les valeurs initialisées à 0. Impression de la matrice en
utilisant Cout imprimerait la sortie suivante.

2.2. Ceux, zéros et matrices identité


Mat a aussi un certain nombre de fonctions pratiques qui aident à créer des matrices facilement de
base.
Pour créer une matrice avec toutes les entrées de données initialisées à 1:
Mat A = Mat :: les (pas de lignes, pas Col., et pas datatype de canaux...)
// Create a matrix with all elements initialized to 1
Mat M1 = Mat::ones(3, 3, CV_64F);
cout << M1 << endl;

// Output
[1,1,1;
1,1,1;
1,1,1]

Pour créer une matrice avec toutes les entrées de données initialisées à 0:
Mat A = Mat :: zéros (pas de lignes, pas Col., et aucun type de données de canaux...)
// Create a matrix with all elements initialized to 0
Mat M2 = Mat::zeros(3, 3, CV_64F);
cout << M2 << endl;

// Output
[0,0,0;
0,0,0;
0,0,0]

Pour créer une matrice d'identité (une matrice d'identité a tous les principaux éléments de la
diagonale que les éléments 1 et de repos sont 0)
Mat A = Mat :: oeil (pas. Rangées, non. Col., et pas de type de données canaux.)
// Create 3x3 identity matrix
Mat M3 = Mat::eye(3, 3, CV_64F);
cout << M3 << endl;

// Output
[1,0,0;
0,1,0;
0,0,1]

2.3. Petites matrices Initialiser


Pour les petites matrices, nous pouvons initialiser des éléments individuels à l'aide d'une liste
séparée par des virgules.
// Small matrix initialization
Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, 6, 0, -3, 3);
cout << C << endl;

// Output
[ 0,-1, 0;
-1, 5, 6;
0, -3, 3]