热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

opencv视频分析之光流

文章目录1.原理2.Lucas-Kanade法3.稠密光流1.原理由于目标对象或者摄像机的移动,造成的图像对象在连续两帧图像中的移动被称为光流。它是一个2D向量场&

文章目录

      • 1.原理
      • 2.Lucas-Kanade 法
      • 3.稠密光流


1.原理


  • 由于目标对象或者摄像机的移动,造成的图像对象在连续两帧图像中的移动被称为光流。它是一个2D 向量场,可以用来显示一个点从第一帧图像到第二帧图像之间的移动。
    在这里插入图片描述
    上图显示了一个点在连续的五帧图像间的移动。箭头表示光流场向量。光流在很多领域中都很有用: 运动重建结构、视频压缩、Video Stabilization 等。
  • 光流是基于以下假设的:1. 在连续的两帧图像之间(目标对象的)像素的灰度值不改变。2. 相邻的像素具有相同的运动。

2.Lucas-Kanade 法


  • 利用一个3x3 邻域中的9 个点具有相同运动的这一点,找到这9 个点的光流方程,用它们组成一个具有两个未知数9 个等式的方程组。
  • 从使用者的角度来看,我们去跟踪一些点,然后就会获得这些点的光流向量。但我们处理的都是很小的运动。如果有大的运动怎么办呢?我们可以使用图像金字塔的顶层。此时小的运动被移除,大的运动装换成了小的运动,再使用Lucas-Kanade算法,我们就会得到尺度空间上的光流。

代码速记:

  • cv2.goodFeaturesToTrack()
  • cv2.calcOpticalFlowPyrLK()

实战:

def lucas(self):cap = cv2.VideoCapture('../images/slow.flv')#ShiTomasi角点检测所需参数feature_params = dict(maxCorners=100,qualityLevel=0.3,minDistance=7,blockSize=7)#lucas kanade光流所需参数# maxLevel 为使用的图像金字塔层数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))#【1】读取第一帧,并进行角点检测,确定要跟踪的点ret, old_frame = cap.read()old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)# 创建用于绘画的遮罩图像mask = np.zeros_like(old_frame)while True:ret, frame = cap.read()frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 【2】给光流函数传入前一帧图像、下一帧图像、前一帧图像的角点p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)#函数将返回带有状态数的点。#如果状态数是1,那说明在下一帧图像中找到了这个点(上一帧中角点)。#如果状态数是0,就说明没有在下一帧图像中找到这个点。#我们再把这些点作为参数传给函数,如此迭代下去实现跟踪。# 【3】存储找到的点,画出轨迹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 = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)frame = cv2.circle(frame, (a, b), 5, color[i].tolist(), -1)img = cv2.add(frame, mask)cv2.imshow('frame', img)k = cv2.waitKey(30) # & 0xffif k == 27:break# 【4】更新前一帧和前一帧的特征点old_gray = frame_gray.copy()p0 = good_new.reshape(-1, 1, 2)cv2.destroyAllWindows()cap.release()

上面的代码没有对返回角点的正确性进行检查。图像中的一些特征点甚至在丢失以后,光流还会找到一个预期相似的点。所以为了实现稳定的跟踪,我们应该每隔一定间隔就要进行一次角点检测。OpenCV 的官方示例中带有这样一个例子,它是每5 帧进行一个特征点检测。它还对光流点使用反向检测来选取好的点进行跟踪。示例为/samples/python2/lk_track.py。
在这里插入图片描述

3.稠密光流

Lucas-Kanade方法计算稀疏特征集的光流(在我们的示例中,使用Shi-omasi算法检测角点)。OpenCV提供了另一种寻找密集光流的算法。它计算图像中所有点的光流。

代码速记:

  • cv2.calcOpticalFlowFarneback()
  • cv2.cartToPolar()

实战:

def dense(self):cap = cv2.VideoCapture("../images/vtest.avi")ret, frame1 = cap.read()#对整幅图像计算prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)hsv = np.zeros_like(frame1)hsv[..., 1] = 255while True:ret, frame2 = cap.read()next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)# 稠密光流flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)#返回带有光流向量(u,v)的双通道数组。#通过计算我们能得到光流的大小和方向。#我们使用颜色对结果进行编码以便于更好的观察。#方向对应于H(Hue)通道,大小对应于V(Value)通道。mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])hsv[..., 0] = ang * 180 / np.pi / 2hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)#显示帧cv2.imshow('frame2', frame2)cv2.imshow('flow', bgr)k = cv2.waitKey(1) & 0xffif k == 27:breakelif k == ord('s'):cv2.imwrite('opticalfb.png', frame2)cv2.imwrite('opticalhsv.png', bgr)#更新图像prvs = nextcap.release()cv2.destroyAllWindows()

在这里插入图片描述


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
author-avatar
一克拉白勺的眼泪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有