使用python CV2编写一个程序 绘制两张图像的光流向量
时间: 2024-02-12 17:03:55 浏览: 81
一个写光线的程序
以下是使用Python和OpenCV绘制两张图像的光流向量的程序示例:
```python
import cv2
import numpy as np
# 读取两张图像
frame1 = cv2.imread('frame1.jpg')
frame2 = cv2.imread('frame2.jpg')
# 定义光流法的参数
lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
# 定义前一帧图像的特征点
old_points = cv2.goodFeaturesToTrack(cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY), maxCorners=100, qualityLevel=0.3, minDistance=7)
# 将前一帧图像的特征点转换为浮点型,用于计算光流
old_points = np.float32(old_points)
# 计算当前帧图像中的特征点
current_points, status, error = cv2.calcOpticalFlowPyrLK(cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY), cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY), old_points, None, **lk_params)
# 定义随机颜色
color = np.random.randint(0, 255, (100, 3))
# 绘制光流向量
for i, (new, old) in enumerate(zip(current_points, old_points)):
a, b = new.ravel()
c, d = old.ravel()
mask = cv2.line(frame2, (a, b), (c, d), color[i].tolist(), 2)
frame2 = cv2.circle(frame2, (a, b), 5, color[i].tolist(), -1)
# 将光流向量绘制到当前帧图像中
img = cv2.add(frame2, mask)
# 显示当前帧图像
cv2.imshow('frame', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
需要注意的是,这个程序使用的是光流法的稀疏算法,只对一些选定的特征点进行光流计算。如果要使用稠密算法,可以使用cv2.calcOpticalFlowFarneback函数。此外,程序中使用了一个随机颜色数组,用于将每个特征点的光流向量绘制成不同的颜色。如果你希望所有的光流向量都是同一种颜色,可以将color数组替换成一个固定的颜色值。
阅读全文