光流运动估计教程

news2024/11/26 8:41:34

文章目录

  • 概要
  • 什么是光流?
  • 稀疏光流与密集光流
  • 实现稀疏光流
    • 1. 设置环境
    • 2.配置OpenCV读取视频并设置参数
    • 3. Grayscaling 3. 灰度化
    • 4. Shi-Tomasi 角点检测器 – 选择要跟踪的像素
    • 5. Lucas-Kanade:稀疏光流
    • 6. 可视化
  • 实现密集光流
    • 1. 设置环境
    • 2. 配置 OpenCV 读取视频
    • 3. 灰度
    • 4. Farneback光流
    • 5.可视化
  • 使用深度学习的光流
    • 光流应用:语义分割
    • 光流应用:[物体检测和跟踪](https://openaccess.thecvf.com/content_cvpr_2018_workshops/papers/w3/Hua_Vehicle_Tracking_and_CVPR_2018_paper.pdf)
  • 结论
  • 参考

概要

计算机视觉研究的进步通过利用诸如用于识别属于特定类别的对象的对象检测和用于像素级分类的语义分割等技术,彻底改变了机器感知环境的方式。然而,当涉及实时视频处理时,这些技术的大多数实现仅考虑同一帧(x,y)内对象的空间关系,而忽略时间方面(t)。这意味着每个帧都是独立评估的,与之前或未来的帧没有任何关联。但是,如果我们需要连续帧之间的关系怎么办?例如,如果我们想要跟踪车辆跨帧的运动以估计其当前速度并预测其在下一帧中的位置该怎么办?请添加图片描述
交通的稀疏光流(每个箭头都指向相应像素的预测流的方向)。

或者,如果我们需要连续帧之间的人体姿势关系信息来识别射箭、棒球和篮球等人类动作,该怎么办?

在这里插入图片描述
各种行动分类
在这里插入图片描述
使用光流对动作进行分类

在本教程中,我们将了解光流是什么,如何实现它的两个主要变体(稀疏和密集),并全面了解涉及深度学习的最新方法和有前途的未来方向。

什么是光流?

让我们从对光流的高层次理解开始。光流是对象在序列的连续帧之间的运动,由对象和相机之间的相对运动引起。光流问题可以表示为:
在这里插入图片描述
光流问题

在连续帧之间,我们可以将图像强度 (I) 表示为空间 (x,y) 和时间 (t) 的函数。换句话说,如果我们获取第一张图像 I(x,y,t) 并在 t 时间内将其像素移动 (dx,dy),我们将获得新图像 I(x+dx,y+dy,t+dt) )。

首先,我们假设物体的像素强度在连续帧之间是恒定的。

在这里插入图片描述

光流的恒定强度假设

其次,我们采用RHS的泰勒级数近似,并去除常用项。

泰勒级数:像素强度的近似值

第三,我们除以dt来推导出光流方程:

在这里插入图片描述
光流方程,其中 u=dx/dt 和 v=dy/dt

dI/dx、dI/dy 和 dI/dt 是沿横轴、纵轴和时间的图像梯度。因此,我们总结了光流问题,即求解 u(dx/dt) 和 v(dy/dt) 以确定随时间的运动。您可能会注意到,我们无法直接求解 u 和 v 的光流方程,因为两个未知变量只有一个方程。我们将实施一些方法,例如 Lucas-Kanade 方法来解决这个问题。

稀疏光流与密集光流

稀疏光流给出了帧内一些“有趣的特征”(例如描绘物体边缘或角落的几个像素)的流动向量,而密集光流,它给出了整个帧(所有像素)的流动向量——每个像素最多一个流动向量。正如您已经猜到的那样,密集光流具有更高的精度,但代价是速度慢/计算成本高。

在这里插入图片描述
左:稀疏光流 – 跟踪几个“特征”像素;右图:密集光流 – 估计图像中所有像素的流量。

实现稀疏光流

稀疏光流选择一组稀疏的像素特征(例如,有趣的特征,如边缘和角落)来跟踪其速度矢量(运动)。提取的特征在光流函数中从一帧传递到另一帧,以确保跟踪相同的点。稀疏光流有多种实现方式,包括 Lucas-Kanade 方法、Horn-Schunck 方法、Buxton-Buxton 方法等。我们将使用 Lucas-Kanade 方法与 OpenCV(一个开源的计算机视觉算法库)进行实现。

1. 设置环境

如果您尚未安装 OpenCV,请打开终端并运行:

pip install opencv-python

现在,克隆教程软件仓库:

git clone https://github.com/chuanenlin/optical-flow.git

接下来,使用文本编辑器打开 sparse-starter.py。我们将在这个 Python 文件中编写所有代码。

2.配置OpenCV读取视频并设置参数


