好的,我来帮你系统梳理 Kanade 算法,也就是经典的 Lucas-Kanade 光流法,从概念、原理到应用。


1️⃣ Kanade 算法简介

  • 全称:Lucas-Kanade 光流算法
  • 类型:光流估计算法(Optical Flow)
  • 应用场景
    • 运动目标检测与跟踪
    • 视频稳定
    • 三维重建(Structure from Motion)
    • 自动驾驶视觉系统

光流(Optical Flow)描述的是图像中像素点随时间的移动速度和方向。


2️⃣ 算法原理

2.1 光流基本假设

  1. 亮度恒定假设

I(x,y,t)=I(x+Δx,y+Δy,t+Δt)

  • 物体亮度在小时间间隔内不变
  1. 小位移假设
  • Δ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️⃣ 算法步骤

  1. 读取 连续两帧图像:I(t), I(t+1)
  2. 计算每个像素的 梯度 I_x, I_y, I_t
  3. 对每个窗口应用 最小二乘法,求解光流向量 (u,v)
  4. 将光流结果叠加在图像上,可用于目标跟踪

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️⃣ 总结

  1. Kanade 算法是 经典光流估计方法,用于局部特征跟踪
  2. 核心思想:亮度恒定 + 局部一致 + 最小二乘求解光流
  3. 实际应用:
    • 运动检测、视频分析
    • 自动驾驶视觉
    • 目标跟踪与动作分析