python 使用Farneback光流法检测视频中的运动轨迹,将轨迹点存入数组
时间: 2024-03-27 08:36:29 浏览: 132
好的,针对您的问题,我可以给出以下Python代码示例,使用OpenCV库中的Farneback光流法检测视频中的运动轨迹,并将轨迹点存入数组:
```python
import cv2
import numpy as np
# 读取视频
cap = cv2.VideoCapture('test.mp4')
# 获取第一帧图像
ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
# 创建空的数组,用于存储轨迹点
points = []
while True:
# 读取当前帧图像
ret, frame2 = cap.read()
if not ret:
break
next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# 计算光流
flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
# 选取一些特征点进行绘制
step = 20
for y in range(0, flow.shape[0], step):
for x in range(0, flow.shape[1], step):
fx, fy = flow[y, x]
# 如果光流向量的长度较小,则忽略
if abs(fx) < 1 and abs(fy) < 1:
continue
# 绘制轨迹点
points.append((x, y))
cv2.circle(frame2, (x, y), 2, (0, 255, 0), -1)
cv2.line(frame2, (x, y), (int(x+fx), int(y+fy)), (0, 0, 255), 1)
# 显示结果
cv2.imshow('frame', frame2)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
prvs = next
# 释放资源
cap.release()
cv2.destroyAllWindows()
# 输出轨迹点数组
print(np.array(points))
```
这段代码会读取名为 `test.mp4` 的视频文件,并使用Farneback光流法计算每一帧图像的运动轨迹。在每个特征点处,会绘制一个小圆点,并以光流向量的方向绘制一条线段。将所有绘制出的特征点的坐标存入 `points` 数组中,并在程序结束时输出该数组。
阅读全文