基于STM32与OpenCV的人脸红外测温系统设计1. 项目概述1.1 系统架构本设计实现了一个异构计算架构的非接触式体温监测系统由STM32F103C8T6单片机作为下位机负责温度采集Windows上位机完成视觉处理。系统采用模块化设计思想通过标准串口协议实现双系统数据同步。硬件端核心组件包括STM32F103C8T6微控制器(72MHz Cortex-M3内核)MLX90614ESF-BAA红外测温传感器(精度±0.5℃)CH340G USB转串口芯片AMS1117-3.3稳压电路软件端基于Qt5框架开发主要技术栈为OpenCV 4.5人脸检测(DNN模块)QSerialPort串口通信QTextToSpeech语音合成1.2 技术指标参数指标值测温范围0~50℃(人体模式)测温精度±0.5℃(校准后)响应时间300ms(端到端延迟)通信协议UART115200bps视频处理帧率30fps(640x480分辨率)工作电流150mA5V2. 硬件设计2.1 主控电路STM32F103C8T6最小系统包含8MHz晶振与22pF负载电容10KΩ复位电路BOOT0选择跳线SWD调试接口(PA13/PA14)电源设计采用两级滤波USB_5V → SS14二极管 → 100μF电解电容 → AMS1117-3.3 → 100nF陶瓷电容 → VDD2.2 传感器接口MLX90614典型连接电路VDD → 3.3V GND → GND SCL → PB6(开漏输出需4.7K上拉) SDA → PB7(开漏输出需4.7K上拉)I2C总线设计要点上拉电阻取值4.7KΩ(3.3V电平)走线长度10cm以减少干扰避免与高频信号线平行布线2.3 通信模块CH340G典型应用电路TXD → PA10(STM32 RX) RXD → PA9(STM32 TX) V3 → 100nF去耦电容3. 固件设计3.1 温度采集流程// MLX90614数据读取示例 float Read_Temperature(void) { uint16_t rawData; HAL_I2C_Mem_Read(hi2c1, 0x5A1, 0x07, 1, (uint8_t*)rawData, 2, 100); return (rawData * 0.02) - 273.15; } // 滑动平均滤波实现 #define FILTER_LEN 5 float tempFilter[FILTER_LEN]; float Get_FilteredTemp(void) { static uint8_t index 0; tempFilter[index] Read_Temperature(); index (index 1) % FILTER_LEN; float sum 0; for(uint8_t i0; iFILTER_LEN; i) { sum tempFilter[i]; } return sum / FILTER_LEN; }3.2 串口协议设计数据帧格式(小端模式)0xAA | Temp_High | Temp_Low | Checksum | 0x55校验和计算uint8_t Calc_Checksum(float temp) { uint16_t tempInt (uint16_t)(temp * 100); return (uint8_t)((tempInt 8) ^ (tempInt 0xFF)); }4. 上位机软件4.1 OpenCV人脸检测// DNN人脸检测核心代码 cv::dnn::Net net cv::dnn::readNetFromCaffe(deploy.prototxt, res10_300x300.caffemodel); cv::Mat blob cv::dnn::blobFromImage(frame, 1.0, cv::Size(300, 300), cv::Scalar(104, 177, 123)); net.setInput(blob); cv::Mat detections net.forward(); for(int i0; idetections.size[2]; i) { float confidence detections.atfloat(0,0,i,2); if(confidence 0.7) { // 获取人脸ROI坐标 int x1 static_castint(detections.atfloat(0,0,i,3) * frame.cols); int y1 static_castint(detections.atfloat(0,0,i,4) * frame.rows); int x2 static_castint(detections.atfloat(0,0,i,5) * frame.cols); int y2 static_castint(detections.atfloat(0,0,i,6) * frame.rows); // 绘制检测框 cv::rectangle(frame, cv::Point(x1,y1), cv::Point(x2,y2), cv::Scalar(0,255,0), 2); } }4.2 温度显示逻辑// Qt温度显示实现 void MainWindow::updateTempDisplay(float temp) { QString styleSheet; QString alertText; if(temp 37.3 || temp 36.0) { styleSheet color: red; font-weight: bold;; alertText QString(警告: %1℃).arg(temp, 0, f, 1); // 触发语音报警 if(!m_isAlerting) { m_speech-say(体温异常请复查); m_isAlerting true; QTimer::singleShot(10000, [this](){ m_isAlerting false; }); } } else { styleSheet color: green;; alertText QString(%1℃).arg(temp, 0, f, 1); } ui-tempLabel-setStyleSheet(styleSheet); ui-tempLabel-setText(alertText); }5. 系统校准与测试5.1 温度校准方法使用标准黑体辐射源(如FLIR PT650)作为参考采集3个温度点(35℃、37℃、40℃)的原始数据计算补偿公式T_corrected (1.02 * T_raw) 0.5将系数写入STM32 Flash存储5.2 性能测试数据测试项目条件结果测温稳定性恒温35℃环境±0.2℃波动人脸跟踪延迟1m距离移动测试120±20ms串口通信误码率连续传输1小时0.001%系统功耗全功能运行状态148mA5V6. BOM清单器件型号数量关键参数主控MCUSTM32F103C8T6172MHz, 64KB Flash红外传感器MLX90614ESF-BAA1FOV35°, ±0.5℃USB转串口芯片CH340G1支持3.3V/5VLDO稳压器AMS1117-3.31800mA输出晶振8MHz120ppm精度I2C上拉电阻4.7KΩ 080521%精度
STM32与OpenCV实现人脸红外测温系统
基于STM32与OpenCV的人脸红外测温系统设计1. 项目概述1.1 系统架构本设计实现了一个异构计算架构的非接触式体温监测系统由STM32F103C8T6单片机作为下位机负责温度采集Windows上位机完成视觉处理。系统采用模块化设计思想通过标准串口协议实现双系统数据同步。硬件端核心组件包括STM32F103C8T6微控制器(72MHz Cortex-M3内核)MLX90614ESF-BAA红外测温传感器(精度±0.5℃)CH340G USB转串口芯片AMS1117-3.3稳压电路软件端基于Qt5框架开发主要技术栈为OpenCV 4.5人脸检测(DNN模块)QSerialPort串口通信QTextToSpeech语音合成1.2 技术指标参数指标值测温范围0~50℃(人体模式)测温精度±0.5℃(校准后)响应时间300ms(端到端延迟)通信协议UART115200bps视频处理帧率30fps(640x480分辨率)工作电流150mA5V2. 硬件设计2.1 主控电路STM32F103C8T6最小系统包含8MHz晶振与22pF负载电容10KΩ复位电路BOOT0选择跳线SWD调试接口(PA13/PA14)电源设计采用两级滤波USB_5V → SS14二极管 → 100μF电解电容 → AMS1117-3.3 → 100nF陶瓷电容 → VDD2.2 传感器接口MLX90614典型连接电路VDD → 3.3V GND → GND SCL → PB6(开漏输出需4.7K上拉) SDA → PB7(开漏输出需4.7K上拉)I2C总线设计要点上拉电阻取值4.7KΩ(3.3V电平)走线长度10cm以减少干扰避免与高频信号线平行布线2.3 通信模块CH340G典型应用电路TXD → PA10(STM32 RX) RXD → PA9(STM32 TX) V3 → 100nF去耦电容3. 固件设计3.1 温度采集流程// MLX90614数据读取示例 float Read_Temperature(void) { uint16_t rawData; HAL_I2C_Mem_Read(hi2c1, 0x5A1, 0x07, 1, (uint8_t*)rawData, 2, 100); return (rawData * 0.02) - 273.15; } // 滑动平均滤波实现 #define FILTER_LEN 5 float tempFilter[FILTER_LEN]; float Get_FilteredTemp(void) { static uint8_t index 0; tempFilter[index] Read_Temperature(); index (index 1) % FILTER_LEN; float sum 0; for(uint8_t i0; iFILTER_LEN; i) { sum tempFilter[i]; } return sum / FILTER_LEN; }3.2 串口协议设计数据帧格式(小端模式)0xAA | Temp_High | Temp_Low | Checksum | 0x55校验和计算uint8_t Calc_Checksum(float temp) { uint16_t tempInt (uint16_t)(temp * 100); return (uint8_t)((tempInt 8) ^ (tempInt 0xFF)); }4. 上位机软件4.1 OpenCV人脸检测// DNN人脸检测核心代码 cv::dnn::Net net cv::dnn::readNetFromCaffe(deploy.prototxt, res10_300x300.caffemodel); cv::Mat blob cv::dnn::blobFromImage(frame, 1.0, cv::Size(300, 300), cv::Scalar(104, 177, 123)); net.setInput(blob); cv::Mat detections net.forward(); for(int i0; idetections.size[2]; i) { float confidence detections.atfloat(0,0,i,2); if(confidence 0.7) { // 获取人脸ROI坐标 int x1 static_castint(detections.atfloat(0,0,i,3) * frame.cols); int y1 static_castint(detections.atfloat(0,0,i,4) * frame.rows); int x2 static_castint(detections.atfloat(0,0,i,5) * frame.cols); int y2 static_castint(detections.atfloat(0,0,i,6) * frame.rows); // 绘制检测框 cv::rectangle(frame, cv::Point(x1,y1), cv::Point(x2,y2), cv::Scalar(0,255,0), 2); } }4.2 温度显示逻辑// Qt温度显示实现 void MainWindow::updateTempDisplay(float temp) { QString styleSheet; QString alertText; if(temp 37.3 || temp 36.0) { styleSheet color: red; font-weight: bold;; alertText QString(警告: %1℃).arg(temp, 0, f, 1); // 触发语音报警 if(!m_isAlerting) { m_speech-say(体温异常请复查); m_isAlerting true; QTimer::singleShot(10000, [this](){ m_isAlerting false; }); } } else { styleSheet color: green;; alertText QString(%1℃).arg(temp, 0, f, 1); } ui-tempLabel-setStyleSheet(styleSheet); ui-tempLabel-setText(alertText); }5. 系统校准与测试5.1 温度校准方法使用标准黑体辐射源(如FLIR PT650)作为参考采集3个温度点(35℃、37℃、40℃)的原始数据计算补偿公式T_corrected (1.02 * T_raw) 0.5将系数写入STM32 Flash存储5.2 性能测试数据测试项目条件结果测温稳定性恒温35℃环境±0.2℃波动人脸跟踪延迟1m距离移动测试120±20ms串口通信误码率连续传输1小时0.001%系统功耗全功能运行状态148mA5V6. BOM清单器件型号数量关键参数主控MCUSTM32F103C8T6172MHz, 64KB Flash红外传感器MLX90614ESF-BAA1FOV35°, ±0.5℃USB转串口芯片CH340G1支持3.3V/5VLDO稳压器AMS1117-3.31800mA输出晶振8MHz120ppm精度I2C上拉电阻4.7KΩ 080521%精度