基于单目的光流法测速
目录
1.简介
2.代码实现
1.简介
基于单目的光流法是一种常见的计算机视觉技术,用于估计图像序列中物体的运动速度。它通过分析连续帧之间的像素变化来推断物体在图像中的移动情况。
背景: 光流法是计算机视觉领域中最早的运动估计方法之一,最早由Horn和Schunck在1981年提出。它基于光流假设,即相邻帧上的像素具有相似的灰度值,且相似的像素在移动过程中会产生相同的位移。光流法不仅可以用于物体的运动跟踪和姿态估计,还可以应用于目标检测、行为分析、视频压缩等领域。

意义: 基于单目的光流法进行速度测量在实际应用中具有广泛的意义,以下是其中一些重要的方面:
-
交通监控和智能交通:通过分析交通摄像头拍摄的连续图像序列,可以估计车辆、行人或其他交通参与者的速度。这对于交通管理、拥堵监测、事故预警等都非常重要。
-
运动分析和姿态估计:光流法可以帮助理解物体的运动行为,如运动目标的速度、加速度以及物体的姿态变化。这对于运动分析、动作捕捉和姿态估计等应用非常有价值,比如在体育训练、动画制作和人机交互中广泛应用。
-
视频增强和稳定:利用光流法可以对图像序列进行运动补偿和稳定,减少图像中的抖动或运动模糊。这对于视频增强、图像合成和虚拟现实等应用非常重要。
-
无人驾驶和机器人导航:光流法可以帮助无人驾驶车辆和机器人估计周围环境中物体的运动状态和速度信息,从而更好地规划路径、避障和控制运动。
总之,基于单目的光流法测速在多个领域具有广泛的应用前景,能够提供有关物体运动速度和行为的关键信息,从而为实时控制、决策和分析提供支持。
2.代码实现
光流法是一种基于图像序列的运动估计方法,其中涉及到的主要函数包括:
-
cv2.calcOpticalFlowPyrLK():该函数用于计算稀疏光流。它接受前一帧图像和当前帧图像作为输入,并根据给定的特征点或兴趣区域跟踪这些特征点在两个图像之间的位置变化。函数返回被成功追踪的特征点的新位置以及一个状态值。 -
cv2.calcOpticalFlowFarneback():该函数用于计算稠密光流。它接受前一帧图像和当前帧图像作为输入,并估计整个图像中每个像素点的运动向量。函数返回每个像素点的光流向量值。 -
cv2.goodFeaturesToTrack():该函数用于在图像中检测良好的特征点。它接受输入图像和一些参数,如角点检测方法、特征点数量等,并返回检测到的良好特征点的坐标。 -
cv2.drawOpticalFlow():该函数用于可视化光流结果。它接受一张彩色图像和光流向量作为输入,并在图像上绘制箭头表示运动方向和强度。
这些函数是常见的在OpenCV库中使用的光流算法相关函数,可以帮助实现光流法的运动估计和分析。根据具体的应用场景和需求,您可以选择合适的函数进行使用和调整参数。
像素级测速,真实世界测速需要拿到相机内参
import cv2
import time
import numpy as np
from ours import *# 打开摄像头(也可打开视频文件)cap = cv2.VideoCapture('./10.mp4')# onnx_path = 'yolov5s.onnx'
# model = Yolov5ONNX(onnx_path)# 创建随机颜色向量,用于绘制光流向量
color = np.random.randint(0, 255, (100, 3))# 获取第一帧图像
ret, frame_pre = cap.read()
frame_preGray = cv2.cvtColor(frame_pre, cv2.COLOR_BGR2GRAY)# 设置角点检测参数
feature_params = dict(maxCorners=50, qualityLevel=0.3, minDistance=7, blockSize=7)# 设置光流法参数
lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))# 获取第一帧角点
p0 = cv2.goodFeaturesToTrack(frame_preGray, mask=None, **feature_params)# 创建蒙版
mask = np.zeros_like(frame_pre)while True:# 获取当前帧图像ret, frame = cap.read()img = frame.copy()# or_img, box_coords = model.detect(img)frameGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 使用光流法计算运动向量p1, st, err = cv2.calcOpticalFlowPyrLK(frame_preGray, frameGray, 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 = cv2.line(mask, (int(a), int(b)), (int(c), int(d)), color[i].tolist(), 2)frame = cv2.circle(frame, (int(a), int(b)), 5, color[i].tolist(), -1)# 绘制运动速度直方图magnitude, angle = cv2.cartToPolar(good_new[..., 0] - good_old[..., 0], good_new[..., 1] - good_old[..., 1])hist, bins = np.histogram(magnitude, bins=50)bin_mids = (bins[:-1] + bins[1:]) / 2.speed = bin_mids[np.where(hist == np.max(hist))[0][0]]# 将光流运动轨迹叠加到原始图像上img = cv2.add(frame, mask)# 显示结果图像cv2.imshow('frame', img)if cv2.waitKey(1) & 0xFF == ord('q'):break# 更新下一帧的角点frame_preGray = frameGray.copy()p0 = good_new.reshape(-1, 1, 2)# 输出速度信息print("当前速度为: {:.2f} 像素/帧".format(speed))# 释放摄像头并关闭窗口
cap.release()
cv2.destroyAllWindows()
当前速度为: 0.55 像素/帧
当前速度为: 0.82 像素/帧
当前速度为: 0.34 像素/帧
当前速度为: 0.56 像素/帧
当前速度为: 0.22 像素/帧
当前速度为: 1.03 像素/帧
当前速度为: 1.33 像素/帧

