2017-10-20 18 views
2

J'utilise Python 3 et OpenCV 3. J'essaie d'utiliser EigenFace Recognizer qui utilise des images de même taille pour l'ensemble de données d'apprentissage et de test. J'ai lu l'image d'une webcam et j'ai redimensionné les images à 200 x 200 mais cela montre une erreur.Python OpenCV: impossible de redimensionner l'image

Ceci est mon code:

faceDetect=cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 
cam=cv2.VideoCapture(0); 
rec=cv2.face.EigenFaceRecognizer_create() 
#rec=cv2.face.LBPHFaceRecognizer_create() 
rec.read("recognizer/EigenData.xml") 
id=0 

fontFace = cv2.FONT_HERSHEY_SIMPLEX 
fontScale = 1 
fontColor = (0, 0, 255) 

while(True): 
    ret,img=cam.read(); 

    resize_img = img.resize((200,200) , img) 
    gray=cv2.cvtColor(resize_img,cv2.COLOR_BGR2GRAY) 
    faces=faceDetect.detectMultiScale(gray,1.3,5); 

    for(x,y,w,h) in faces: 

     cv2.rectangle(img,(x,y),(x+w, y+h), (0,255,0) , 2) 
     id, conf=rec.predict(gray[y:y+h, x:x+w]) #EigenFace Predict 
     cv2.putText(img,str(id),(x,y+h), fontFace, fontScale, fontColor,thickness=2) 

    cv2.imshow("Face", img); 
    if(cv2.waitKey(1)==ord('q')): 
     break; 

cam.release() 
cv2.destroyAllWindows() 

L'erreur que je reçois est:

resize_img = img.resize((200,200) , img) 
TypeError: 'tuple' object cannot be interpreted as an integer 

Répondre

4

OpenCV utilise des tableaux numpy comme le type de données fondamental pour représenter les images. Vous supposez que le tableau NumPy a une méthode resize pour redimensionner les données. Ce n'est malheureusement pas vrai. Je suppose que vous voulez utiliser cv2.resize pour redimensionner l'image à la place. Dans ce cas, vous appelez cv2.resize avec l'image ainsi que la forme souhaitée en tant que tuple à la place. Vous avez presque correct - juste échanger l'ordre des arguments:

resize_image = cv2.resize(img, (200,200)) 

Veuillez également prendre note que la méthode par défaut de redimensionnement utilise une interpolation bilinéaire. Si vous souhaitez utiliser une autre méthode, vous devrez fournir un argument supplémentaire interpolation pour le faire. Si vous vouliez réaliser une interpolation cubique, vous feriez:

resize_image = cv2.resize(img, (200,200), interpolation=cv2.INTER_CUBIC) 

Consultez la documentation sur cv2.resize pour plus de détails: https://docs.opencv.org/3.0-beta/modules/imgproc/doc/geometric_transformations.html#resize

+0

Downvoter - soin d'expliquer votre downvote? – rayryeng

+0

Les liens vers opencv 3.0 beta sont mauvais. Je suggère d'utiliser des liens vers opencv 3.3 docs – Miki

+0

@Miki oups. Je vous remercie. Je vais corriger. – rayryeng