好的,我来帮你系统梳理 Kanade 算法,也就是经典的 Lucas-Kanade 光流法,从概念、原理到应用。
1️⃣ Kanade 算法简介
- 全称:Lucas-Kanade 光流算法
- 类型:光流估计算法(Optical Flow)
- 应用场景:
- 运动目标检测与跟踪
- 视频稳定
- 三维重建(Structure from Motion)
- 自动驾驶视觉系统
光流(Optical Flow)描述的是图像中像素点随时间的移动速度和方向。
2️⃣ 算法原理
2.1 光流基本假设
- 亮度恒定假设:
I(x,y,t)=I(x+Δx,y+Δy,t+Δt)
- 物体亮度在小时间间隔内不变
- 小位移假设:
- Δx,Δy 很小,可使用泰勒展开
2.2 光流方程
由泰勒展开可得 光流约束方程:Ixu+Iyv+It=0
- Ix,Iy,It 分别为图像亮度对 x、y、t 的偏导数
- u,v 为光流在 x、y 方向的速度
- 方程 一个方程两个未知数 → 需假设局部区域内光流一致
2.3 Lucas-Kanade 方法
- 将图像分为小窗口(如 5×5)
- 假设窗口内所有像素光流一致
- 利用最小二乘法求解:
[∑Ix2∑IxIy∑IxIy∑Iy2][uv]=−[∑IxIt∑IyIt]
- 矩阵求解即可得到局部光流向量 (u,v)
3️⃣ 算法步骤
- 读取 连续两帧图像:I(t), I(t+1)
- 计算每个像素的 梯度 I_x, I_y, I_t
- 对每个窗口应用 最小二乘法,求解光流向量 (u,v)
- 将光流结果叠加在图像上,可用于目标跟踪
4️⃣ Python / OpenCV 示例
import cv2
import numpy as np
cap = cv2.VideoCapture("video.mp4")
ret, first_frame = cap.read()
prev_gray = cv2.cvtColor(first_frame, cv2.COLOR_BGR2GRAY)
# 角点检测
p0 = cv2.goodFeaturesToTrack(prev_gray, maxCorners=100, qualityLevel=0.3, minDistance=7)
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 计算光流
p1, st, err = cv2.calcOpticalFlowPyrLK(prev_gray, gray, p0, None)
# 可视化光流
for i, (new, old) in enumerate(zip(p1, p0)):
a, b = new.ravel()
c, d = old.ravel()
cv2.line(frame, (a,b), (c,d), (0,255,0), 2)
cv2.circle(frame, (a,b), 3, (0,0,255), -1)
cv2.imshow("frame", frame)
if cv2.waitKey(30) & 0xFF == 27:
break
prev_gray = gray.copy()
p0 = p1
cap.release()
cv2.destroyAllWindows()
- 使用
cv2.calcOpticalFlowPyrLK
就是 Lucas-Kanade 光流实现 - 适合跟踪稀疏特征点(角点)
5️⃣ 特点与优缺点
优点:
- 计算量小,适合实时应用
- 稳定性好,适合小位移跟踪
缺点:
- 对光照变化敏感
- 仅适合小位移(小窗口假设)
- 大运动或遮挡区域效果差
改进方向:
- 多层金字塔 LK(Pyramidal LK) → 适应大运动
- 稠密光流(Dense Optical Flow) → 对整个图像计算光流
6️⃣ 总结
- Kanade 算法是 经典光流估计方法,用于局部特征跟踪
- 核心思想:亮度恒定 + 局部一致 + 最小二乘求解光流
- 实际应用:
- 运动检测、视频分析
- 自动驾驶视觉
- 目标跟踪与动作分析
发表回复