# Face Tracking Pan-Tilt Camera
<p align="center">
<img src="./images/example.gif">
</p>
# 目录
- [一. 概述](#一-概述)
- [二. 实现方法及步骤](#二-实现方法及步骤)
- [2.1 硬件部分](#21-硬件部分)
- [2.2 软件部分](#22-软件部分)
- [2.2.1 python环境及主要使用的库](#221-python环境及主要使用的库)
- [2.2.2 PC端:图像处理与人脸检测](#222-pc端图像处理与人脸检测)
- [2.2.3 单片机:实现PD控制器](#223-单片机实现pd控制器)
- [三. 实现效果](#三-实现效果)
## 一. 概述
本项目为基于OpenCV-Python和STM32F103单片机的二自由度人脸跟踪舵机云台系统。
<p align="center">
<img width="500" img src="./images/system.jpg"/>
</p>
本系统的预期功能是实时检测摄像头中出现的人脸,并对其进行跟踪。要实现该功能,主要应解决如下问题:
1. **图像采集**
2. **人脸检测**
3. **舵机控制**
具体实现思路如下:
**图像采集**方面,使用普通的usb摄像头,这样可以直接得到数字图像无需进行数模转换,而且价格低廉,在不要求高精度的情况下比较适合。将usb摄像头直接通过usb数据线接到电脑,即可在PC端得到实时图像。
**人脸检测**方面,在PC端编写用于人脸检测的python程序。使用opencv库,首先对从摄像头得到的每一帧实时图像进行预处理,然后调用opencv自带的harr分类器检测人脸的位置。将检测到的人脸的中心点坐标用串口发送给STM32单片机即可。
**舵机控制**方面,使用STM32单片机,根据串口接收到的来自上位机的坐标分别对两个舵机进行独立的位置控制。具体思路是,将图像的中心点的横纵坐标(恒定值)与人脸中心点的横纵坐标分别作差,将该差值作为偏差输入到STM32中实现的两个PD控制器中,计算所需占空比,产生两路PWM波驱动舵机向偏差减小的方向转动。
## 二. 实现方法及步骤
### 2.1 硬件部分
首先搭建二自由度云台的机械结构。为尽可能节约成本,抛弃了最初搭建金属结构、使用大力矩舵机的方案,而是在淘宝上购置成本低廉的塑料FPV双轴舵机云台和SG90小舵机进行安装,得到一个低成本的二自由度云台架。
对普通usb摄像头进行拆解,安装到云台架上,即完成了基本的机械结构。
<p align="center">
<img width="500" img src="./images/cam_1_2.png"/>
</p>
选用正点原子的STM32F1精英板作为单片机开发板,芯片型号为STM32F103ZET6。
<p align="center">
<img width="500" img src="./images/stm32_board.jpg"/>
</p>
### 2.2 软件部分
#### 2.2.1 python环境及主要使用的库
* python 3.6 (Anaconda)
- numpy 1.14.0
* opencv-python 3.4.0
- pyserial 3.4
#### 2.2.2 PC端:图像处理与人脸检测
使用opencv-python对usb摄像头的实时图片进行人脸检测。为提高检测速度,首先对图片做预处理,将彩色图像转化为灰度图像。然后使用opencv自带的harr级联分类器检测人脸位置,并将人脸中心点坐标通过串口发送给STM32单片机。
为了解决多个人脸同时出现在画面中造成系统不稳定的现象,对算法进行改进,对每帧图像计算所有人脸中心点的形心,这样当多个人脸同时出现时,摄像头将对准所有人脸的平均的几何中心。
该部分的源代码详见:
* [track_face.py](/code/track_face.py)
#### 2.2.3 单片机:实现PD控制器
STM32单片机主要应完成:接收串口数据、实现PD控制器、输出PWM驱动舵机三个任务。下面列出部分关键代码,分别介绍实现方法。
**1. 串口数据接收**
STM32单片机要通过串口,根据设置的通讯协议接收PC端传来的坐标(X,Y),将横纵坐标两个值分别存储到全局变量coords中。为此,编写串口接收程序如下:
* [serial.c](/code/control/HARDWARE/serial/serial.c)
上述程序中,为了更清晰地观察到单片机接收串口数据的情况,使用了开发板上的LED灯,在数据传输时闪烁。LED灯部分的驱动程序如下:
* [led.c](/code/control/HARDWARE/LED/led.c)
**2. PD控制器**
将实际坐标数据与目标坐标作差,将差值作为偏差传递给PID控制器,从而得到需要的PWM占空比。
PID参数通过实验确定。实验表明,仅采用PD的效果更佳。
这一部分的源码pid.c如下:
* [pid.c](/code/control/HARDWARE/PID/pid.c)
**3. 输出PWM**
根据PD控制器输出的值作为占空比,通过时钟输出PWM信号。源码如下:
* [timer.c](/code/control/HARDWARE/TIMER/timer.c)
**4. 主函数**
* [main.c](/code/control/USER/main.c)
## 三. 实现效果
经测试,该系统能够实现预期的功能。经过调参后,调节时间很短,超调较小,系统的快速性和平稳性均能达到预期目标。系统的不足之处在于有一定稳态误差,但是考虑到舵机成本较低,系统的精度处在可以接受的范围内。
<p align="center">
<img width="500" img src="./images/result_1.png"/>
</p>
下图分别是单人和多人的跟踪效果:
<p align="center">
<img width="500" img src="./images/result_2.png"/>
</p>
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 优秀项目 基于STM32单片机+Python+OpenCV的二自由度人脸跟踪舵机云台源码+详细文档+全部数据资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
优秀项目 基于STM32单片机+Python+OpenCV的二自由度人脸跟踪舵机云台源码+详细文档+全部数据资料.zip (96个子文件)
face-tracking-pan-tilt-camera-master
LICENSE 1KB
images
result_1.png 553KB
cam_1_2.png 336KB
single.png 440KB
example.gif 6.39MB
stm32_board.jpg 176KB
multi.png 430KB
cam_2.jpg 135KB
cam_1.jpg 132KB
README.md 13B
system.jpg 162KB
result_2.png 439KB
README.md 5KB
code
data
haarcascade_frontalface_default.xml 1.2MB
track_face.py 3KB
control
CORE
startup_stm32f10x_hd.s 15KB
core_cm3.h 82KB
core_cm3.c 16KB
keilkilll.bat 372B
OBJ
CONTROL.hex 32KB
SYSTEM
delay
delay.h 2KB
delay.c 6KB
usart
usart.h 1KB
usart.c 4KB
sys
sys.h 3KB
sys.c 484B
USER
stm32f10x_conf.h 3KB
CONTROL.uvoptx 13KB
system_stm32f10x.c 35KB
DebugConfig
USART_STM32F103ZE_1.0.0.dbgconf 7KB
CONTROL.uvguix.James Wu 168KB
CONTROL.uvprojx 18KB
stm32f10x.h 611KB
system_stm32f10x.h 2KB
main.c 1KB
stm32f10x_it.c 2KB
stm32f10x_it.h 2KB
JLinkSettings.ini 636B
STM32F10x_FWLib
inc
stm32f10x_bkp.h 7KB
stm32f10x_sdio.h 21KB
stm32f10x_dbgmcu.h 4KB
misc.h 9KB
stm32f10x_cec.h 6KB
stm32f10x_can.h 26KB
stm32f10x_fsmc.h 26KB
stm32f10x_spi.h 17KB
stm32f10x_wwdg.h 3KB
stm32f10x_dma.h 20KB
stm32f10x_exti.h 6KB
stm32f10x_tim.h 50KB
stm32f10x_crc.h 2KB
stm32f10x_rtc.h 4KB
stm32f10x_usart.h 16KB
stm32f10x_rcc.h 29KB
stm32f10x_dac.h 15KB
stm32f10x_adc.h 21KB
stm32f10x_i2c.h 29KB
stm32f10x_gpio.h 19KB
stm32f10x_pwr.h 4KB
stm32f10x_flash.h 24KB
stm32f10x_iwdg.h 4KB
src
stm32f10x_adc.c 45KB
stm32f10x_wwdg.c 5KB
misc.c 7KB
stm32f10x_spi.c 29KB
stm32f10x_gpio.c 22KB
stm32f10x_tim.c 104KB
stm32f10x_sdio.c 27KB
stm32f10x_bkp.c 8KB
stm32f10x_rtc.c 8KB
stm32f10x_dac.c 18KB
stm32f10x_dma.c 28KB
stm32f10x_fsmc.c 34KB
stm32f10x_exti.c 7KB
stm32f10x_pwr.c 8KB
stm32f10x_i2c.c 43KB
stm32f10x_crc.c 3KB
stm32f10x_cec.c 11KB
stm32f10x_can.c 43KB
stm32f10x_iwdg.c 5KB
stm32f10x_usart.c 36KB
stm32f10x_dbgmcu.c 5KB
stm32f10x_flash.c 59KB
stm32f10x_rcc.c 49KB
README.TXT 131B
HARDWARE
PID
pid.h 560B
pid.c 2KB
LED
led.h 616B
led.c 800B
TIMER
timer.c 4KB
timer.h 597B
KEY
key.c 1KB
key.h 563B
serial
serial.h 71B
serial.c 1KB
171265889347208773632.zip 416B
共 96 条
- 1
资源评论
不走小道
- 粉丝: 3203
- 资源: 5123
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- web期末大作业-HTML+CSS+JS仿王者荣耀官网网站HTML5项目实训源码.zip
- 帕鲁ppt备份只是为了方便
- 3.15 设计vi,产生一个0.0到10.0的随机数,与10.0相乘,然后通过一个字vi将积与100相加后开方
- 3.14 设计vi,比较两个数,如果其中一个数大于另一个数,则点亮LED指示灯
- 08最短路径_Floyd.c
- 02二叉排序树_BinarySortTree.c
- python字符串逆序方法.md
- qt软件开发+代码+注释+自我学习+windows软件开发+图像分割
- python二叉树的遍历.md
- 1cdd0859202f67f8bf6945fd9559ea102d27d11b
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功