基于单目的光流法测速

news2024/11/19 16:23:11

目录

 1.简介

2.代码实现


 1.简介

基于单目的光流法是一种常见的计算机视觉技术,用于估计图像序列中物体的运动速度。它通过分析连续帧之间的像素变化来推断物体在图像中的移动情况。

背景: 光流法是计算机视觉领域中最早的运动估计方法之一,最早由Horn和Schunck在1981年提出。它基于光流假设,即相邻帧上的像素具有相似的灰度值,且相似的像素在移动过程中会产生相同的位移。光流法不仅可以用于物体的运动跟踪和姿态估计,还可以应用于目标检测、行为分析、视频压缩等领域。

意义: 基于单目的光流法进行速度测量在实际应用中具有广泛的意义,以下是其中一些重要的方面:

  1. 交通监控和智能交通:通过分析交通摄像头拍摄的连续图像序列,可以估计车辆、行人或其他交通参与者的速度。这对于交通管理、拥堵监测、事故预警等都非常重要。

  2. 运动分析和姿态估计:光流法可以帮助理解物体的运动行为,如运动目标的速度、加速度以及物体的姿态变化。这对于运动分析、动作捕捉和姿态估计等应用非常有价值,比如在体育训练、动画制作和人机交互中广泛应用。

  3. 视频增强和稳定:利用光流法可以对图像序列进行运动补偿和稳定,减少图像中的抖动或运动模糊。这对于视频增强、图像合成和虚拟现实等应用非常重要。

  4. 无人驾驶和机器人导航:光流法可以帮助无人驾驶车辆和机器人估计周围环境中物体的运动状态和速度信息,从而更好地规划路径、避障和控制运动。

总之,基于单目的光流法测速在多个领域具有广泛的应用前景,能够提供有关物体运动速度和行为的关键信息,从而为实时控制、决策和分析提供支持。

 

2.代码实现

光流法是一种基于图像序列的运动估计方法,其中涉及到的主要函数包括:

  1. cv2.calcOpticalFlowPyrLK():该函数用于计算稀疏光流。它接受前一帧图像和当前帧图像作为输入,并根据给定的特征点或兴趣区域跟踪这些特征点在两个图像之间的位置变化。函数返回被成功追踪的特征点的新位置以及一个状态值。

  2. cv2.calcOpticalFlowFarneback():该函数用于计算稠密光流。它接受前一帧图像和当前帧图像作为输入,并估计整个图像中每个像素点的运动向量。函数返回每个像素点的光流向量值。

  3. cv2.goodFeaturesToTrack():该函数用于在图像中检测良好的特征点。它接受输入图像和一些参数,如角点检测方法、特征点数量等,并返回检测到的良好特征点的坐标。

  4. 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 像素/帧


 

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

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

相关文章

BUUCTF 金三 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 只有一个附件,下载下来有一张GIF图片。 解题思路: 本题一共有2种解法(本人找到的) 方法一: 1、打开这张GIF图片,观察到不正常闪动,似…

《YOLO医学影像检测》专栏介绍 CSDN独家改进实战

💡💡💡YOLO医学影像检测:http://t.csdnimg.cn/N4zBP ✨✨✨实战医学影像检测项目,通过创新点验证涨点可行性; ✨✨✨入门医学影像检测到创新,不断打怪进阶; 1.血细胞检测介绍 数据…

数据结构 - 2(顺序表10000字详解)

一:List 1.1 什么是List 在集合框架中,List是一个接口,继承自Collection。 Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示: Iterable也是一个接口,Iterabl…

security+JWT

securityJWT 添加依赖准备工作sqlUserInfoUserMapperUserService、UserServiceImpl 创建JwtUtils工具类,做token的生成和校验进入Security创建AccountDetailsServiceImpl,并且实现UserDetailsService编写登录操作 创建拦截器JWTAuthenticationFilter继承…

mac电影特效合成软件nuke15 完美激活版下载

Nuke 15是一款由英国The Foundry公司开发的专业的合成软件,被广泛用于电影、电视和广告制作中的后期合成和特效制作。 Mac软件下载:nuke15 完美激活版下载 Win软件下载:NUKE 13 中文激活版 Nuke 15拥有强大的功能和灵活性,可以帮助…

TartanVO: A Generalizable Learning-based VO 服务器复现(rtx3090 py3)

源码地址 代码地址:https://github.com/castacks/tartanvo/tree/python3 配环境 git clone https://github.com/castacks/tartanvo.git -b python3创建conda环境: conda create -n tartanvo python3.8安装pytorch conda install pytorch1.10.1 torc…

路由router

什么是路由? 一个路由就是一组映射关系(key - value)key 为路径,value 可能是 function 或 component 2、安装\引入\基础使用 只有vue-router3,才能应用于vue2;vue-router4可以应用于vue3中 这里我们安装vue-router3…

