TypeError:必须为整数(类型为元组)

时间:2018-10-01 20:11:41

标签: opencv python-3.7

我正在尝试为人脸识别项目或程序设置检测器,但始终出现此错误:

TypeError: an integer is required (got type tuple)

我也尝试过更改:

cv2.putText(img, str(id), (x, y + h), font, 255)

cv2.putText(img, name, (x, y + h), font, 2, (0, 255, 0), 2)

这是我的代码:

import cv2
import numpy as np

faceDetect=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cam=cv2.VideoCapture(0)

rec = cv2.face.LBPHFaceRecognizer_create()
rec.read("trainer/training_data.yml")
id=0
font=(cv2.FONT_HERSHEY_SIMPLEX,1,1,0,1)

while(True):
    ret,img=cam.read()
    gray=cv2.cvtColor(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])
        cv2.putText(img,str(id),(x,y+h),font,255)
    cv2.imshow("FACEDETECTIONPT1",img)
    if(cv2.waitKey(1)==ord('q')):
        break
cam.release()
cv2.destroyAllWindows

8 个答案:

答案 0 :(得分:8)

此误导性错误消息的另一个可能原因是,如果imgnp.ndarray的视图,而不是连续的内存数据。所以如果您的代码与img一起使用,则执行img=np.flipud(img)之类的操作将失败。

解决方案是进行深复制,例如img=np.flipud(img).copy()

答案 1 :(得分:3)

以我的经验,该错误声明具有误导性。在我的情况下,坐标(x,y)在float中,而不是int中,并修复了该问题。

答案 2 :(得分:1)

正如其他人所讨论的,此错误具有误导性。当我尝试在使用PIL

打开的图像上应用打开的cv函数时,收到此错误

例如:

from PIL import Image
import cv2

# error if we use PIL to read image and apply cv2 functions
image = Image.open(path)
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# resolve error by reading image with cv2
image = cv2.imread(path)
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

答案 3 :(得分:1)

我通过在 int 而不是 float

中输入厚度来解决它

例如, 我改变了这个

cv2.rectangle(frame, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), color, 0.6 )

cv2.rectangle(frame, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), color, 2 )

答案 4 :(得分:0)

看着putText documentation,我发现您的font是一个元组,并且您正在尝试为putText填写多个参数:fontFace,{{ 1}},fontScalecolorthickness

也许您可以unpack that parameter(使用*运算符)来获取所需的内容:

lineType

答案 5 :(得分:0)

从字体中删除了参数,然后将我的putText编辑为cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2),这似乎对我有用。

答案 6 :(得分:0)

cv2.putText(img,name,(x,y + h),font,2,color,2)
并且颜色应以RGB格式提及
例如:(255,255,255)

我认为这应该对您有帮助

答案 7 :(得分:0)

我遇到了同样的问题,但是我解决了。消息可能是由不同类型的错误引起的,但是消息的内容与实际内容不符。

在我的情况下,我使用PIL读取了图像,并尝试对其进行openCV操作,这导致了此问题。您必须使用cv2.imread(image_path)使用cv2.rectangle()绘制矩形。发生此错误的另一个原因可能是您的点坐标是浮点型或双精度型,而不是整数。