光流(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 光流文档。