Question

J'essaie de convertir des images prises à partir d'une capture (webcam) et de les traiter avec OpenCV, mais je vis un temps difficile.

Lorsque vous essayez de convertir une image en niveaux de gris, le programme se bloque. (Python.exe a cessé de fonctionner)

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)

Lorsque j'essaie d'utiliser cvConvertScale, j'obtiens l'erreur d'assertion:

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

ce qui a du sens, mais je ne sais pas trop comment convertir les images d'entrée de ma webcam en images pouvant être utilisées par des fonctions telles que cvUpdateMotionHistory () et cvCalcOpticalFlowLK ()

Des idées? Merci.

UPDATE:

J'ai 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 comprends toujours pas pourquoi cvCvtColor provoque le blocage du programme.

Était-ce utile?

La solution

Pour une raison quelconque, CvtColor a provoqué le blocage du programme lorsque la profondeur de l'image était de 8 bits. Lorsque je les ai convertis en 32 bits, le programme ne s’est plus écrasé et tout semblait fonctionner correctement. Je ne sais pas du tout 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)

Autres conseils

Il y a une erreur commune ici:

Vous créez une seule image dans la variable newFrameImageGS avant , puis écrasez son contenu dans la boucle, qui est ensuite ajoutée à 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, étant donné que seule la référence de l'objet est ajoutée à la liste, aucune copie de l'objet ne se faisant de cette manière. Cette image contient la toute dernière image. Vous obtenez donc cinq images, 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 résoudre ce qui précède ne vous aiderait pas:

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

Selon ce manuel , le CvtColor La fonction nécessite 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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top