传统循迹小车靠几颗红外对管去认地上的黑线,调试起来对场地颜色很挑剔。后来我把摄像头装上车,用OpenCV做颜色识别,小车能看着画面里一条彩色线条自己修正方向跑。相比固定对管,摄像头方案看得见整条路的走向,改个颜色阈值就能换线,灵活很多。
这套识别的核心思路其实很朴素:把摄像头每一帧图里“我想要的颜色”单独挑出来,找到它在画面里的位置,然后根据它偏离画面中心的多少去调整车轮转向。方向对不对,全靠颜色找得准不准。

为什么用HSV而不是RGB
一开始很多人习惯拿RGB去匹配颜色,但光照一变,同一张纸的RGB值能差出十万八千里,阈值很难写。换成HSV就稳很多:H是色相(颜色本身),S是饱和度,V是亮度。因为光照主要影响亮度V,而色相H相对稳定,所以只要圈住目标颜色的H区间,再放宽一点S和V,就能在阴天和阳光下来回切换都认得出线。
三行核心代码做了什么
OpenCV里做这件事,关键就三步。第一步用cv2.inRange把原图转成一张黑白掩膜图,落在目标HSV范围内的像素变白,其余变黑;第二步在掩膜图上找轮廓,或者算白色像素的重心;第三步拿这个重心横坐标和画面中心一比,偏差就是我们要的转向误差。
拿到误差之后,把误差乘以一个比例系数,加到小车左右轮的转速差上就行:线偏左就让左轮慢点、右轮快点,车身跟着偏回中间。误差为零时两轮同速,直着走。这里比例系数调太大会来回抖,调太小又跟不上弯道,要现场一点点调。

避坑经验,实测才有用
第一个坑是环境光照。直射阳光会把高光的表面拉成一片亮白,影响S和V的判断。我一般把识别区域限制在车头前方一小块,并定时重新采集一次现场背景,让阈值更贴近实际光线。
第二个坑是反光。胶带线某些角度会反白光,看起来像大片白色杂斑,这时适当降低S和V的上限,把过于亮的像素排除掉,掩膜就不会糊成一片。
第三个坑是帧率和延迟。摄像头处理在树莓派上跑,画面帧率有限,转向控制别指望一帧就跟上,建议用小步长的修正加一点自整定,方向舵会更顺滑而不是死板地左右乱甩。
用OpenCV给小车装“眼睛”,门槛比想象中低。你不一定需要多么深的视觉算法,把HSV阈值、轮廓重心、差速转向这三步跑通,一台能自己找线的小车就成型了。再往下,还能延伸到识别小物件、追球、甚至简单的人脸跟随,玩法一下就打开了。



三行核心代码思路真清爽,改天把我那台红外循迹也换成摄像头方案
帧率那个坑很真实,PID比例调太大反而死板地左右乱甩,还是小步修正舒服
HSV比RGB稳这点太关键了,光照一变RGB阈值根本没法用,换HSV马上正常