地面油渍清扫机器人

核心开发 · 中国机器人及人工智能竞赛 · 全国二等奖 2025
Vision
OpenCV KNN 背景减除 + HSV 颜色过滤
Control
STM32 接收坐标 · 串口运动控制
Server
Flask + Flask-SocketIO 实时推流
Pipeline
轮廓筛选 → 油渍中心 → 指令下发
Award
第二十七届中国机器人及人工智能竞赛 · 全国二等奖
项目概述

基于 OpenCV 视觉识别与 STM32 运动控制的智能地面油渍清扫机器人。 通过摄像头实时采集地面图像,利用 KNN 背景减除算法结合 HSV 颜色过滤检测油渍区域, 计算油渍中心坐标后通过串口发送控制指令至 STM32 下位机,驱动机器人自主移动并完成清扫任务。 获 第二十七届中国机器人及人工智能竞赛全国二等奖

项目展示(为前期开发版本,非最后版本)
介绍视频(为前期开发版本,非最后版本)
核心功能
  • 摄像头实时视频采集与 MJPEG 压缩编码
  • KNN 背景减除算法提取运动前景(油渍区域)
  • HSV 颜色空间过滤精确定位深色油渍
  • 轮廓检测 + 面积/形状筛选过滤噪声
  • 计算油渍中心坐标,通过串口发送至 STM32
  • WebSocket 实时推送视频帧与检测数据到浏览器
  • FPS 实时监控与性能优化
技术实现
  • Flask + Flask-SocketIO 构建 Web 服务
  • OpenCV KNN 背景减除检测运动目标
  • 高斯模糊 + 形态学开运算去噪
  • HSV 颜色范围过滤精确定位油渍
  • 轮廓面积筛选与圆度/宽高比形状分析
  • PySerial 串口通信,自定义协议帧格式
  • Base64 编码 + WebSocket 推送视频帧
  • 多线程架构:采集线程 + 处理线程分离
核心代码
app.py
# 串口通信 — 向 STM32 发送油渍坐标
def outuart(x, y, control_strategy):
    data_str = f"a{y:03d}{x:03d}{control_strategy}b\n"
    uart_A.write(data_str.encode('ascii'))

# 油渍检测 — KNN + HSV 过滤
fgmask = fgbg.apply(frame)
fgmask = cv2.GaussianBlur(fgmask, (5,5), 0)
_, thresh = cv2.threshold(fgmask, 25, 255, cv2.THRESH_BINARY)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask_color = cv2.inRange(hsv,
    np.array([0, 0, 0]),
    np.array([180, 255, 80]))
combined_mask = cv2.bitwise_and(thresh, mask_color)

# 轮廓检测 — 面积 + 形状筛选
contours, _ = cv2.findContours(
    combined_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    area = cv2.contourArea(cnt)
    if area > 2000:
        x,y,w,h = cv2.boundingRect(cnt)
        center = (x + w//2, y + h//2)
        outuart(center[0], center[1], 0)
技术栈
Python Flask OpenCV SocketIO KNN HSV 串口通信 多线程