OpenCV人脸检测报错:'int' object is not iterable问题求助
解决OpenCV人脸检测中TypeError: 'int' object is not iterable的问题
嘿,这个错误我之前也碰到过,来帮你捋捋怎么解决~
首先,你遇到的TypeError: 'int' object is not iterable,大概率是因为旧版本OpenCV里的detectMultiScale方法在没检测到人脸时,返回的是整数0而不是空列表——你用for (x, y, w, h) in faces:去遍历一个整数,肯定会报错呀。
另外看你贴的代码,cv2.rectangle(img, (x, y), (...这行明显没写完,这也会触发语法错误,得先把这行补完整。
下面给你具体的修复步骤:
1. 先处理detectMultiScale的返回值问题
在遍历faces之前,先判断它是不是可迭代的列表/数组,避免遍历整数的情况:
faces = faceDetect.detectMultiScale(gray, 1.3, 5) # 先检查faces是不是可迭代类型,避免返回0的坑 if isinstance(faces, (list, tuple, np.ndarray)): for (x, y, w, h) in faces: # 补全矩形绘制的代码,指定右下角坐标、颜色和线条宽度 cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 这里补上你原本要做的人脸识别和ID绘制逻辑 id, conf = rec.predict(gray[y:y+h, x:x+w]) cv2.putText(img, str(id), (x, y+h+30), font, 1, (0,0,255), 2)
2. 补全代码的缺失部分
你贴的代码里cv2.rectangle的参数不完整,必须指定矩形的右下角坐标(x+w, y+h)、RGB颜色值和线条宽度,不然代码连运行都过不了。
3. 额外的版本兼容提示
另外提一句,cv2.face.createLBPHFaceRecognizer()在OpenCV 3.x及以上版本里已经被改成cv2.face.LBPHFaceRecognizer_create()了,如果运行时碰到“找不到这个方法”的错误,记得调整这个写法。
最后给你贴个完整的修复后代码参考:
import cv2 import numpy as np # 用于判断数组类型,需要导入 faceDetect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') cam = cv2.VideoCapture(0) # 适配新版本OpenCV的写法 rec = cv2.face.LBPHFaceRecognizer_create() rec.load('recognizer/trainningData.yml') id = 0 font = cv2.FONT_HERSHEY_SIMPLEX while True: ret, img = cam.read() if not ret: break # 如果读取摄像头帧失败,直接退出循环 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = faceDetect.detectMultiScale(gray, 1.3, 5) # 先判断faces是否是可迭代的,避开返回0的情况 if isinstance(faces, (list, tuple, np.ndarray)): for (x, y, w, h) in faces: # 绘制人脸矩形框 cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 预测当前人脸的ID和置信度 id, conf = rec.predict(gray[y:y+h, x:x+w]) # 在人脸下方绘制ID文本 cv2.putText(img, str(id), (x, y+h+30), font, 1, (0, 0, 255), 2) cv2.imshow('Face Recognition', img) # 按ESC键(ASCII码27)退出程序 if cv2.waitKey(1) == 27: break # 最后别忘了释放摄像头资源和关闭窗口 cam.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者user7159290
相关产品推荐
相关产品推荐

