503浏览
查看: 503|回复: 1

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

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



下面是一个舵机测试程序
注意:这里如果需要从按键中断中改变主循环里的变量需要声名变量为global类型
在测试过程中发现扩展板上提供的pin脚电压只有3.3v对于一些大功率的外设来说还是不太理想,5v的pin脚只有一路i2c可以使用,当要驱动两组舵机的时候需要从5v i2c这里引出一对5v供电,这里不太方便希望未来的产品里可以有所改进

提高供电能力后对舵机的控制变得十分平滑。

在此基础上我开发了一个基于OpenCV人脸识别的“人脸跟随”系统

【物料】
行空板 x1
行空板扩展版 x1
舵机 MG996R x2
usb摄像头 x1
12v变压器 x1

【连接图】
理想连接图
实际连接图

【开发环境】
Mind+ python模式


  1. import cv2
  2. from pinpong.board import Board, Pin, Servo
  3. import time
  4. # 初始化级联分类器
  5. face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
  6. # 舵机初始位置
  7. servo_x_pos = 45  # 横向舵机初始角度
  8. servo_y_pos = 60  # 竖向舵机初始角度
  9. Board().begin()
  10. servo_x = Servo(Pin(Pin.P2))
  11. servo_y = Servo(Pin(Pin.P0))
  12. def send_servo_command(x_pos, y_pos):
  13.     servo_x.write_angle(x_pos)
  14.     servo_y.write_angle(y_pos)
  15. send_servo_command(servo_x_pos, servo_y_pos)
  16. # 打开摄像头
  17. cap = cv2.VideoCapture(0)
  18. screen_width, screen_height = 280, 320
  19. cap.set(cv2.CAP_PROP_FRAME_WIDTH, screen_width)
  20. cap.set(cv2.CAP_PROP_FRAME_HEIGHT, screen_height)
  21. # 创建一个命名窗口并设置为无边框
  22. cv2.namedWindow('Face Tracking', cv2.WND_PROP_FULLSCREEN)
  23. cv2.setWindowProperty('Face Tracking', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
  24. if not cap.isOpened():
  25.     print('无法打开摄像头')
  26.     exit()
  27. while True:
  28.     ret, frame = cap.read()
  29.     if not ret:
  30.         print("无法读取帧")
  31.         break
  32.     gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  33.     faces = face_cascade.detectMultiScale(gray, 1.1, 4)
  34.     frame_height, frame_width = frame.shape[:2]
  35.     frame_center_x = frame_width // 2
  36.     frame_center_y = frame_height // 2
  37.     for (x, y, w, h) in faces:
  38.         face_center_x = x + w // 2
  39.         face_center_y = y + h // 2
  40.         # 绘制矩形框
  41.         cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
  42.         # 计算偏移量
  43.         offset_x = face_center_x - frame_center_x
  44.         offset_y = face_center_y - frame_center_y
  45.         # 调整舵机角度(使舵机反向移动)
  46.         if abs(offset_x) > frame_width // 10:  # 误差范围
  47.             if offset_x > 0:
  48.                 servo_x_pos -= 1  # 减小角度向左转
  49.             else:
  50.                 servo_x_pos += 1  # 增加角度向右转
  51.         if abs(offset_y) > frame_height // 10:  # 误差范围
  52.             if offset_y > 0:
  53.                 servo_y_pos += 1  # 增加角度向下转
  54.             else:
  55.                 servo_y_pos -= 1  # 减小角度向上转
  56.         # 限制舵机范围防止损坏
  57.         servo_x_pos = max(0, min(180, servo_x_pos))
  58.         servo_y_pos = max(0, min(180, servo_y_pos))
  59.         send_servo_command(servo_x_pos, servo_y_pos)
  60.         break
  61.     cv2.imshow('Face Tracking', frame)
  62.     # 按下 'q' 键退出
  63.     if cv2.waitKey(1) & 0xFF == ord('q'):
  64.         break
  65.     #time.sleep(0.05)
  66. # 清理资源
  67. cap.release()
  68. cv2.destroyAllWindows()
复制代码
【未来目标】
在此基础上可以继续开发自动拍照、保存、上传等功能。还可以向语音命令控制或者手势识别控制方向扩展,用语音控制或者手势识别控制拍照保存上传等功能

【相关链接】
行空板扩展板开箱视频

孙洪尧1985  中级技师

发表于 5 天前

能不能用图形化实现呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail