【问题标题】:TypeError: an integer is required (got type tuple)TypeError:需要一个整数(获取类型元组)
【发布时间】:2019-03-06 23:35:35
【问题描述】:

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

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

【问题讨论】:

  • cv2.putText(img, name, (x, y + h), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 255, 0), 2)
  • @AmanRelan,如果我的回答有帮助,请采纳。否则请添加评论,以便我们了解如何更好地解决您的问题。
  • @SunnyPatel 先生,我试过你的东西,但它仍然显示相同的错误,但后来我从字体中删除了参数并将我的 putText 编辑为cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2),这似乎对我有用。 . 但即便如此,还是非常感谢您先生 :)

标签: opencv python-3.7


【解决方案1】:

查看putText documentation,我看到您的font 是一个元组,并且您正在尝试为putText 填写多个参数:fontFace、fontScale、color、@987654329 @ 和 lineType。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我遇到了完全相同的问题!这个错误信息肯定应该在 opencv 中修复。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          我认为这应该对你有所帮助

          【讨论】:

            【解决方案7】:

            我有同样的问题,但我解决了。消息可能由不同类型的错误引起,但消息的内容并不是它实际所说的。

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

            【讨论】:

              【解决方案8】:

              我通过在 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 )
              

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-06-14
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-06-20
                  • 1970-01-01
                  相关资源
                  最近更新 更多