今年 STC 单片机首次增设摄像头组别,不少备战同学关心这颗新 MCU 是否能够快速上手并像传统摄像头组别一样高效完成图像处理。最突出的痛点是:搭建完核心算法组合后,可能感觉到略微卡顿或系统延迟,影响车模调试上限。测试显示单帧处理耗时高达 20 多 ms,导致车辆运行稳定性和反应速度受限,甚至可能有冲出赛道的情况发生,调试陷入瓶颈。
针对这一高频痛点,经过反复测试、迭代优化,整理出一套实用性极强的帧率优化思路。实测验证有效,优化后单帧处理耗时可稳定降至 9-11ms,彻底解决卡顿难题。这里将图像处理和帧率优化思路分享给大家。
实测数据对比,直观呈现优化效果
| 图像处理方案 | 单帧采集 + 处理耗时 |
|---|---|
| 未优化(采集 + 处理) | 20ms-25ms(能感觉到慢,上限较低) |
| 优化后(采集 + 处理) | 9ms-11ms(流畅稳定,提高了上限) |
同学们遇到的卡顿问题,核心症结主要集中在两点:一是内存资源不足,二是算法计算耗时过长。在拆解具体优化方法前,我们先补充基础知识点。
基础铺垫:灰度图、二值化与大津法核心解析
1. 灰度图:摄像头采集的核心图像格式
摄像头拍摄到的图像并非彩色图,而是灰度图——这类图像仅包含明暗信息,不包含色彩信息,每个像素点的明暗程度用灰度值(0-255)表示。其中,灰度值 0 对应纯黑色,255 对应纯白色,介于两者之间的数值则对应不同深浅的灰色,赛道与背景的差异,本质就是灰度值的差异。
2. 二值化:突出赛道特征的关键步骤
由于灰度图包含大量明暗渐变的像素点,直接用于赛道识别会增加计算量,因此需要进行二值化处理。二值化的核心是设定一个固定阈值,将灰度图中所有像素点的灰度值与该阈值对比,灰度值大于阈值的像素设为纯白色(对应赛道区域),小于等于阈值的像素设为纯黑色(对应背景区域),最终将灰度图转化为仅含黑白两色的二值图,清晰区分赛道与背景。
为了让大家更直观理解阈值对二值化效果的影响,我们准备了一份灰度图用不同阈值二值化的结果动图,可清晰看到:不同阈值下,赛道与背景的区分效果差异明显,阈值选择不当会导致赛道轮廓模糊、背景干扰过多,甚至无法识别赛道。
![图片描述]
3. 大津法:自动筛选最优二值化阈值的核心算法
二值化的关键在于阈值选择,手动设定阈值不仅效率低,还会受环境光照影响。而大津法(也叫最大类间方差法),正是为解决这一问题而生的自动阈值筛选算法,其核心原理围绕'类间方差最大化'展开,无需手动干预,能适配不同光照场景。
简单来说,大津法的核心逻辑是:通过遍历所有可能的灰度阈值(0-255),计算每个阈值对应的'类间方差',找到类间方差最大的阈值,即为最优二值化阈值。这是因为类间方差越大,代表赛道(一类像素)与背景(另一类像素)的灰度差异越明显,区分效果越好。
结合示意图,我们进一步拆解大津法原理的三个关键环节:
- 直方图:示意图上方的柱状图,是大津法计算的基础,用于显示该灰度图的灰度分布情况。横轴为灰度值(0-255),纵轴为对应灰度值的像素数量。
- 方差曲线:示意图下方的蓝色曲线,代表每个灰度阈值(0-255)对应的类间方差。曲线的每个点,都对应一个阈值的类间方差结果。
- 最佳阈值:图中用红圈标记的曲线最大值点,是大津法的最终输出,即为自动筛选的最优二值化阈值。
精准优化——针对大津法,破解内存与耗时痛点
了解基础原理后,我们回归核心优化需求。大家常用的 188×120 分辨率图像,若直接定义两个完整数组,可能会出现内存不够的问题;同时,每帧均遍历全图像素计算阈值,会大幅增加计算耗时。
经过多轮测试验证,我们总结出两个实用的优化技巧,二者组合使用可实现效果翻倍,且不影响图像识别精度。
技巧 1:图像下采样——平衡效率与精度,降低资源占用
针对「内存不够」「单帧处理耗时久」两个问题,最简单、易操作的下采样实操方法是:大家常用的图像分辨率是 188×120(宽 188 像素、高 120 像素),下采样核心就是「隔一行取一行、隔一列取一列」,直接将原图尺寸压缩一半,最终得到 94×60 分辨率的图像(188÷2=94,120÷2=60),后续仅用这张压缩后的图像,执行大津法阈值计算即可。
为了让大家更直观感受下采样的优化效果,我们结合对比图,将 188×120(未优化分辨率)与 94×60(下采样后分辨率)的核心关键数据,清晰拆解如下:
首先来看下采样后的 94×60 分辨率(优化后),其核心数据如下:分辨率为 94×60,对应大津法计算阈值时需遍历的直方图操作数仅为 5640 次,最终计算出的最优阈值为 62;


