TypeError: an integer is required (got type tuple)

TypeError: an integer is required (got type tuple)

我正在尝试为面部识别项目或程序设置我的检测器,但我不断收到此错误:

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

查看 putText documentation,我看到你的 font 是一个元组,你正试图为 putText 填写多个参数:fontFacefontScalecolorthicknesslineType

也许您可以 unpack that parameter 得到您需要的(使用 * 运算符):

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

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

根据我的经验,错误陈述具有误导性。在我的例子中,坐标 (x, y) 在 float 中而不是 int 中并修复它解决了这个问题。

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

之类的操作,它将失败

解决方法是做深拷贝,比如img=np.flipud(img).copy()

正如其他人所讨论的,此错误具有误导性。当我尝试在使用 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)

cv2.putText(img, 名称, (x, y + h), 字体, 2, 颜色, 2)
颜色应以 RGB 格式提及
例如:(255,255,255)

我想这应该对你有帮助

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

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

我通过在 int 中输入 Thickness 而不是 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 )

在我的例子中,PIL 图像的模式是 'P' 代表调色板。我将其转换为 RGB,现在错误消失了。