12
votes

Comment transformer un OpenCV CVMat de retour à Ndarray à Numpy?

Je suis le code dans OpenCV Cookbook pour l'interface Python pour transformer CVMat en tableau NUMPY:

mat = cv.CreateMat(3,5,cv.CV_32FC1)
cv.Set(mat,7)
a = np.asarray(mat)


0 commentaires

3 Réponses :


2
votes

Vous avez raison, l'exemple de livre de cuisine ne fonctionne pas non plus pour moi et je reçois la même sortie que possible (Win XP, Python 2.6.6, OpenCV 2.1., Numpy 1.5.1).

Peut-être que vous pouvez utiliser Quelque chose de similaire à: xxx


7 commentaires

Merci! C'est une solution réalisable, mais lorsque la dimension du tapis est grande, c'est-à-dire beaucoup plus grand que 3 et 5, je pense que le calcul de "myiste" va perdre beaucoup de temps, non?


@Pinkyjie: Utilisez des générateurs. Ceci n'est pas testé, mais cela pourrait fonctionner: myList = (((MAT [I, J] pour I dans la plage (3)) pour J dans la plage (5)))


@plaes: votre solution est la même avec @joaquin's.


@Pinkyjie: Cela dépend de la taille des dimensions et de telles que considérez-vous un temps de fonctionnement trop long ... Testez-le ...


@Pinkyjie, veuillez recommander d'utiliser un générateur (parenthèses) au lieu d'une liste (parenthèses) afin de sauvegarder la mémoire et de gagner de la vitesse lors de la gestion de grandes quantités de données.


@ PLAES, @ JOAQUIN, non familière avec le générateur, mais en utilisant "myList = ((tapis [i, j] pour i dans la plage (3)) pour J dans la plage (5))", "MyList" est un objet générateur, Pas une liste, donc np.array (myList) renvoie une matrice d'objet générateur qui enfreint mon esprit.


@Pinkyjie, oui, je sais. Pinkyjie a déjà dit "n'est pas testé". Les versions de liste fonctionnent. Qu'en est-il de la précipitation?



2
votes

pour la version 2.1 d'OpenCV, si vous avez besoin de Share la mémoire et si vous ne vous souciez pas d'un bit de programmation et d'emballage de Swig, vous pouvez essayer cette solution que j'ai utilisé pour Quelque temps: xxx

créer un en-tête, par exemple, mat_conversion.h: xxx

et un fichier d'interface (numpy_meets_opencv.i): xxx

compile: xxx

Enfin, vous pouvez faire vos affaires: xxx


4 commentaires

Je pense que vous n'avez pas compris ma question, votre réponse convertit Numpy.ndarray en CVMat, mais ce que j'ai demandé, c'est comment convertir CVMat en numpy.ndarray. Si vous voulez simplement convertir un tableau NUMPY en CVMAT, je pense qu'il existe un moyen facile. Voici un exemple: Data = np.array (plage (1,9), np.float32) a = cv.cv_32fc1) cv.setdata (a, données, cv.cv_autostep)


@Pinkyjie, j'ai envisagé le problème récurrent de travailler sur une image, parfois à l'aide d'outils numpus, d'autres fois à l'aide d'outils OpenCV, mais toujours de travailler sur les mêmes données en mémoire. La solution que vous avez présentée ci-dessus a surélevé un typeError dans mon système: "Dans la méthode" CvsetData ", argument 2 de type" vide ". C'est parce que les wrappers Python OpenCV ne jouent pas correctement.


Je pense que les interfaces que nous avons utilisées ne sont pas identiques, j'ai utilisé la nouvelle interface Python à partir de OpenCV 2.0, pas l'interface Python à base de Swig.


@Pinkyjie, je devinez C'est parce que j'utilise les packages pré-compilés pour Ubuntu (Python-OpenCV). Peut-être que les packages pré-compilés utilisent l'interface Swig. Merci de me l'avoir rappelé.



9
votes

Essayez d'utiliser Ajout [:,:] code> à la matrice (c.-à-d. Utiliser tapis [:,:] code> au lieu de mat code>) Votre appel à np.asarray code> - Cela permettra également asarray code> fonctionner sur des images.

Votre exemple: p>

>>> im = cv.CreateImage( ( 5 , 5 ) , 8 , 1 )
>>> cv.Set( im , 100 )
>>> im_array = np.asarray( im )
>>> im_array
array(<iplimage(nChannels=1 width=5 height=5 widthStep=8 )>, dtype=object)
>>> im_array = np.asarray( im[:,:] )
>>> im_array
array([[100, 100, 100, 100, 100],
       [100, 100, 100, 100, 100],
       [100, 100, 100, 100, 100],
       [100, 100, 100, 100, 100],
       [100, 100, 100, 100, 100]], dtype=uint8)


3 commentaires

Je teste votre réponse sur mon PC avec OpenCV 2.1, cela n'a pas fonctionné. Ajout [:,:] à la matrice a toujours donné la mauvaise sortie comme une matrice d'objet, votre version OpenCV est-elle identique à la mienne?


@Pinkyjie, désolé de l'entendre toujours ne fonctionnait toujours pas. J'utilise OpenCV 2.1 sur Ubuntu. La différence pourrait être de faire avec la version de numpy que vous utilisez (utilisez np.version.version pour savoir - J'utilise la version 1.3).


vraiment si étrange, j'utilise numpy 1.5.1