imread renvoie une Mat, pas CvMat. Ils sont les deux interfaces différentes (Mat/imread pour le C++ et le chargement initial... et Cv.. pour C de l'interface).
L'interface C++ est plus agréable, plus sûr et plus facile à utiliser. Il gère automatiquement la mémoire pour vous, et vous permet d'écrire moins de code pour la même tâche. Le OpenCV gars de plaider pour l'utilisation de C++, à moins que des exigences du projet vous forcer à C.
Noter que, sauf indication contraire, toutes les matrices des affectations de référence, les mêmes données. Dans l'exemple ci-dessus, le crop matrice de points à image, et la valeur zéro correspond à l'ensemble de cette partie spécifique de la image à 0.
Pour créer une nouvelle copie de données, usage Tapis::copyTo, ou Mat::clone();
Et l'interface C
IplImage* pImg = CvLoadImage("path/to/myimage.jpg");
if(pImg == NULL)
return;
//... big bloat to do the same operations with IplImage
CvShowImage("Image", pImg);
cvWaitKey();
CvReleaseImage(&pImg); //Do not forget to release memory.
//end code here
Si vous souhaitez ajouter une Machine d'Apprentissage des concepts dans OpenCV pour les différents algorithmes de suivi (par exemple OpenTLD), vous pouvez facilement accéder à des données à l'aide de Tapis.données pour obtenir pointeur vers le véritable matrice.
De nombreux utilitaires de OpenCV (par exemple CalcOpticalFlowPyrLK, etc) nécessitent Mat. Je vous suggère d'utiliser le Tapis. IplImage est vieille chose maintenant.
Cela dépend de la façon dont vous êtes à l'aise avec les pointeurs.Dans IplImage vous pouvez accéder aux données comme
data[i*widthstep+j*nchannels +k]
où i,j,k sont quelques-uns des entiers qui est assez facile d'approche. Normal matrice de dimension 3 n'est pas si facile d'accéder aux données. Pour normal de la matrice de données d'accès est un[i][j]
*(*(a + i) + j) is the value of jth element of ith row in matrix a
Cette structure a été hérité de l'IPL bibliothèque
(c'est le processeur Intel Bibliothèque de Traitement d'Images) désormais intégré à l'IPP (bibliothèque de l'Intel
Integrated Performance Primitives de la bibliothèque). Si vous utilisez le code et les bibliothèques qui ont été créés avec
l'ancienne interface C, vous pourriez avoir besoin de manipuler ces IplImage structures. Heureusement,
il est un moyen pratique pour convertir un IplImage dans un cv::Mat objet.
La fonction cvLoadImage est la C-fonction d'interface pour charger les images. Le deuxième paramètre
dans le constructeur de la cv::Mat objet indique que les données ne seront pas copiés (
true si vous voulez une nouvelle copie, alors que le faux est la valeur par défaut de sorte qu'il pourrait avoir été omis),
qui est à la fois IplImage et image4 de partager les mêmes données d'image. Vous devez être prudent
ici pour ne pas créer balançant des pointeurs. Pour cette raison, il est plus sûr d'encapsuler le IplImage
pointeur dans le comptage de références pointeur de classe fourni par OpenCV 2:
cv::Ptr iplImage = cvLoadImage("c:\img.jpg");
Sinon, si vous avez besoin de libérer la mémoire pointé par le IplImage de la structure, vous
besoin de faire explicitement:
cvReleaseImage(&iplImage);
N'oubliez pas, vous devriez éviter d'utiliser cette déprécier la structure de données. Au lieu de cela, utilisez toujours
cv::Mat.
imread
renvoie uneMat
, pasCvMat
. Ils sont les deux interfaces différentes (Mat
/imread
pour le C++ et le chargement initial... et Cv.. pour C de l'interface).L'interface C++ est plus agréable, plus sûr et plus facile à utiliser. Il gère automatiquement la mémoire pour vous, et vous permet d'écrire moins de code pour la même tâche. Le OpenCV gars de plaider pour l'utilisation de C++, à moins que des exigences du projet vous forcer à C.
Exemple (C++)
Noter que, sauf indication contraire, toutes les matrices des affectations de référence, les mêmes données. Dans l'exemple ci-dessus, le
crop
matrice de points àimage
, et la valeur zéro correspond à l'ensemble de cette partie spécifique de laimage
à 0.Pour créer une nouvelle copie de données, usage Tapis::copyTo, ou Mat::clone();
Et l'interface C
OriginalL'auteur Sam
IplImage et Mat sont deux convertibles.
Je vous suggère d'utiliser Tapis et imread(), car il est très facile d'obtenir des données à partir de Tapis.
Mat::données renvoie un pointeur vers le véritable matrice de données qui en 1D et les valeurs sont facilement accessibles. http://opencv.itseez.com/modules/core/doc/old_basic_structures.html?highlight=mat#union%20data
Si vous souhaitez ajouter une Machine d'Apprentissage des concepts dans OpenCV pour les différents algorithmes de suivi (par exemple OpenTLD), vous pouvez facilement accéder à des données à l'aide de Tapis.données pour obtenir pointeur vers le véritable matrice.
De nombreux utilitaires de OpenCV (par exemple CalcOpticalFlowPyrLK, etc) nécessitent Mat. Je vous suggère d'utiliser le Tapis. IplImage est vieille chose maintenant.
OriginalL'auteur Froyo
Cela dépend de la façon dont vous êtes à l'aise avec les pointeurs.Dans IplImage vous pouvez accéder aux données comme
où i,j,k sont quelques-uns des entiers qui est assez facile d'approche. Normal matrice de dimension 3 n'est pas si facile d'accéder aux données. Pour normal de la matrice de données d'accès est un[i][j]
OriginalL'auteur nbsrujan
De OpenCV_2 livre de cuisine:
Cette structure a été hérité de l'IPL bibliothèque
(c'est le processeur Intel Bibliothèque de Traitement d'Images) désormais intégré à l'IPP (bibliothèque de l'Intel
Integrated Performance Primitives de la bibliothèque). Si vous utilisez le code et les bibliothèques qui ont été créés avec
l'ancienne interface C, vous pourriez avoir besoin de manipuler ces IplImage structures. Heureusement,
il est un moyen pratique pour convertir un IplImage dans un cv::Mat objet.
IplImage* iplImage = cvLoadImage("c:\img.jpg");
cv::Mat image4(iplImage,false);
La fonction cvLoadImage est la C-fonction d'interface pour charger les images. Le deuxième paramètre
dans le constructeur de la cv::Mat objet indique que les données ne seront pas copiés (
true si vous voulez une nouvelle copie, alors que le faux est la valeur par défaut de sorte qu'il pourrait avoir été omis),
qui est à la fois IplImage et image4 de partager les mêmes données d'image. Vous devez être prudent
ici pour ne pas créer balançant des pointeurs. Pour cette raison, il est plus sûr d'encapsuler le IplImage
pointeur dans le comptage de références pointeur de classe fourni par OpenCV 2:
cv::Ptr iplImage = cvLoadImage("c:\img.jpg");
Sinon, si vous avez besoin de libérer la mémoire pointé par le IplImage de la structure, vous
besoin de faire explicitement:
cvReleaseImage(&iplImage);
N'oubliez pas, vous devriez éviter d'utiliser cette déprécier la structure de données. Au lieu de cela, utilisez toujours
cv::Mat.
OriginalL'auteur Ahmed Ramzy