elementUI el-table+树形结构子节点选中后没有打勾?(element版本问题 已解决)

问题 1.不勾选父级CB111,直接去勾选子级(ST2001…),子级选中后没有打勾显示 排查 一直以为是这个树形结构和表格不兼容产生的问题,到后来看官方demo都是可以勾选的,最后排查到了版本问题, 项…

电动滑板车UL2272认证测试项目和标准

平衡车ul2272认证标准于2016年2月正式公布,美国消费品安全协会(cpsc)宣布,所有平衡车(包括扭扭车)的制造商、进口商、经销商,其在美国本土生产、进口、销售的平衡车必须符合新的安全标准,包括ul2272平衡车电路系统认证标准。另外&…

flutter开发入门,windows环境安装,耗时一天解决各种bug,终于成功

首先说明要安装的环境:java8必须,android studio,chrome是开发安卓和web是必须的 java8的下载地址:https://www.java.com/en/download/、 java8蓝奏云下载地址:jre-8u381-windows-x64.exe - 蓝奏云 flutter国内环境…

lvgl 界面管理器

lv_scr_mgr lvgl 界面管理器 适配 lvgl 8.3 降低界面之间的耦合使用较小的内存,界面切换后会自动释放内存内存泄漏检测 使用方法 在lv_scr_mgr_port.h 中创建一个枚举,用于界面ID为每个界面创建一个页面管理器句柄将界面句柄添加到 lv_scr_mgr_por…

C++11新特性(lambda,可变参数模板,包装器,bind)

lambda表达式是什么?包装器又是什么?有什么作用?莫急,此篇文章将详细带你探讨它们的作用。很多同学在学习时害怕这些东西,其实都是方便使用的工具,很多情况下我们学这些新的东西觉得麻烦,累赘&a…

自学嵌入式多久才可以达到找工作的水平

自学嵌入式多久才可以达到找工作的水平 时间以及达到嵌入式工作水平所需的具体努力因人而异。但一般而言,自学嵌入式系统开发需要时间和毅力。以下是一些关键因素,影响着您能够在多久内达到找工作的水平:最近很多小伙伴找我,说想要…

YOLOv4 论文总结

贡献: 1.有效且强大的模型,常规GPU(1080ti or 2080ti)可得到实时、高质量的检测结果。 2.在训练中,验证 Bag-of-Freebies 和 Bag-of-Specials 方法 3.提出了两种数据增强手段,马赛克和自对抗训练&#x…

LeetCode【74】搜索二维矩阵

题目&#xff1a; 代码&#xff1a; public static boolean searchMatrix(int[][] matrix, int target) {int rows matrix.length;int columns matrix[0].length;// 先找到行&#xff0c;行为当前行第一列<target&#xff0c;当前行1行&#xff0c;第一列>targetfor…

详细教程:Postman 怎么调试 WebSocket

WebSocket 是一个支持双向通信的网络协议&#xff0c;它在实时性和效率方面具有很大的优势。Postman 是一个流行的 API 开发工具&#xff0c;它提供了许多功能来测试和调试 RESTful API 接口&#xff0c;最新的版本也支持 WebSocket 接口的调试。想要学习更多关于 Postman 的知…

Linux友人帐之环境变量

一、环境变量 1.1 环境变量的概念 1. 什么是环境变量&#xff1f; 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。 2. 为什么会有环境变量&#xff1f; 在Linux系统中&#xff0c;我们发现我们在执行一些指令时&#xff0c;比如…

10个打工人必备AI神器,升职加薪靠AI

HI&#xff0c;同学们&#xff0c;我是赤辰&#xff0c;本期是第18篇AI工具类教程&#xff0c;文章底部准备了粉丝福利&#xff0c;看完后可领取&#xff01;1. Runway&#xff08;文字转视频AI工具&#xff09; 只需要一句提示词就能精确生成你所想象的视频场景&#xff0c;还…

natapp内网穿透-将本地运行的程序/服务器通过公网IP供其它人访问

文章目录 1.几个基本概念1.1 局域网1.2 内网1.3 内网穿透1.4 Natapp 2.搭建内网穿透环境3.本地服务测试 1.几个基本概念 1.1 局域网 LAN&#xff08;Local Area Network&#xff0c;局域网&#xff09;是一个可连接住宅&#xff0c;学校&#xff0c;实验室&#xff0c;大学校…

百乐钢笔维修(官方售后,全流程)

文章目录 1 背景2 方法3 结果 1 背景 在给钢笔上墨的途中&#xff0c;不小心总成掉地上了&#xff0c;把笔尖摔弯了&#xff08;虽然还可以写字&#xff0c;但是非常的挂纸&#xff09;&#xff0c;笔身没有什么问题&#xff0c;就想着维修一下笔尖或者替换一下总成。 一般维…