在本章中,

  • 我们将了解光流的概念及其使用Lucas-Kanade方法的估计。

  • 我们将使用cv.calcOpticalFlowPyrLK()之类的函数来跟踪视频中的特征点。

  • 我们将使用cv.calcOpticalFlowFarneback()方法创建一个密集的光流场。

光流

光流是由物体或照相机的运动引起的两个连续帧之间图像物体的视运动的模式。它是2D向量场,其中每个向量都是位移向量,表示点从第一帧到第二帧的运动。考虑下面的图片(图片提供:Wikipedia关于Optical Flow的文章)。

它显示了一个球连续5帧运动。箭头显示其位移向量。光流在以下领域具有许多应用:

  • 运动的结构

  • 视频压缩

  • 视频稳定…

光流基于以下几个假设进行工作:

1.在连续的帧之间,对象的像素强度不变。

2.相邻像素具有相似的运动。

考虑第一帧中的像素(在此处添加新维度:时间。之前我们只处理图像,因此不需要时间)。它在时间之后拍摄的下一帧中按距离移动。因此,由于这些像素相同且强度不变,因此可以说

然后采用泰勒级数的右侧逼近,去掉常用项并除以得到下面的式子

其中

上述方程式称为光流方程式。在其中,我们可以找到,它们是图像渐变。同样,是随时间变化的梯度。但是(u,v)是未知的。我们不能用两个未知变量来求解这个方程。因此,提供了几种解决此问题的方法,其中一种是Lucas-Kanade。

Lucas-Kanade 方法

之前我们已经看到一个假设,即所有相邻像素将具有相似的运动。Lucas-Kanade方法在该点周围需要3x3色块。因此,所有9个点都具有相同的运动。我们可以找到这9点的。所以现在我们的问题变成了求解带有两个未知变量的9个方程组的问题。用最小二乘拟合法可获得更好的解决方案。下面是最终的解决方案,它是两个方程式-两个未知变量问题,求解以获得解决答案。

(用哈里斯拐角检测器检查逆矩阵的相似性。这表示拐角是更好的跟踪点。)因此,从用户的角度来看,这个想法很简单,我们给一些跟踪点,我们接收到这些光流矢量点。但是同样存在一些问题。到现在为止,我们只处理小动作,所以当大动作时它就失败了。为了解决这个问题,我们使用金字塔。当我们上金字塔时,较小的动作将被删除,较大的动作将变为较小的动作。因此,通过在此处应用Lucas-Kanade,我们可以获得与尺度一致的光流。

OpenCV中的Lucas-Kanade

OpenCV在单个函数cv.calcOpticalFlowPyrLK()中提供所有这些功能。在这里,我们创建一个简单的应用程序来跟踪视频中的某些点。为了确定点,我们使用cv.goodFeaturesToTrack()。我们采用第一帧,检测其中的一些Shi-Tomasi角点,然后使用Lucas-Kanade光流迭代地跟踪这些点。对于函数cv.calcOpticalFlowPyrLK(),我们传递前一帧,前一点和下一帧。它返回下一个点以及一些状态码,如果找到下一个点,状态码的值为1,否则为零。我们将这些下一个点迭代地传递为下一步中的上一个点。请参见下面的代码:

