0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 STM32的智能WIFI视频人脸追踪监控系统
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:5分
🧿 选题指导, 项目分享:
1 简介
传统图像监控设备功能非常单一,仅有图像的采集与显示功能,已经不能满足现代技术要求。 本项目尝试物联网概念结合,不仅实现了包含传统的录像功能,还实现了如今同样很火暴的技术——人脸识别。 本项目的优点: 通过WIFI传输数据,只要哪里有电源插座,便可作为视频监控点。 通过WIFI传输,可远程操作摄像头运行模式(运行、停止、低功耗),实时性增强。 结合上位机人脸识别,自动记录、拍照人脸画面,不再需要像传统设备快进来查找出现人脸画面,追踪更加方便。 成本较低,具有商业竞争优势。
2 主要器件
-
STM32F446RET6主控MCU,带有数字摄像头DCMI接口,不需要FIFO可直接连接并口摄像头。
-
WIFI模块:3080B,具有STATION和AP功能,提供TCP SOCKET通信,能通过UART直接换TCP通信。
-
摄像头:OV2640 200万像素,提供多种分辨率选择,极大节省SRAM存储空间。
-
摄像头转接板,连接开发板与摄像头,减少传输干扰导致的图像数据丢失。
3 实现效果
作品原型正面俯视:
作品原型背面俯视:
图片采集与人脸追踪效果图1:
4 设计原理
4.1 硬件说明
主控MCU:STM32F446RET6
功能特点:带有数字摄像头DCMI接口,不需要FIFO可直接连接并口摄像头。具有片内128KB的SRAM,存储空间大。
MCU原理图
WIFI模块:3080B
功能特点:具有STATION和AP功能,提供TCP SOCKET通信,能通过UART直接换TCP通信,非常方便。
摄像头:OV2640 200万像素
功能特点:提供多种分辨率选择,对于一帧QVGA图像(分辨率320*240)的RGB565所需的153600字节的空间,这对于该主控的SRAM来说,空间是不足够,而OV2640自带JPEG压缩技术,一帧QVGA图像经过JPEG压缩后不到10KB,极大节省SRAM存储空间。
摄像头转接板:
功能特点:连接开发板与摄像头,减少传输干扰导致的图像数据丢失。
主控引脚连接图:
4.2 软件说明
功能框图:
开发平台采用:由于MBED平台暂时不支持摄像头接口,所以先暂时使用ST官方的HAL库,在完成所有功能实现后,将移植到MBED平台。
开发工具:keil 5.17
上位机开发: .C++ 与QT5.1,视觉库opencv
开发工具:visual stdio 2017
下位机软件驱动:
串口UART驱动:与WIFI模块3080B采用UART通信。
I2C驱动:对摄像头进行初始化设置。
DCMI驱动:设置从摄像头采集图像接口。
MCO1驱动:给摄像头模块提供时钟。
软件程序流程图:
下位机:
系统上电后,串口和摄像头进行初始化,进入拍照等待。
通过串口接收回调接收上位机发送过来的拍照指令,调用DCMI接口进行拍照。
通过DCMI的帧完成回调函数可知道图像采集完成,发送图像回上位机。
上位机:
程序运行后,显示主界面。用户点拍照按键后,发送拍照指令给下位机。
通过TCP异步接收图像数据,显示到界面。
调用OPENCV图像处理算法,捕捉人脸,显示到界面。
部分核心代码
下位机核心逻辑代码:
while (1)
{
/* USER CODE END WHILE */
if(takePhoto==1){
takePhoto=0;
if(Rxbuffer[0]==0x12 &&Rxbuffer[1]==0x34){
Rxbuffer[0]=0;
Rxbuffer[1]=0;
//__HAL_DCMI_ENABLE(&DCMI_hdcmi);
__HAL_DCMI_ENABLE_IT(&DCMI_hdcmi, DCMI_IT_FRAME); //每次接收完一帧都需要重新使能捕捉FRAME中断
while(HAL_DCMI_Start_DMA(&DCMI_hdcmi, DCMI_MODE_SNAPSHOT,(uint32_t)JpegBuffer, pictureBufferLength)!=HAL_OK);//开启捕捉图像
}
HAL_UART_Receive_IT(&UartHandle, (uint8_t *)Rxbuffer, 2);
}
if(getPicture==1){
uint8_t dataHead[8]={'J','P','E','G'};
pictureLength=pictureBufferLength-DCMI_hdcmi.DMA_Handle->Instance->NDTR;//这个NDTR存放了JPEG的长度
pictureLength*=4; //因为DCMI的FIFO是4字节,DMA也是满4字节传输一次,所以图像实际长度=传输次数*4;
getPicture=0;
(*(uint32_t*)(dataHead+4))=(uint32_t)pictureLength; //data是8字节,前4字节用来放"JPEG",后4字节用来存放图像实际长度
while(HAL_UART_Transmit_IT(&UartHandle, (uint8_t*)dataHead, 8)!=HAL_OK); //先发送数据长度给上位机
HAL_Delay(20);
while(HAL_UART_Transmit_IT(&UartHandle, (uint8_t*)JpegBuffer, pictureLength)!=HAL_OK);//再发送数据给上位机
}
/* USER CODE BEGIN 3 */
}