import cv2 as cv
import numpy as np
 
# Parameters for Shi-Tomasi corner detection
feature_params = dict(maxCorners = 300, qualityLevel = 0.2, minDistance = 2, blockSize = 7)
# Parameters for Lucas-Kanade optical flow
lk_params = dict(winSize = (15,15), maxLevel = 2, criteria = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03))
# The video feed is read in as a VideoCapture object
cap = cv.VideoCapture("shibuya.mp4")
# Variable for color to draw optical flow track
color = (0, 255, 0)
# ret = a boolean return value from getting the frame, first_frame = the first frame in the entire video sequence
ret, first_frame = cap.read()
 
while(cap.isOpened()):
    # ret = a boolean return value from getting the frame, frame = the current frame being projected in the video
    ret, frame = cap.read()
    # Frames are read by intervals of 10 milliseconds. The programs breaks out of the while loop when the user presses the 'q' key
    if cv.waitKey(10) & 0xFF == ord('q'):
        break
# The following frees up resources and closes all windows
cap.release()
cv.destroyAllWindows()

3. Grayscaling 3. 灰度化

import cv2 as cv
import numpy as np
 
# Parameters for Shi-Tomasi corner detection
# feature_params = dict(maxCorners = 300, qualityLevel = 0.2, minDistance = 2, blockSize = 7)
# Parameters for Lucas-Kanade optical flow
# lk_params = dict(winSize = (15,15), maxLevel = 2, criteria = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03))
# The video feed is read in as a VideoCapture object
# cap = cv.VideoCapture("shibuya.mp4")
# Variable for color to draw optical flow track
# color = (0, 255, 0)
# ret = a boolean return value from getting the frame, first_frame = the first frame in the entire video sequence
# ret, first_frame = cap.read()
# Converts frame to grayscale because we only need the luminance channel for detecting edges - less computationally expensive

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2045310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从力扣中等+困难题+表白HTML测试 -- 文心快码(Baidu Comate)

0 写在前面 官网地址:Baidu Comate Step1 打开文心快码(Baidu Comate)官网,点击「免费使用」/「下载安装」 Step2 可以根据官网步骤快速唤起VS Code; 也可以直接在VS Code、Visual Studio扩展管理搜索“文心快码”/…

Xshell 连接服务器

Xshell 连接服务器 安装 Xshell7 天免费试用永久免费试用 连接服务器 安装 Xshell 双击运行安装程序 点击 下一步 同意用户协议, 点击下一步 选择安装位置, 点击下一步 设置程序文件夹名, 点击安装 等待软件安装完毕 ## 软件激活 7 天免费试…

怎样在线免费音频转文字?放心交给这4款音频转文字能手

从会议记录到个人笔记,从播客到讲座录音,大家是否有考虑过如何将这些宝贵的音频信息快速转化为文字,以便更好地保存、分享和分析呢?其实我这倒是有一个不错的解决方案,那便是利用音频转文字软件免费来进行转换~ 想知道…

安全课堂开课了,不容小觑的暗水印来啦!数据防泄密管理新趋势——添加暗水印!

数据泄露的风险日益加剧,为了有效保护企业的敏感信息,防止数据被非法复制、传播或泄露,一种名为“暗水印”的技术逐渐走进了企业的视野,并成为了数据防泄密管理的新趋势。 今天,我们就来深入探讨一下这一不容忽视的技…

BurpSuite

