2009-11-27 4 views
3

Je suis en train de convertir des images prises à partir d'une capture (webcam) et faire un peu de traitement sur eux avec OpenCV, mais je suis un moment difficile ..Python/OpenCV: Conversion d'images prises de la capture

Lorsque en essayant de convertir l'image en niveaux de gris, le programme se bloque. (Python.exe a cessé de travailler)

Voici l'extrait principal de mon code:

newFrameImageGS = cv.CreateImage ((320, 240), cv.IPL_DEPTH_8U, 1) 

for i in range(0,5): 
    newFrameImage = cv.QueryFrame(ps3eye) 
    cv.CvtColor(newFrameImage,newFrameImageGS,cv.CV_BGR2GRAY) 
    golfSwing.append(newFrameImageGS) 

Quand j'essayer d'utiliser cvConvertScale je reçois l'erreur d'assertion:

src.size() == dst.size() && src.channels() == dst.channels() 

ce qui est logique, mais je suis assez confus sur la façon de convertir les images d'entrée de ma webcam dans des images qui peuvent être utilisées par des fonctions comme cvUpdateMotionHistory() et cvCalcOpticalFlowLK()

Des idées? Merci.

MISE À JOUR:

I converti l'image en niveaux de gris manuellement avec ceci:

for row in range(0,newFrameImage.height): 
      for col in range(0,newFrameImage.width): 
       newFrameImageGS[row,col] = (newFrameImage8U[row,col][0] * 0.114 + # B 
              newFrameImage8U[row,col][1] * 0.587 + # G 
              newFrameImage8U[row,col][2] * 0.299) # R 

Mais cela prend un certain temps .. et je ne peux toujours pas comprendre pourquoi cvCvtColor est à l'origine de la programmer pour planter.

Répondre

4

Pour une raison quelconque, CvtColor a causé le crash du programme lorsque la profondeur de l'image était de 8 bits. Quand je les ai convertis en 32 bits, le programme ne s'est plus écrasé et tout semblait fonctionner correctement. Je ne sais pas pourquoi, mais au moins ça marche maintenant.

newFrameImage = cv.QueryFrame(ps3eye) 

newFrameImage32F = cv.CreateImage((320, 240), cv.IPL_DEPTH_32F, 3) 
cv.ConvertScale(newFrameImage,newFrameImage32F) 

newFrameImageGS_32F = cv.CreateImage ((320,240), cv.IPL_DEPTH_32F, 1) 
cv.CvtColor(newFrameImage32F,newFrameImageGS_32F,cv.CV_RGB2GRAY) 

newFrameImageGS = cv.CreateImage ((320,240), cv.IPL_DEPTH_8U, 1) 
cv.ConvertScale(newFrameImageGS_32F,newFrameImageGS) 
+2

Merci Domenic (lol même nom). Je suis tombé sur ce sujet après avoir rencontré cette erreur et passer des heures à essayer de le réparer. –

+0

plantait parce que vous écriviez une matrice de 4 types plus gros (1 flottant = 4 octets, soit 32F = 4 * 8U) – fabrizioM

1

Il y a une erreur commune ici:

Vous créez une seule image dans la variable newFrameImageGS avant la boucle, puis écraser son contenu dans la boucle, qui est ensuite ajouté à une liste. Le résultat ne sera pas ce que vous attendez. La liste contiendra cinq références à la même instance d'image à la fin, puisque seule la référence d'objet est ajoutée à la liste, aucune copie de l'objet n'étant ainsi faite. Cette image contiendra la toute dernière image, de sorte que vous obtenez cinq de cette image en conséquence, ce qui n'est pas ce que vous voulez, je suppose. Veuillez consulter le didacticiel Python s'il n'est pas clair pour vous. Vous pouvez résoudre ce problème en déplaçant la première ligne du code ci-dessus dans le corps de la boucle for.

Une autre possibilité si la fixation ci-dessus ne vous aiderait pas:

La fonction CvtColor semble être le bon pour la conversion en niveaux de gris, car il peut convertir en un nombre différent de canaux.

Selon this manual la fonction CvtColor requiert une image de destination du même type de données que la source. Veuillez vérifier que newFrameImage est une image IPL_DEPTH_8U.

+0

Ok. J'ai essayé de déplacer cette déclaration à l'intérieur de la boucle, et le programme se bloque toujours. J'ai également vérifié la profondeur de newFrameImage, et il est 8, donc cela devrait être correct aussi. – Domenic