前言

​ 最近在折腾车载摄像头的一些图像处理,想让它变得更“聪明”一点,尤其是在镜头被弄脏或者被什么东西挡住的时候,能及时发现问题。这玩意儿比想象中要复杂,踩了不少坑,也学到不少东西。今天就来简单记录一下我的一些思考和实践,希望能给同样在捣鼓这些东西的朋友们一点启发。


正文

一、问题的起源:当摄像头“视而不见”

​ 车上的摄像头,不管是行车记录仪还是那些越来越牛的自动驾驶辅助系统(ADAS),都跟人的眼睛一样重要。它们帮我们记录行车影像,识别路况,甚至在关键时刻能救我们一命。但如果这“眼睛”被泥点子、雨水、灰尘给糊住了,那麻烦就大了。轻则录下来的视频一片模糊,啥也看不清;重则影响ADAS系统的判断,比如把前面的障碍物看丢了,或者把车道线认错了,这后果不堪设想。

​ 我一开始尝试了一些比较基础的方法来检测摄像头是不是“脏了”。比如,分析图像的“信息熵”。简单来说,镜头干净的时候,画面细节多,各种东西都有,图像的“信息量”就大,熵值就高;镜头脏了,画面糊成一片,细节都没了,熵值自然就低。这在一些简单情况下确实能起点作用。

​ 但如果是一大块泥巴,或者别的什么东西,直接把镜头给盖住了,而且这块“遮挡物”本身也没什么复杂的纹理(比如一块颜色均匀的泥渍,或者一个镜头盖),之前那套基于信息熵的算法有时候就会“犯迷糊”。它可能会错误地认为“哦,这块区域本来就是这么单调,没什么细节,是正常的背景”,比如把它当成远处的路面或者阴天的天空。这就很要命了,明明摄像头已经“失明”了,系统还傻乎乎地以为“一切正常,放心开吧”。

二、挑战升级:当“静止”的遮挡物开始“扮演”背景

​ 打个比方,就像你突然用手掌把摄像头镜头整个捂严实了。如果你的检测系统不够智能,过了几秒钟,它可能就真的相信了:“嗯,现在的背景就是一片肉色的、没什么细节的平面,没毛病!” 。

​ 我们平时用的那些“背景建模”或者“背景减除”算法,本意是想让系统学习并记住场景里那些一直不变的部分(比如路边的电线杆、远处的山),然后把这些“背景”从画面中“减掉”,这样就能更容易地发现那些会动的“前景”目标(比如行人和车辆)。但问题是,如果一个大面积的“不速之客”(也就是遮挡物)突然出现,并且还“赖着不走”,有些不够灵活的背景模型就可能被它“欺骗”,把它也当成背景的一部分给“学习”进去了。

三、我的“侦探工具箱”升级版:更智能地识别真假遮挡

​ 为了不被这些“伪装大师”带偏,我给我的“侦探工具箱”进行了一次大升级,引入了一些更“精明”的图像分析工具和策略:

1. “火眼金睛”再进化:更强大的“找不同”能力 (NCC 与 相位相关)

​ 以前可能就简单地比较当前画面和前一秒画面的相似度。但如果光线变了,或者那块泥巴本身有点反光,简单比较就容易“看走眼”。

2. “背景审查”:“这块地儿是老住户还是新来的?”(MOG2 背景减除 与 光流法)
3. “突发事件”报警机制(处理突然的大面积遮挡)

​ 有时候,遮挡不是一点点慢慢形成的,而是一瞬间发生的,比如被前车溅了一镜头泥水,或者一个塑料袋突然糊在镜头上。这时候,系统得能“一激灵”反应过来。咱可以通过比较当前画面和前一秒画面是不是“画风突变”(比如,计算两帧之间对应图像块的像素值差异总和SAD,或者比较颜色直方图的差异)来拉响“突发遮挡警报”。一旦报警,就可以启动更详细的分析。

4. 应对“流动性作案”的特殊手段(动态流体遮挡)

​ 雨滴啊、流动的水渍啊、或者甩上来的泥水啊,这些更是难缠的主儿。它们不仅挡视线,还可能在镜头上到处“溜达”、变形、合并、消失。对付这些“流动性作案分子”,光靠静态分析和简单的帧间比较就不够了。

四、路漫漫其修远兮:优化永无止境

​ 当然,要搞出一个真正“皮实耐用”的遮挡检测系统,那绝对是个“持久战”,得不断地测试、发现问题、改进、再测试。除了上面说的这些,还有好多“鸡毛蒜皮”但又很重要的事儿要操心,比如:

​ 最最重要的是,咱得有各种各样真实开车时拍到的数据来“练兵”和“考试”,才能不断地发现算法的“短板”,然后把它补齐。像WoodScape这样的大型公开数据集,就包含了很多摄像头脏污的真实场景,对我们开发和验证算法非常有帮助。

​ 对于有更高追求、不差钱也不差算力的同学,还可以去看看更“时髦”的人工智能和深度学习方法。那些方法能从海量的图像数据里自己“悟”出怎么区分各种奇奇怪怪的遮挡,通常在准确率和鲁棒性上能达到更高的水平。

最后

参考文章:

车载摄像头脏污识别方法

Removing image artifacts due to dirty camera lenses and thin occluders


声明

本文仅作为个人学习记录。