如果只能用一个Web渗透工具,我选BurpSuite。 Web应用程序(Web Application) 不同于传统的静态网站所有程序的特点是接收、处理用户输入并返回结果服务器端是个程序,需要程序代码实现业务功能(java、php、asp.nse&…

智慧社区新视界:EasyCVR视频汇聚平台下的数字化治理实践

在当今科技飞速发展的时代,“数字城市智慧社区”这个概念正逐渐走进我们的生活。那么,数字城市智慧社区到底是什么样子的呢? 随着城市化的不断推进,数字城市建设已成为提升城市管理效率、改善居民生活质量的重要手段。智慧社区作…

简单回归模型建立(下)

目录 数据准备 特征选择 目标变量 模型选择 示例代码 ​编辑分析结果 上部分对数据进行了分析以及可视化 选择不同的目标变量,例如“Cost of Living Index”作为我们要预测的目标。然后,我们可以使用其他相关的指标作为特征来训练模型。例如&…

邮件系统安全管家:CACTER SMC2的全面升级

根据Coremail邮件安全人工智能实验室监测,2024年Q2全国企业级用户遭受超过21.4亿次暴力破解,相比于Q1的39.1亿次暴力破解,环比降幅约为45%,无差别的暴力破解攻击大幅下降,但数据显示暴力破解攻击成功次数正在回升。 20…

搭配Intel第13代酷睿处理器

高性能内存硬盘这么买 intel第13代酷睿已经于2022年10月底正式上市。相比于第12代酷睿性能大涨,内置20条PCle通道(16条PCle 5.0和4条PCle 4.0)、可最多支持128GB DDR5 5600/DDR4 3200双通道内存,搭配Z790系列主板组建高端性能平台,满足未来设计、游戏、专业应用等需求。如…

Web前端开发【新手入门指南】

Web前端开发入行门槛低、薪资高,是互联网行业的紧俏岗位之一。 目前Web前端开发人员年薪基本都在10万以上,一线城市的薪资会更高,这也吸引了很多人进入Web前端行业。对于完全不了解行业的人来说,他们对Web前端知之甚少。下面小菌…

怎么去掉U盘的写保护

要去除U盘的写保护,可以尝试以下几种方法: 检查U盘的物理写保护开关:部分U盘具有物理写保护开关,如果开关被切换到写保护状态,U盘就会被写保护。找到并关闭这个开关即可使用DiskPart命令:通过命令提示符工…

【C++11】右值引用的深度解析(什么是右值引用?它有什么作用?能应用在那些场景?)

目录 一、前言 二 、什么是左值什么是右值? 🔥左值🔥 🔥右值 🔥 三、什么是右值引用? 💧左右引用的“引出”💧 💧左值引用 💧 💧右值引用…

C# 不一样的洗牌算法---Simd指令

洗牌算法&#xff0c;以随机打乱数组中元素的位置 测试数据创建 int[] _data; Random rng new Random(); protected override void CreateData() {_data new int[_size];for (int i 0; i < _data.Length; i){_data[i] i;} } 普通打乱数组元素位置 protected overrid…

VBA学习(27):在筛选数据中复制可见单元格

在筛选数据中复制数据时&#xff0c;可以按原结构粘贴所复制的数据。具体如下文&#xff1a; 下图所示为示例数据。 我们对列C进行筛选&#xff0c;如下图所示 复制单元格区域B2:B10&#xff0c;然后粘贴到以单元格E2开始的区域&#xff0c;结果如下图所示。正如所见&#xff…

LLM之RLHF:Karpathy视角来对比RLHF技术和RL技术—RLHF is just barely RL(RLHF只是勉强算作强化学习)

LLM之RLHF&#xff1a;Karpathy视角来对比RLHF技术和RL技术—RLHF is just barely RL(RLHF只是勉强算作强化学习) 导读&#xff1a;2024年8月8日&#xff0c;Karpathy发表了一个有意思的观点&#xff0c;RLHF is just barely RL. 强化学习从人类反馈(RLHF)训练方法只是勉强属于…

怎么将音乐转为mp3格式?7种简单的手机音频转换方法!

怎么将音乐转为mp3格式&#xff1f; mp3是一种运用比较广泛的格式&#xff0c;几乎所有的音频设备、播放器和操作系统都可以播放MP3音乐。如果你的音频文件不是mp3格式&#xff0c;那么可以通过专业的mp3格式转换器进行转换。这样就不会出现格式不兼容&#xff0c;无法正常使用…

第四范式发布AI+5G视频营销产品 助力精准获客与高效转化

产品上新 Product Release 今天&#xff0c;第四范式AI5G视频电话互动营销产品全新发布。 相较于以往销效率低、互动差、转化差的传统电话外呼和短信营销方式&#xff0c;视频电话互动营销基于AI、5G等技术&#xff0c;可让用户接听电话时观看个性化视频广告并实时互动&#xf…

Fortify三种扫描模式有什么区别?分别怎么用?

一、通过“Audit Workbench”进行测试 “Audit Workbench”支持Java语言源代码的测试。 二、通过“Scan Wizard”进行测试 “Scan Wizard”支持Java、Python、C/C、.Net、Go、PHP、Flex、Action Script、HTML、XML、JavaScript、TypeScript、Kotlin、SQL、ABAP、ColdFusion语言…

基于asp.net的简单的BBS论坛管理系统源码

今天给大家分享一套c#的webform框架的简单的BBS论坛管理系统源码&#xff0c;老规矩&#xff0c;下载链接我放在了最后面了&#xff0c;需要的自行下载&#xff0c;喜欢的小伙伴记得点个赞哦&#xff01; 1.主要功能 这个系统是比较简单的BBS的论坛管理系统源码&#xff0c;包…

C++ //练习 17.2 定义一个tuple,保存一个string、一个vector<string>和一个pair<string, int>。

C Primer&#xff08;第5版&#xff09; 练习 17.2 练习 17.2 定义一个tuple&#xff0c;保存一个string、一个vector和一个pair<string, int>。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /**********************…