人脸/口罩检测模型添加FPS统计时触发TypeError(预期整数却传入字符串)问题求助
解决OpenCV人脸/口罩检测代码中的TypeError错误
嘿,我一眼就发现问题所在了——你把两个cv2.putText的调用逻辑硬塞到一行代码里,直接导致参数顺序完全错乱,这就是触发TypeError: an integer is required (got type str)的核心原因。
错误根源分析
cv2.putText的标准参数顺序是:
cv2.putText(图像对象, 要绘制的文本, 文本起始坐标, 字体类型, 字体缩放比例, 颜色, 线条粗细)
而你的代码里把FPS文本的绘制和人脸标签的绘制强行合并成了一行:
cv2.putText(frame,fps_disp, (10, 25),label,(startX, startY - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.45, color, 2)
这里第三个参数(10,25)是FPS的坐标,但后面紧接着的label被当成了字体类型参数(这个位置需要传入OpenCV的字体常量,比如cv2.FONT_HERSHEY_SIMPLEX,是整数类型),而字符串类型的label自然不符合要求,所以抛出了类型错误。
除此之外,你的代码还有两个小问题:
- 视频流初始化时漏了赋值:
vs = cv2.VideoCapture(0),原来的代码只写了cv2.VideoCapture(0),没有把对象赋值给vs,后续vs.read()会报错。 cv2.imshow的参数错误:第二个参数是窗口名称,你写了'Video Stream w/ FPS', frame,应该是cv2.imshow("Video Stream w/ FPS", frame)。
修正后的代码片段
下面是修复了这些问题的核心代码部分:
# 初始化视频流(补全赋值) vs = cv2.VideoCapture(0) start_time = time.time() display_time = 2 fc = 0 FPS = 0 # 循环处理视频帧 while True: ret, frame = vs.read() # 注意:vs.read()返回(ret, frame),需同时获取状态和帧 if not ret: break frame = imutils.resize(frame, width=800) fc += 1 TIME = time.time() - start_time if TIME >= display_time: FPS = fc / TIME fc = 0 start_time = time.time() fps_disp = "FPS: " + str(FPS)[:5] # 检测人脸与口罩 (locs, preds) = detect_and_predict_mask(frame, facenet, maskNet) # 分别绘制FPS文本和人脸标签(拆分两个putText调用) # 1. 绘制FPS到画面左上角 cv2.putText(frame, fps_disp, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 255), 2) # 2. 循环绘制每个人脸的标签和 bounding box for (box, pred) in zip(locs, preds): (startX, startY, endX, endY) = box (mask, withoutMask) = pred label = "Mask" if mask > withoutMask else "No Mask" color = (0, 255, 0) if label == "Mask" else (0, 0, 255) label = "{}: {:.2f}%".format(label, max(mask, withoutMask)*100) # 绘制人脸标签 cv2.putText(frame, label, (startX, startY - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.45, color, 2) # 绘制 bounding box cv2.rectangle(frame, (startX, startY), (endX, endY), color, 2) # 修正imshow参数 cv2.imshow("Video Stream w/ FPS", frame) key = cv2.waitKey(1) & 0xFF if key == ord("q"): break # 清理资源 cv2.destroyAllWindows() vs.release() # VideoCapture对象用release()释放资源,没有stop()方法
关键修复点总结
- 拆分了FPS和人脸标签的
cv2.putText调用,确保每个调用的参数顺序完全符合OpenCV要求。 - 补全了视频流对象的赋值
vs = cv2.VideoCapture(0),并修正了vs.read()的取值逻辑(增加了帧读取成功的判断)。 - 修正了
cv2.imshow的参数格式,以及视频流资源清理的方法(VideoCapture用release()而不是stop())。
现在运行修正后的代码,应该就能正常显示FPS统计和人脸/口罩检测结果了!
内容的提问来源于stack exchange,提问作者Abhishikth Vishnumolakala
相关产品推荐
相关产品推荐

