稀疏光流和稠密光流,OpenCV实现

本文介绍了光流的基本概念,包括稀疏光流的Lucas-Kanade法和稠密光流的Gunnar-Farneback算法。在OpenCV中,利用cv2.goodFeaturesToTrack()寻找角点,cv2.calcOpticalFlowPyrLK()计算稀疏光流,以及cv2.calcOpticalFlowFarneback()计算稠密光流。通过实例展示了如何使用这些函数来处理视频中的光流问题。
摘要由CSDN通过智能技术生成

# 参考:光流Optical Flow介绍与OpenCV实现_zouxy09的专栏-CSDN博客_opencv 光流

# 参考:光流(Optical Flow)算法原理及示例

# 参考:机器学习进阶-光流估计 1.cv2.goodFeaturesToTrack(找出光流估计所需要的角点) 2.cv2.calcOpticalFlowPyrLK(获得光流检测后的角点位置) 3.cv2.add(进行像素点的加和) - python我的最爱 - 博客园

# 参考:Gunnar-Farneback算法原理 & Farneback光流法在UCSD异常数据集上的Demo_Carson1145的博客-CSDN博客

基本概念

光流是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素时间域上的变化以及相邻帧之间的相关性来找到上一帧和当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。

光流是场景中的前景目标的本身移动、相机的运动,或两者的共同运动而产生的。

前提:

  • 物体的像素强度不会在连续帧之间改变
  • 一张图像中相邻的像素具有相似的运动

光流的计算方法 <概念可跳过>

第一帧中的像素I(x, y)在时间dt后移动到第二帧图像的I(x + dx, y + dy)处

根据灰度值不变得到:

I(x, y, t) = I(x + dx, y + dy, t + dt)

假设运动很小,从泰勒级数推导一阶泰勒展开式:

I(x + \bigtriangleup x, y + \bigtriangleup y, t + \bigtriangleup t) = I(x, y, t) + \frac{\partial I}{\partial x}\bigtriangleup x + \frac{\partial I}{\partial y}\bigtriangleup y + \frac{\partial I}{\partial t}\bigtriangleup t + \circ (x, y, t)

进行等式变换后,得到:

\frac{\partial I}{\partial x}dx + \frac{\partial I}{\partial y}dy + \frac{\partial I}{\partial t}dt = 0

同除以dt,得到:

\frac{\partial I}{\partial x}\frac{dx}{dt} + \frac{\partial I}{\partial y}\frac{dy}{dt}=- \frac{\partial I}{\partial t}

对等号右侧进行泰勒级数展开,消去相同项,并处以dt得到:

f_xu + f_yv + f_t = 0

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,您想了解关于稀疏光流Python OpenCV 的应用和使用方法是吗?那么我可以简单地为您介绍一下。 稀疏光流是一种计算图像像素运动的方法,它可以通过检测两个连续帧之间的像素强度变化来计算像素的运动向量。Python OpenCV提供了实现稀疏光流的函数 cv2.calcOpticalFlowPyrLK()。 以下是一个简单的示例代码,演示了如何使用稀疏光流来计算两个连续帧之间的像素运动: ``` import cv2 # 读取两个连续帧 frame1 = cv2.imread('frame1.jpg') frame2 = cv2.imread('frame2.jpg') # 转换为灰度图像 gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) # 设置参数 lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) # 获取关键点 p0 = cv2.goodFeaturesToTrack(gray1, mask=None, maxCorners=100, qualityLevel=0.3, minDistance=7) # 计算光流 p1, st, err = cv2.calcOpticalFlowPyrLK(gray1, gray2, p0, 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() frame1 = cv2.circle(frame1, (a, b), 5, (0, 255, 0), -1) frame1 = cv2.line(frame1, (a, b), (c, d), (255, 0, 0), 2) # 显示结果 cv2.imshow('frame', frame1) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述示例代码,我们首先读取了两个连续帧,然后将它们转换为灰度图像。接下来,我们使用 cv2.goodFeaturesToTrack() 函数获取了第一帧的关键点,并将这些关键点作为稀疏光流的输入。然后,我们使用 cv2.calcOpticalFlowPyrLK() 函数计算了两个连续帧之间的稀疏光流。最后,我们选择好的点,并使用 cv2.circle() 和 cv2.line() 函数绘制了运动向量。 希望这个简单的示例代码可以帮助您更好地理解稀疏光流Python OpenCV 的应用和使用方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值