光流(Optical Flow)是计算机视觉中的一个重要概念,它通过分析图像序列中的像素运动来估计场景中的运动。OpenCV 提供了多种光流算法,本教程将介绍如何使用 OpenCV 进行光流计算。

算法概述

OpenCV 支持多种光流算法,包括:

  • Lucas-Kanade 算法:最常用的光流算法之一,适用于中等速度的运动。
  • Shi-Tomasi 算法:与 Lucas-Kanade 算法类似,但能处理更快的运动。
  • PyramidLK 算法:基于 Lucas-Kanade 算法,使用多尺度图像进行加速。
  • Farneback 算法:适用于各种速度的运动,包括快速运动。

示例代码

以下是一个使用 Lucas-Kanade 算法的简单示例:

import cv2

# 读取图像
frame1 = cv2.imread('frame1.jpg')
frame2 = cv2.imread('frame2.jpg')

# 转换为灰度图
gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)

# 初始化点
pt1 = np.array([[100, 100], [200, 100], [300, 100]])
pt2 = np.array([[100, 100], [200, 100], [300, 100]])

# 计算光流
pt3, st, err = cv2.calcOpticalFlowPyrLK(gray1, gray2, pt1, None, winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

# 绘制光流路径
for i in range(len(pt1)):
    cv2.line(frame1, pt1[i], pt3[i], (0, 255, 0), 2)
    cv2.circle(frame1, pt3[i], 5, (0, 0, 255), -1)

# 显示结果
cv2.imshow('Optical Flow', frame1)
cv2.waitKey(0)
cv2.destroyAllWindows()

更多信息

想了解更多关于 OpenCV 光流的细节,请访问OpenCV 光流文档

相关教程