第一章:嵌入式视觉系统概述

大家好,我是老李。做嵌入式视觉这行快十年了,踩过的坑比吃过的盐还多。今天咱们聊聊嵌入式视觉系统到底是个啥。

说白了,嵌入式视觉就是把“眼睛”和“脑子”塞进一个小盒子里。这个盒子没有Windows,没有Linux桌面,可能就一个单片机加一个摄像头。但它能看、能想、能干活。

什么是嵌入式视觉

我习惯这么定义:嵌入式视觉 = 摄像头 + 处理器 + 算法,三者塞进一个资源受限的硬件里

你想想看,手机拍照算不算嵌入式视觉?算,但那是高端玩法。咱们课程里聊的是更“轻”的方案——比如一个STM32加个OV2640摄像头,跑个轻量级人脸检测。这才是真正的嵌入式视觉。

核心特征:

  • 资源受限:内存通常几百KB到几十MB
  • 实时性要求高:处理一帧图像不能超过100ms
  • 功耗敏感:很多场景靠电池供电
  • 成本敏感:一个摄像头模组可能就几块钱

我记得2018年做过一个项目,客户要求用一颗Cortex-M4芯片做口罩检测。当时团队都觉得不可能,后来我们硬是把模型压缩到200KB以内,帧率跑到了15fps。嗯,这就是嵌入式视觉的魅力——在限制中创造可能。

应用领域

嵌入式视觉的应用,说白了就三个大方向。我每个都做过项目,跟你们聊聊真实感受。

安防领域

这是最成熟的市场。从小区门禁的人脸识别,到工厂的周界入侵检测,再到家里的智能猫眼。

我曾经做过一个智能门锁项目,客户要求用一颗200MHz的芯片做活体检测。刚开始我们用了MobileNetV2,结果帧率只有3fps,解锁要等两秒。后来换了轻量级模型,优化了数据流,终于跑到了15fps。避坑指南:安防场景最怕的是光线变化,同一个算法白天晚上效果差很多,一定要做光照自适应。

工业领域

工业视觉是嵌入式视觉的“硬核”战场。缺陷检测、尺寸测量、二维码识别、机器人引导……

我印象最深的是一个PCB板缺陷检测项目。产线上每分钟要检测60块板子,每块板子要拍5个位置。算下来每张图的处理时间不能超过200ms。我们用了OpenMV加一个轻量级CNN,最终做到了150ms。这里有个坑:工业场景的震动问题,摄像头固定不好,图像会模糊,算法再牛也白搭。

工业场景 典型要求 常用方案
缺陷检测 帧率>30fps,误检率<0.1% 轻量级CNN + 传统图像处理
尺寸测量 精度0.01mm 亚像素边缘检测
二维码识别 识别率>99.9% 优化版ZBar/ZXing

消费电子

这个领域大家最熟悉。智能音箱的人脸跟随、扫地机器人的避障、AR眼镜的手势识别……

消费电子最大的特点是:用户体验决定一切。算法可以不是最准的,但响应一定要快。我做过一个智能台灯项目,手势调光要求延迟小于50ms。我们用了PIR传感器加一个低分辨率摄像头,配合简单的光流算法,效果还不错。

系统组成

一个完整的嵌入式视觉系统,我习惯把它拆成三块:眼睛、脑子、灵魂。

摄像头——系统的眼睛

摄像头选型是个技术活。不是像素越高越好,要考虑接口、帧率、功耗、体积。

我常用的几款传感器:

  • OV2640:200万像素,DVP接口,便宜好用,适合入门
  • OV5640:500万像素,MIPI接口,画质好,适合中级项目
  • IMX219:800万像素,索尼的,低噪声,适合高端应用

我的选型经验:

如果处理器没有MIPI接口,就别选MIPI摄像头,否则要加桥接芯片,成本和复杂度都上去了。DVP接口虽然老,但兼容性好,很多MCU都支持。

处理器——系统的大脑

处理器是嵌入式视觉的核心。我按性能分三个档次:

档次 典型芯片 算力 适合场景
入门级 STM32F4/H7 ~200MHz,无硬件加速 简单图像处理,二维码识别
中级 ESP32-S3,i.MX RT ~600MHz,有向量扩展 轻量级CNN,人脸检测
高级 RK3588,Jetson Nano 多核+NPU,>1TOPS 目标检测,语义分割

为什么会这样分级?因为算力直接决定了你能跑什么算法。我刚开始做的时候,总想用最便宜的芯片跑最牛的算法,结果往往是两头不讨好。后来学乖了:先定算法,再选芯片

算法——系统的灵魂

算法是嵌入式视觉最难的部分。不是算法本身难,而是要在资源受限的情况下把算法跑起来。

我常用的算法优化手段:

  • 模型量化:从float32降到int8,模型体积缩小4倍,速度提升2-3倍
  • 剪枝:去掉不重要的网络连接,我试过剪掉30%的参数,精度只掉了1%
  • 知识蒸馏:用大模型教小模型,效果比直接训练小模型好很多

注意:

算法优化不是一蹴而就的。我曾经为了把模型压缩到极致,花了三周时间调参,结果精度掉了5%,客户不验收。后来我学到一个原则:先保证精度达标,再考虑优化速度。精度不达标,跑得再快也没用。

一个简单的系统示例

说了这么多,咱们看个实际例子。这是一个基于STM32F407的人脸检测系统:

// 系统初始化
void vision_system_init() {
    camera_init(OV2640, 320x240, RGB565);  // 初始化摄像头
    lcd_init();                             // 初始化显示屏
    face_model_load("face_detection.tflite"); // 加载模型
}

// 主循环
void vision_system_loop() {
    uint8_t *frame = camera_capture();      // 采集一帧图像
    if (frame == NULL) return;
    
    face_detection_result result = 
        face_detect(frame, 320, 240);       // 人脸检测
    
    if (result.confidence > 0.8) {
        lcd_draw_rect(result.x, result.y, 
                     result.w, result.h);   // 画框
        gpio_set(LED_PIN, 1);               // 点亮LED
    }
    
    delay_ms(50);  // 控制帧率在20fps左右
}

这个系统虽然简单,但包含了嵌入式视觉的所有要素:摄像头采集、处理器运算、算法推理、结果输出。嗯,这就是咱们课程要讲的核心内容。

小结

嵌入式视觉不是什么高深莫测的技术。说白了,就是在一个小盒子里,让机器学会“看”。

我做了这么多年,最大的体会是:不要追求完美,要追求够用。在嵌入式世界里,99%的准确率加上30fps的帧率,往往比99.9%的准确率但只有5fps更有价值。

下一章,咱们聊聊嵌入式视觉系统的硬件选型。我会分享一些踩坑经验,保证让你少走弯路。