2017-10-20 194 views
2

我正在使用Python 3和OpenCV 3.我试图使用EigenFace识别器,它使用相同大小的图像作为训练和测试数据集。我从网络摄像头读取图像,然后将图像大小调整为200 x 200,但显示错误。Python OpenCV:无法调整图像

这是我的代码:

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() 

我得到的错误是:

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

回答

4

OpenCV的使用与NumPy数组作为基本数据类型来表示图像。您假定NumPy数组有一个resize方法来调整数据大小。不幸的是,这不是真的。我假设你会想用cv2.resize来改变图像的大小。在这种情况下,您可以调用cv2.resize,将图像以及所需形状作为元组来替代。你几乎正确的 - 只是交换的参数的顺序:

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

还注意到,调整大小的默认方法使用双线性插值。如果你想使用另一种方法,你将不得不提供额外的参数interpolation来做到这一点。如果你想进行三次插值,你会怎么做:

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

检查,详细了解cv2.resize文档:https://docs.opencv.org/3.0-beta/modules/imgproc/doc/geometric_transformations.html#resize

+0

Downvoter - 护理解释你downvote? – rayryeng

+0

到opencv 3.0 beta的链接是不好的。我建议使用链接到opencv 3.3 docs – Miki

+0

@Miki oops。谢谢。我会纠正的。 – rayryeng