OpenCV 光流法原理与实战指南:从 Lucas-Kanade 到稠密光流

前言 在计算机视觉的众多技术中,光流法(Optical Flow)可以说是最古老也最具生命力的算法之一。从 1950 年代心理学家 Gibson 首次提出视觉运动感知理论,到 1981 年 Lucas 和 Kanade 发表那篇经典论文,再到今天深度学习时代的 RAFT、GMFlow 等现代光流网络,这项技术已经走过了半个多世纪的历程。 我第一次接触光流法是在大学的计算机视觉课程上。当时教授在黑板上写下那个著名的光流方程 Iₓu + Iᵧv + Iₜ = 0,然后告诉我们:“这个简单的方程,蕴含了理解运动的全部秘密。” 那时候我还不太理解这句话的含义,直到后来在实际项目中用它实现了一个简单的视频目标跟踪系统,才真正体会到光流法的强大之处。 在今天的边缘计算和嵌入式 AI 场景中,光流法依然占据着不可替代的地位。相比于深度学习的目标跟踪算法,传统光流法具有以下优势: 计算量小:不需要复杂的神经网络,可以在资源受限的嵌入式设备上实时运行 无需训练:不需要标注数据,开箱即用 实时性好:很多优化后的实现可以轻松达到 30 FPS 以上 适用范围广:从无人机的视觉导航,到视频防抖,再到动作识别,光流法无处不在 本文将带您从零开始深入理解光流法的原理,从最基本的亮度恒定假设,到经典的 Lucas-Kanade 算法,再到 OpenCV 中的各种光流法实现。我们会通过大量代码示例,让您不仅理解理论,更能在实际项目中应用这项技术。 一、什么是光流法? 1.1 光流的定义 简单来说,光流就是空间中运动物体在成像平面上像素运动的瞬时速度。当你盯着窗外行驶的汽车时,视网膜上汽车图像的移动速度就是光流。 更正式的定义是:给定图像序列 I(x, y, t),光流法的目标是为每个像素点 (x, y) 找到一个速度向量 (u, v),使得: I(x, y, t) = I(x + u·dt, y + v·dt, t + dt) 这个等式表达的就是:经过微小的时间间隔 dt 后,像素点 (x, y) 移动到了 (x + u·dt, y + v·dt),而亮度保持不变。...

May 22, 2026 · 7 min · 👁️ 0 · Tech Snippets

基于 OpenCV 的红色物体识别与多目标跟踪实战

前言 在计算机视觉领域,颜色检测是最基础也最实用的技术之一。红色作为一种醒目的颜色,在交通标志、安全警示、工业自动化等场景中应用广泛。今天我们来深入探讨如何用 OpenCV 实现红色物体的识别,并在此基础上实现多目标跟踪功能。 这篇文章不是简单的 API 调用演示,而是从原理出发,结合实际场景中的问题,一步步构建一个健壮的检测与跟踪系统。我们会遇到光照变化、噪声干扰、部分遮挡等实际问题,然后逐一解决。 一、为什么选择 HSV 颜色空间? 当我们谈论颜色检测时,很多新手第一反应是直接在 RGB 图像上做阈值处理。比如,红色物体的 R 通道值比较高,那么我们设定一个阈值,只保留 R > 200 的像素。但实际一试就会发现,这种方法效果非常差。 问题出在哪里?RGB 颜色空间虽然直观,但它把亮度和颜色信息混在一起了。同一个红色物体,在强光下和阴影下,RGB 值可能差异巨大,但人眼感知到的颜色其实是一样的。这就导致基于 RGB 的阈值检测非常不稳定。 这时候 HSV 颜色空间就派上用场了。HSV 把颜色信息分解成三个独立的通道: H (Hue, 色调):表示颜色的种类,取值范围在 OpenCV 中是 0-179 S (Saturation, 饱和度):表示颜色的鲜艳程度,0-255 V (Value, 明度):表示颜色的明亮程度,0-255 HSV 的优势在于,颜色信息主要由 H 通道决定,而 V 通道单独控制亮度。这意味着,即使光线变化导致 V 值波动,只要 H 值在我们设定的红色范围内,我们仍然能稳定地检测到目标。 二、红色在 HSV 空间中的特殊性 红色有个有意思的特性:它在色相环的两端都有分布。在标准的 0-360 度色相环中,红色出现在 0 度附近和 360 度附近。OpenCV 为了用 8 位表示,把这个范围减半成了 0-179,所以红色就分布在 0-10 和 170-179 这两个区间。 这是很多初学者容易踩的坑。如果你只检测 0-10 这个区间,会发现稍微偏紫红或者偏橙红一点的物体就检测不到了。正确的做法是同时检测这两个区间,然后把结果合并。...

April 23, 2026 · 5 min · 👁️ 3 · Tech Snippets