相关文章:
基于单目的光流法测速
目录 1.简介 2.代码实现 1.简介 基于单目的光流法是一种常见的计算机视觉技术,用于估计图像序列中物体的运动速度。它通过分析连续帧之间的像素变化来推断物体在图像中的移动情况。 背景: 光流法是计算机视觉领域中最早的运动估计方法之一,…...
排序-算法
文章目录 一、排序的概念及引用1.1 排序概念1.2 排序运用1.3 常见排序算法 二、常见排序算法的实现2.1 插入排序2.1.1 基本思想2.1.2 直接插入排序2.1.3 希尔排序 2.2 选择排序2.2.1 基本思想2.2.2 直接选择排序2.2.3 堆排序 2.3 交换排序2.3.1 冒泡排序2.3.2 快速排序2.3.3 快…...
【特纳斯电子】基于单片机的火灾监测报警系统-实物设计
视频及资料链接:基于单片机的火灾监测报警系统-实物设计 - 电子校园网 (mcude.com) 编号: T0152203M-SW 设计简介: 本设计是基于单片机的火灾监测报警系统,主要实现以下功能: 1.通过OLED显示温度、烟雾、是否有火…...
网络安全就业形势怎么样?
泻药,以下都是我本人的肺腑之言,是答主深耕职场多年,转战数家公司总结周围朋友的从业经验才总结出来的行业真相,真心希望帮助到还没有步入职场的大家,尤其是24届的应届毕业生,多掌握些就业信息就能少走一些…...
【Golang】Go的并发和并行性解释。谁说Go不是并行语言?
偶然发现百度上有很多"师出同门"的"go是并发语言,而不是并行语言"的说法。让我顿感奇怪,"并行"说白了就是对CPU多核的利用,这年头不能利用多核的编译语言还有的混?而且还混的这么好?并且…...
k8s-16 k8s调度
调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。 kube-scheduler 是 Kubernetes 集群的默认调度器,并且是集群控制面的一部分如果你真的希望或者有这方面…...
【2023研电赛】全国技术竞赛一等奖:基于FPGA的超低时延激光多媒体终端
该作品参与极术社区组织的研电赛作品征集活动,欢迎同学们投稿,获取作品传播推广,并有丰富礼品哦~ 基于FPGA的超低时延激光多媒体终端 参赛单位:华东师范大学 指导老师:刁盛锡 参赛队员:王泽宇 谢祖炜 秦子淇…...
Annoy vs Milvus:哪个向量数据库更适合您的AI应用?知其然知其所以然
1. Annoy vs Milvus简介 Annoy 和 Milvus 都是用于向量索引和相似度搜索的开源库,它们可以高效地处理大规模的向量数据。 Annoy(Approximate Nearest Neighbors Oh Yeah): Annoy 是一种近似最近邻搜索算法,它通过构…...
android 13.0 SystemUI导航栏添加虚拟按键功能(一)
1.概述 在13.0的系统产品开发中,在系统SystemUI的原生系统中默认只有三键导航,想添加其他虚拟按键就需要先在构建导航栏的相关布局中分析结构,然后添加相关的图标xml就可以了,然后添加对应的点击事件,就可以了,接下来先分析第一步关于导航栏的相关布局情况 然后实现功能 …...
内存管理-分页、虚拟地址、虚拟内容、页面置换算法
文章目录 一、5W2H角度分析内存管理What是内存管理Why需要内存管理Who使用内存管理Where内存管理应用When需要内存管理How内存管理工作How much内存管理的成本 二、分页什么是分页分页的原理分页的优缺点分页的应用 三、虚拟地址什么是虚拟地址虚拟地址的作用虚拟地址的转换虚拟…...
【C++入门】命名空间详解(从零开始,冲击蓝桥杯)
C入门 命名空间 南喵小鸡汤程序员可以让步,却不可以退缩,可以羞涩,却不可以软弱,总之,程序员必须是勇敢的。一 . 命名空间的介绍二.命名空间的实际应用1.为什么要有命名空间我们在使用变量时,通常会为他定义一个名字,在…...
通过代码MyBatis-plus实现对表中createTime和updateTime进行自动更新
通过代码MyBatis-plus实现对表中createTime和updateTime进行自动更新 实现这样的效果可以在数据库中设置,但是我们一般建议在代码里实现, 但是总不能每次insert和update的时候都手写new当前时间 因此推荐使用mybatis-plus 1导入依赖 <dependency&g…...
HTML 实时显示本地电脑时间(精确到毫秒)
<!DOCTYPE html> <html> <head><title>实时显示本地电脑时间(精确到毫秒)</title> </head> <body><h1>本地电脑时间(精确到毫秒):</h1><h1 id"clock&q…...
opencv跨平台arm交叉编译之ubuntu
目录 1. 安装交叉编译工具链2. 安装依赖3. 配置工具链3.1 新建build目录3.2 安装cmake-gui3.3 工具链配置界面进行配置3.3.1 终端输入以下命令3.3.2 点击Configure,弹出编译方式选择对话框:3.3.3 点击Next3.3.4 点击Finish3.3.5 点击Configure。3.3.6 Ge…...
Git命令全集
1、克隆代码 查看项目地址 git remote -v直接克隆 git clone url克隆指定分支 git clone -b 分支 git地址RPC failed错误:修改Git的传输字节限制 git config --global http.postBuffer 10485760002、查看分支 查看 git branch -a切换分支 git branch 分支名从指定分支…...
[BigData:Hadoop]:安装部署篇
文章目录 一:机器103设置密钥对免密登录二:机器102设置密钥对免密登录三:机器103安装Hadoop安装包3.1:wget拉取安装Hadoop包3.2:解压移到指定目录3.2.1:解压移动路径异常信息3.2.2:切换指定目录…...
ubuntu 上vscode使用cmake编译运行c++程序
参考:ubuntu 上vscode使用cmake编译运行c程序_vscode ubuntu运行c程序_SCH0的博客-CSDN博客 文章是对官方过程的翻译: Get started with CMake Tools on Linux...
Node.js 新特性 SEA/单文件可执行应用尝鲜
#1 关于 SEA 单文件可执行应用(SEA,Singe Executable Applications),是 Node.js 新版本的特性,最初在 v19.7.0、v18.16.0 加入,并在 v20.x 得到扩展。而上个月发布的全家桶 Bun.js,就自带了 SEA…...
137.只出现一次的数字II
137. 只出现一次的数字 II - 力扣(LeetCode) 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来…...
k8s-15 strogeclass
官网: https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner StorageClass提供了一种描述存储类 (class)的方法,不同的cass可能会映射到不同的服务质量等级和备份策略或其他策略等 每个 StorageClass 都包含 provisioner、parameters 和…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
