calcOpticalFlowPyrLK()使用例子
时间: 2023-08-18 22:07:09 浏览: 40
下面是一个使用cv2.calcOpticalFlowPyrLK函数的简单例子:
```python
import cv2
import numpy as np
# 读取视频帧
cap = cv2.VideoCapture('test.mp4')
ret, frame1 = cap.read()
# 定义特征点的位置
feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7)
prev_pts = cv2.goodFeaturesToTrack(cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY), mask=None, **feature_params)
# 定义光流追踪参数
lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
while True:
ret, frame2 = cap.read()
if not ret:
break
# 将前一帧的特征点作为输入
next_pts, status, error = cv2.calcOpticalFlowPyrLK(cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY), cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY), prev_pts, None, **lk_params)
# 选取跟踪成功的特征点
good_new = next_pts[status == 1]
good_old = prev_pts[status == 1]
# 绘制光流轨迹
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()
c, d = old.ravel()
mask = cv2.line(mask, (a, b), (c, d), (0, 255, 0), 2)
frame2 = cv2.circle(frame2, (a, b), 5, (0, 0, 255), -1)
img = cv2.add(frame2, mask)
cv2.imshow('frame', img)
# 更新前一帧特征点
prev_pts = good_new.reshape(-1, 1, 2)
k = cv2.waitKey(30)
if k == 27:
break
cv2.destroyAllWindows()
cap.release()
```
在这个例子中,我们首先读取视频帧,并使用cv2.goodFeaturesToTrack函数找到第一帧图像中的一些角点作为特征点。然后,我们定义了光流追踪参数,并在循环中使用cv2.calcOpticalFlowPyrLK函数计算每一帧中的特征点位置。最后,我们将跟踪成功的特征点绘制成光流轨迹,并更新前一帧的特征点。