You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

人脸/口罩检测模型添加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自然不符合要求,所以抛出了类型错误。

除此之外,你的代码还有两个小问题:

  1. 视频流初始化时漏了赋值:vs = cv2.VideoCapture(0),原来的代码只写了cv2.VideoCapture(0),没有把对象赋值给vs,后续vs.read()会报错。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:52:43