米菲爸爸 发表于 2024-9-29 11:26:09

【行空板扩展版】基于OpenCV人脸识别的“人脸跟随”系统

行空板自带的接口数量有限,使用时可能不够便利。为了解决这一问题,DFRobot推出了一款扩展板。这款扩展板大大简化了连接高功率设备的过程,如舵机和电机。通过扩展板,我们可以更灵活地进行项目开发,充分利用各种外设,提高制作效率和设备兼容性。这不仅扩展了行空板的应用场景,还为创客提供了更广阔的创作空间。
https://makelogimg.dfrobot.com.cn/makelog/6114d8a33cfdd182e138a5a3/18b172f71c78542852cb00a17a22e4f2.png

下面是一个舵机测试程序注意:这里如果需要从按键中断中改变主循环里的变量需要声名变量为global类型https://makelogimg.dfrobot.com.cn/makelog/6114d8a33cfdd182e138a5a3/44b019072bcf345d90aed59012f5c701.png在测试过程中发现扩展板上提供的pin脚电压只有3.3v对于一些大功率的外设来说还是不太理想,5v的pin脚只有一路i2c可以使用,当要驱动两组舵机的时候需要从5v i2c这里引出一对5v供电,这里不太方便希望未来的产品里可以有所改进
提高供电能力后对舵机的控制变得十分平滑。
在此基础上我开发了一个基于OpenCV人脸识别的“人脸跟随”系统
【物料】行空板 x1行空板扩展版 x1舵机 MG996R x2usb摄像头 x112v变压器 x1
【连接图】理想连接图https://makelogimg.dfrobot.com.cn/makelog/6114d8a33cfdd182e138a5a3/5d768528d8eaa7377ddfcd8928fb5b1d.png实际连接图https://makelogimg.dfrobot.com.cn/makelog/6114d8a33cfdd182e138a5a3/1d56095ac40ae8efe8089e3623585f49.png
【开发环境】Mind+ python模式
https://www.bilibili.com/video/BV1PcxuesErT/
import cv2
from pinpong.board import Board, Pin, Servo
import time

# 初始化级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 舵机初始位置
servo_x_pos = 45# 横向舵机初始角度
servo_y_pos = 60# 竖向舵机初始角度

Board().begin()
servo_x = Servo(Pin(Pin.P2))
servo_y = Servo(Pin(Pin.P0))

def send_servo_command(x_pos, y_pos):
    servo_x.write_angle(x_pos)
    servo_y.write_angle(y_pos)

send_servo_command(servo_x_pos, servo_y_pos)

# 打开摄像头
cap = cv2.VideoCapture(0)

screen_width, screen_height = 280, 320
cap.set(cv2.CAP_PROP_FRAME_WIDTH, screen_width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, screen_height)

# 创建一个命名窗口并设置为无边框
cv2.namedWindow('Face Tracking', cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty('Face Tracking', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)

if not cap.isOpened():
    print('无法打开摄像头')
    exit()

while True:
    ret, frame = cap.read()
    if not ret:
      print("无法读取帧")
      break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.1, 4)

    frame_height, frame_width = frame.shape[:2]
    frame_center_x = frame_width // 2
    frame_center_y = frame_height // 2

    for (x, y, w, h) in faces:
      face_center_x = x + w // 2
      face_center_y = y + h // 2

      # 绘制矩形框
      cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)

      # 计算偏移量
      offset_x = face_center_x - frame_center_x
      offset_y = face_center_y - frame_center_y

      # 调整舵机角度(使舵机反向移动)
      if abs(offset_x) > frame_width // 10:# 误差范围
            if offset_x > 0:
                servo_x_pos -= 1# 减小角度向左转
            else:
                servo_x_pos += 1# 增加角度向右转

      if abs(offset_y) > frame_height // 10:# 误差范围
            if offset_y > 0:
                servo_y_pos += 1# 增加角度向下转
            else:
                servo_y_pos -= 1# 减小角度向上转

      # 限制舵机范围防止损坏
      servo_x_pos = max(0, min(180, servo_x_pos))
      servo_y_pos = max(0, min(180, servo_y_pos))

      send_servo_command(servo_x_pos, servo_y_pos)
      break

    cv2.imshow('Face Tracking', frame)

    # 按下 'q' 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break

    #time.sleep(0.05)

# 清理资源
cap.release()
cv2.destroyAllWindows()【未来目标】在此基础上可以继续开发自动拍照、保存、上传等功能。还可以向语音命令控制或者手势识别控制方向扩展,用语音控制或者手势识别控制拍照保存上传等功能
【相关链接】行空板扩展板开箱视频

孙洪尧1985 发表于 2024-11-16 15:33:31

能不能用图形化实现呢?
页: [1]
查看完整版本: 【行空板扩展版】基于OpenCV人脸识别的“人脸跟随”系统