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)
3 Réponses :
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 à: p>
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?
pour la version 2.1 d'OpenCV, si vous avez besoin de créer un en-tête, par exemple, mat_conversion.h: p> et un fichier d'interface (numpy_meets_opencv.i): p> compile: p> Enfin, vous pouvez faire vos affaires: p>
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 I> 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é.
Essayez d'utiliser Ajout Votre exemple: p> [:,:] 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.
>>> 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)
Je teste votre réponse sur mon PC avec OpenCV 2.1, cela n'a pas fonctionné. Ajout [:,:] B> à 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 code> pour savoir - J'utilise la version 1.3).
vraiment si étrange, j'utilise numpy 1.5.1