import numpy as np
import cv2 as cv
import argparse
parser = argparse.ArgumentParser(description='This sample demonstrates Lucas-Kanade Optical Flow calculation. \The example file can be downloaded from: \https://www.bogotobogo.com/python/OpenCV_Python/images/mean_shift_tracking/slow_traffic_small.mp4')
parser.add_argument('image', type=str, help='path to image file')
args = parser.parse_args()
cap = cv.VideoCapture(args.image)
# 用于ShiTomasi拐点检测的参数
feature_params = dict( maxCorners = 100,qualityLevel = 0.3,minDistance = 7,blockSize = 7 )
# lucas kanade光流参数
lk_params = dict( winSize  = (15,15),maxLevel = 2,criteria = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03))
# 创建一些随机的颜色
color = np.random.randint(0,255,(100,3))
# 拍摄第一帧并在其中找到拐角
ret, old_frame = cap.read()
old_gray = cv.cvtColor(old_frame, cv.COLOR_BGR2GRAY)
p0 = cv.goodFeaturesToTrack(old_gray, mask = None, **feature_params)
# 创建用于作图的掩码图像
mask = np.zeros_like(old_frame)
while(1):ret,frame = cap.read()frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 计算光流p1, st, err = cv.calcOpticalFlowPyrLK(old_gray, frame_gray, 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()mask = cv.line(mask, (a,b),(c,d), color[i].tolist(), 2)frame = cv.circle(frame,(a,b),5,color[i].tolist(),-1)img = cv.add(frame,mask)cv.imshow('frame',img)k = cv.waitKey(30) & 0xffif k == 27:break# 现在更新之前的帧和点old_gray = frame_gray.copy()p0 = good_new.reshape(-1,1,2)

(此代码不会检查下一个关键点的正确性。因此,即使任何特征点在图像中消失了,光流也有可能找到下一个看起来可能与它接近的下一个点。因此,对于稳健的跟踪,实际上 应该以特定的时间间隔检测点。OpenCV样本附带了这样一个样本,该样本每5帧发现一次特征点,并且还对光流点进行了后向检查,以仅选择良好的流点。请参阅代码 samples/python/lk_track.py)。

查看我们得到的结果:

OpenCV中的密集光流

Lucas-Kanade方法计算稀疏特征集的光流(在我们的示例中为使用Shi-Tomasi算法检测到的角)。OpenCV提供了另一种算法来查找密集的光流。它计算帧中所有点的光通量。它基于Gunner Farneback的算法,在2003年Gunner Farneback的“基于多项式展开的两帧运动估计”中对此进行了解释。

下面的示例显示了如何使用上述算法找到密集的光流。我们得到一个带有光流矢量(u,v)(u,v)的2通道阵列。我们找到了它们的大小和方向。我们对结果进行颜色编码,以实现更好的可视化。方向对应于图像的色相值。幅度对应于值平面。请参见下面的代码:

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(cv.samples.findFile("vtest.avi"))
ret, frame1 = cap.read()
prvs = cv.cvtColor(frame1,cv.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[...,1] = 255
while(1):ret, frame2 = cap.read()next = cv.cvtColor(frame2,cv.COLOR_BGR2GRAY)flow = cv.calcOpticalFlowFarneback(prvs,next, None, 0.5, 3, 15, 3, 5, 1.2, 0)mag, ang = cv.cartToPolar(flow[...,0], flow[...,1])hsv[...,0] = ang*180/np.pi/2hsv[...,2] = cv.normalize(mag,None,0,255,cv.NORM_MINMAX)bgr = cv.cvtColor(hsv,cv.COLOR_HSV2BGR)cv.imshow('frame2',bgr)k = cv.waitKey(30) & 0xffif k == 27:breakelif k == ord('s'):cv.imwrite('opticalfb.png',frame2)cv.imwrite('opticalhsv.png',bgr)prvs = next

查看以下结果:

☆☆☆为方便大家查阅,小编已将OpenCV-Python专栏文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“文章”,如图:或点击下方“阅读原文”,进入OpenCV-Python专栏,即可查看系列文章。

不断更新资源

获取更多精彩

长按二维码扫码关注

OpenCV系列之光流 | 四十八相关推荐

  1. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

  2. OpenCV系列之图像去噪 | 五十八

    目标 在本章中, 你将学习用于去除图像中噪声的非局部均值去噪算法. 你将看到不同的函数,例如cv.fastNlMeansDenoising(),cv.fastNlMeansDenoisingColor ...

  3. OpenCV系列之图像梯度 | 十八

    目标 在本章中,我们将学习: 查找图像梯度,边缘等 我们将看到以下函数:cv.Sobel(),cv.Scharr(),cv.Laplacian()等 理论 OpenCV提供三种类型的梯度滤波器或高通滤 ...

  4. OpenCV开发笔记(四十八):红胖子8分钟带你深入了解直方图均衡化(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  5. SpringBoot2.x系列教程(四十八)Spring Boot集成JDBCTemplate

    JDBCTemplate相对于其他ORM框架来说是极其简单和极容易上手的一个数据库连接的封装.在学习JDBCTemplate之前,我们先来了解一下JDBC相关的概念和操作. JDBC简介 Java数据 ...

  6. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  7. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  8. [Python从零到壹] 四十八.图像增强及运算篇之形态学开运算、闭运算和梯度运算

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  9. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

最新文章

  1. 【ubuntu+opencv3】ubuntu16.04+qt5+opencv3.2.0编译与安装
  2. chrome应用程序无法启动因为并行配置不正确的处理办法(亲测版本不一样也是类似的操作)
  3. RabbitMQ之镜像队列
  4. imp-00017 oracle2298,急,imp怪異問題,請高手協助
  5. 立志10天学会C++基础应用—day02 代码清晰易懂 涉及数据结构算法的知识 写完了~我也麻了
  6. 互联网日报 | 6月23日 星期三 | 苏宁置业否认破产及相关传闻;满帮集团正式登陆纽交所;百度公布2030碳中和目标...
  7. LG G8X官方图流出:LG双屏手机也意外曝光 或IFA发布
  8. 详解Python变量作用域
  9. php与ipa接口登录验证失败,thinkPHP5.0开发微信小程序登录接口signature验证失败
  10. 为CIO而准备的技术
  11. 网页设计作业-HTML5+CSS大作业——端午节日(25页) 图片滚动
  12. QQ群发精灵V3.2
  13. Linux服务器集群系统(一)——LVS项目介绍
  14. 四叶草关闭啰嗦模式_真正的高性能车!Giulia 四叶草评测
  15. 颈部肌肉的锻炼方法?
  16. 网络时代的平民教育家-- Salman Khan
  17. 云原生背景下的运维价值思考与实践
  18. 狂神Docker通俗易懂学习笔记2
  19. Linux安全基础知识
  20. 计算机高级技师证怎么考?

热门文章

  1. (附源码)springboot高校二手教材管理平台 毕业设计 231057
  2. Android studio编译很久 Gradle Build Running特别慢问题解决
  3. 2018中国IT领袖峰会
  4. 有图有真相,网页版HTML5飞机射击游戏
  5. get新方法:一个歌曲分享链接提取歌曲文件
  6. html5钢琴效果,HTML5 钢琴演奏应用(Music Player)
  7. SimCLR v2 论文阅读
  8. NBUT - 1457 Sona
  9. 火狐浏览器--用法/快捷键/背景色
  10. 家校沟通初创公司“云纸条”,将传统的纸条体验搬至线上,并尝试打造家校互动社区