光流堆叠(Optical flow stacking)代码
时间: 2024-02-15 13:02:51 浏览: 133
以下是一个简单的光流堆叠代码的示例,使用OpenCV库实现:
```python
import numpy as np
import cv2
cap = cv2.VideoCapture(0) # 打开摄像头
ret, frame1 = cap.read() # 读取第一帧
# 定义光流参数
lk_params = dict(winSize=(15, 15), maxLevel=2,
criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
# 随机颜色
color = np.random.randint(0, 255, (100, 3))
# 创建一个空黑色图像
stacked = np.zeros_like(frame1)
while True:
ret, frame2 = cap.read() # 读取下一帧
if not ret:
break
# 将两帧图像转换为灰度图像
gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# 计算光流
p1, st, err = cv2.calcOpticalFlowPyrLK(gray1, gray2, None, None, **lk_params)
# 选择良好的特征点
good_new = p1[st == 1]
good_old = p0[st == 1]
# 绘制光流轨迹
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()
c, d = old.ravel()
stacked = cv2.line(stacked, (a, b), (c, d), color[i].tolist(), 2)
# 显示堆叠图像
cv2.imshow('stacked', stacked)
# 更新帧
frame1 = frame2.copy()
p0 = good_new.reshape(-1, 1, 2)
# 按下 ESC 键退出
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
```
该代码使用摄像头捕获视频流,并计算相邻帧之间的光流。然后,它将光流轨迹绘制到一个黑色的图像上,并将堆叠图像显示在屏幕上。按下 ESC 键退出程序。