1.实验原理
1.1光流概念
光流(Optical Flow)是空间运动物体在观测成像面上的像素运动的瞬时速度。光流场(Optical Flow Field)是指图像灰度模式的表面运动(即图像灰度的变化)。
1.2光流场工作原理
我们利用算法来实现。
假设:
1.连续的两帧图像之间,目标像素的亮度不改变
2.相邻的像素之间有相似的移动
设图像在像素点,时刻t的灰度值为I(x,y,t)。在经过了时间后,此像素在下一帧移动了,此时的灰度值为,而且亮度不变,因此
将上诉右式子做泰勒展开
在消去I(x, y, t)并忽略掉阶数大于或等于2的项后,得到光流约束方程
其中
和分别是图像的梯度,是图像沿着时间的梯度。
利用第二个假设,算法使用3 X 3的窗口。因此这个窗口中有9个像素点满足公式
用最小二乘法解得
以上都是基于运动距离较短的情况,如果在短时间内运动的距离很长,那么我们可以通过图像金字塔将大幅度的运动压缩为小幅度的运动。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
2.实验步骤
2.1视频准备
首先固定相机的位置,对目标物体的运动进行拍摄,保持光照亮度不变
2.2程序实现
为了实现跟踪目标物体的任务,我们将其转化为跟踪目标物体上特定点的任务。
我们调用库中的函数来实现
首先读取第一帧,将彩色图像转化为灰度图,然后利用cv2.goodFeactureToTrack()找到角点
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params)
然后迭代的使用LK算法实现目标点的跟踪
nextPts,status,err = cv.calcOpticalFlowPyrLK( prevImg, nextImg, prevPts, nextPts[, status[, err[, winSize[, maxLevel[, criteria[, flags[, minEigThreshold]]]]]]])
prevImg表示上一帧图像、nextImg表示当前帧图像,prevPts表示上一帧图像的角点,nextPts表示当前帧图像的角点、winSize表示局部运动中金字塔的窗口大小,maxLevel表示金字塔的层数,criteria表示终止条件。
2.3绘制运动轨迹
for i, (new, old) in enumerate