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

如何检测摄像头帧内无人脸以控制Arduino舵机?

解决方案

问题根源

你的代码中,所有位置判断与输出逻辑都嵌套在for (x,y,w,h) in faces循环内部——当帧内无人脸时,faces为空,循环根本不会执行,因此既不会触发“no face detected”提示,也不会输出任何新指令,导致Arduino始终保留最后一次收到的位置信号,舵机维持之前的动作。

修改后的代码

import cv2
import sys

cascPath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascPath)

video_capture = cv2.VideoCapture(1)
while True:
    # Capture frame-by-frame
    ret, frame = video_capture.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.CASCADE_SCALE_IMAGE
    )

    # 先判断是否检测到人脸
    if len(faces) == 0:
        print('no face detected')
    else:
        # 取第一个检测到的人脸(如需跟踪最大人脸,可添加人脸面积排序逻辑)
        x, y, w, h = faces[0]
        # 绘制人脸矩形框
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
        # 根据x坐标判断位置并输出指令
        if x >= 300:
            print("right")
        elif x <= 240:
            print("left")
        else:
            print('mid')
    
    # Display the resulting frame
    cv2.imshow('Video', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything is done, release the capture
video_capture.release()
cv2.destroyAllWindows()

关键修改点

  • 新增无人脸检测逻辑:通过len(faces) == 0直接判断帧内无人脸的状态,触发对应提示
  • 调整逻辑结构:将人脸处理从循环中移出,改为处理单个人脸(避免多脸时重复输出指令;如需支持多脸跟踪,可保留循环并添加筛选逻辑,比如选择面积最大的人脸)
  • 简化条件判断:移除冗余的x<300 and x>240判断,因为前面的条件已经排除了左右区间,剩余自然为中间位置

舵机保持位置的说明

当检测到无人脸时,代码仅输出no face detected,不发送left/right/mid指令——Arduino端只要不收到新的位置指令,就会维持当前舵机角度,实现“保持当前位置”的需求。如果需要明确的保持指令,可将print('no face detected')改为print('hold'),并在Arduino代码中添加对应处理逻辑。

内容的提问来源于stack exchange,提问作者Fadi EID

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:35:13