YOLO11解决方案之距离计算探索

概述

Ultralytics提供了一系列的解决方案,利用YOLO11解决现实世界的问题,包括物体计数、模糊处理、热力图、安防系统、速度估计、物体追踪等多个方面的应用。

测量两个物体之间的间距被称为特定空间内的距离计算,YOLO11使用两个边界框的中心点计算距离。

使用距离计算,可以提供计算机视觉任务中比较精确的空间定位,分析视频环境中的对象关系,通过监控移动物体之间的距离,使系统能够检测到潜在的碰撞,为自动驾驶或者交通监控等应用提供更好的空间场景理解能力。

演示代码

Ultralytics提供了演示代码,展示如何使用距离计算解决方案。

import cv2from ultralytics import solutionscap = cv2.VideoCapture("path/to/video.mp4")
assert cap.isOpened(), "Error reading video file"# Video writer
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
video_writer = cv2.VideoWriter("distance_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))# Initialize distance calculation object
distancecalculator = solutions.DistanceCalculation(model="yolo11n.pt",  # path to the YOLO11 model file.show=True,  # display the output
)# Process video
while cap.isOpened():success, im0 = cap.read()if not success:print("Video frame is empty or processing is complete.")breakresults = distancecalculator(im0)print(results)  # access the outputvideo_writer.write(results.plot_im)  # write the processed frame.cap.release()
video_writer.release()
cv2.destroyAllWindows()  # destroy all opened windows

DistanceCalculation参数

基本参数

参数类型默认值说明
modelstrNoneUltralytics YOLO 模型文件的路径。

DistanceCalculation支持使用track参数:

参数类型默认值说明
trackerstr'botsort.yaml'指定要使用的跟踪算法, bytetrack.yamlbotsort.yaml.
conffloat0.3设置检测的置信度阈值;数值越低,跟踪的物体越多,但可能会出现误报。
ioufloat0.5设置交叉重叠 (IoU) 阈值,用于过滤重叠检测。
classeslistNone按类别索引筛选结果。例如 classes=[0, 2, 3] 只跟踪指定的类别(class在COCO数据集定义)。
verboseboolTrue控制跟踪结果的显示,提供被跟踪物体的可视化输出。
devicestrNone指定用于推理的设备(例如: cpu, cuda:00). 允许用户选择CPU 、特定GPU 或其他计算设备运行模型。

可视化参数:

参数类型默认值说明
showboolFalse如果 True在一个窗口中显示注释的图像或视频。有助于在开发或测试过程中提供即时视觉反馈。
line_widthNone or intNone指定边界框的线宽。如果 None则根据图像大小自动调整线宽,使图像更加清晰。
show_confboolTrue在标签旁显示每次检测的置信度得分。让人了解模型对每次检测的确定性。
show_labelsboolTrue在可视输出中显示每次检测的标签。让用户立即了解检测到的物体。

工作原理

DistanceCalculation 类的工作原理是跟踪视频帧中的物体,并计算所选边界框中心点之间的欧氏距离。演示程序运行时,鼠标点击断定两个边界框,系统将提取选定边界框的中心点,以像素为单位计算这些中心点之间的欧氏距离,对象之间用连线连接,并在图像上显示距离。

执行时使用 mouse_event_for_distance 方法来处理鼠标交互,允许用户根据需要选择对象和清除选择。 process 方法处理逐帧处理、跟踪物体和计算距离。

查看DistanceCalculation 类中的mouse_event_for_distance的代码:

def mouse_event_for_distance(self, event, x, y, flags, param):"""处理鼠标事件,在实时视频流中选择区域计算距离使用左键选择两个方框点击右键取消选择"""if event == cv2.EVENT_LBUTTONDOWN:self.left_mouse_count += 1if self.left_mouse_count <= 2:for box, track_id in zip(self.boxes, self.track_ids):if box[0] < x < box[2] and box[1] < y < box[3] and track_id not in self.selected_boxes:self.selected_boxes[track_id] = boxelif event == cv2.EVENT_RBUTTONDOWN:self.selected_boxes = {}self.left_mouse_count = 0

查看DistanceCalculation 类中的process的代码:

def process(self, im0):"""处理一个视频帧,计算两个选择的边界框之间的距离输出处理过的视频图片(叠加了距离数据)、跟踪物体的数量、像素距离"""self.extract_tracks(im0)  # Extract tracksannotator = SolutionAnnotator(im0, line_width=self.line_width)  # Initialize annotatorpixels_distance = 0# Iterate over bounding boxes, track ids and classes indexfor box, track_id, cls, conf in zip(self.boxes, self.track_ids, self.clss, self.confs):annotator.box_label(box, color=colors(int(cls), True), label=self.adjust_box_label(cls, conf, track_id))# 如果选定的框是被跟踪的,则更新if len(self.selected_boxes) == 2:for trk_id in self.selected_boxes.keys():if trk_id == track_id:self.selected_boxes[track_id] = boxif len(self.selected_boxes) == 2:#计算选择框的中心点坐标self.centroids.extend([[int((box[0] + box[2]) // 2), int((box[1] + box[3]) // 2)] for box in self.selected_boxes.values()])#计算两点间的欧氏距离pixels_distance = math.sqrt((self.centroids[0][0] - self.centroids[1][0]) ** 2 + (self.centroids[0][1] - self.centroids[1][1]) ** 2)annotator.plot_distance_and_line(pixels_distance, self.centroids)self.centroids = []  # Reset centroids for next frameplot_im = annotator.result()self.display_output(plot_im)  # Display output with base class functioncv2.setMouseCallback("Ultralytics Solutions", self.mouse_event_for_distance)# 返回处理过的图像和计算的指标return SolutionResults(plot_im=plot_im, pixels_distance=pixels_distance, total_tracks=len(self.track_ids))

效果展示

这里使用演示代码,在测试视频中,计算两辆车的距离。

在这里插入图片描述

随着车辆运动,其距离在不断变化。

在这里插入图片描述

需要注意的是,本方案的距离计算并不精确,它只是使用了平面数据,缺少物体间的深度信息(不能计算三维位置关系)。

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

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

相关文章

mongodb处理时区转换问题

1. 程序查询直接使用&#xff08;java&#xff09;Date即可, 因为直接支持 2. 若方便查看日期需要进行格式和时区转换 db.task.aggregate([{ $match: {userId: 113633}},{ $project: {userId: 1,endTime: 1,formattedDate: {$dateToString: {format: "%Y-%m-%d %H:%M:%S&…

基于中心点预测的视觉评估与可视化流程

基于中心点预测的视觉评估与可视化流程 基于中心点预测的视觉评估与可视化流程一、脚本功能概览二、可视化与评分机制详解1. 真实框解析2. 调用模型处理帧3. 预测中心点与真实值的对比4. 打分策略5. 图像可视化三、目录结构要求四、运行方式五、应用场景与拓展思路六、总结七,…

Comparator 比较器

在Java中&#xff0c;Comparator.comparingInt(String::length) 是一个用于创建比较器&#xff08;Comparator&#xff09;的静态方法调用&#xff0c;它的核心作用是定义一个比较规则&#xff0c;使对象按照特定属性&#xff08;这里是字符串长度&#xff09;进行比较。下面从…

无人设备遥控器之无线通讯技术篇

无人设备遥控器的无线通讯技术是确保遥控操作准确、稳定、高效进行的关键。以下是对无人设备遥控器无线通讯技术的详细解析&#xff1a; 一、主要无线通讯技术类型 Wi-Fi通讯技术 原理&#xff1a;基于IEEE 802.11标准&#xff0c;通过无线接入点&#xff08;AP&#xff09;…

Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)

Android Coli 3 ImageView load two suit Bitmap thumb and formal&#xff0c;Kotlin&#xff08;七&#xff09; 在 Android Coli 3 ImageView load two suit Bitmap thumb and formal&#xff0c;Kotlin&#xff08;六&#xff09;-CSDN博客 的基础上改进&#xff0c;主要是…

ET EntityRef EntityWeakRef 类分析

EntityRef EntityWeakRef 相同点 也是这两个的作用&#xff1a;这两个都是用来表示一个实体引用。一般来说使用一个对象&#xff0c;直接持有对象就可以&#xff0c;但是如果对象来自于对象池&#xff0c;这个时候直接持有对象不合适&#xff0c;对象可能已经被对象池回收&…

基于Leaflet和天地图的免费运动场所WebGIS可视化-以长沙市为例

目录 前言 一、免费运动场所数据整理 1、本地宝数据简介 2、Java后台数据解析 二、Leaflet前端地图展示 1、基础数据准备 2、具体位置及属性标记 三、成果展示 1、空间位置分布 2、东风路立交桥运动公园 3、芙蓉区花侯路浏阳河大桥下方 4、梅岭国际小区 5、湖南大学…

Flutter——数据库Drift开发详细教程(六)

目录 1.视图2.视图中列的可空性3.DAO4.流查询5.高级用途6.注意事项 1.视图 也可以将SQL 视图定义 为 Dart 类。为此&#xff0c;请编写一个抽象类来扩展View。此示例声明了一个视图&#xff0c;用于读取示例中架构中某个类别中添加的待办事项数量&#xff1a; abstract class C…

Kafka 4.0版本的推出:数据处理新纪元的破晓之光

之前做大数据相关项目&#xff0c;在项目中都使用过kafka。在数字化时代&#xff0c;数据如洪流般涌来&#xff0c;如何高效处理这些数据成为关键。Kafka 就像是一条 “智能数据管道”&#xff0c;在数据的世界里扮演着至关重要的角色。如果你第一次接触它&#xff0c;不妨把它…

RabbitMQ高级篇-MQ的可靠性

目录 MQ的可靠性 1.如何设置数据持久化 1.1.交换机持久化 1.2.队列持久化 1.3.消息持久化 2.消息持久化 队列持久化&#xff1a; 消息持久化&#xff1a; 3.非消息持久化 非持久化队列&#xff1a; 非持久化消息&#xff1a; 4.消息的存储机制 4.1持久化消息&…

ctfshow权限维持

1&#xff0c;web670 我们先看一下这个php代码 error_reporting(0);#关闭错误报告 highlight_file(__FILE__);#内容高亮显示$a$_GET[action];#get传参switch($a){case cmd:eval($_POST[cmd]);break;case check:file_get_contents("http://checker/api/check");#获取…

力扣算法ing(71 / 100)

5.15 哈希表合集—349.两个数组的交集 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例…

(面试)Handler消息处理机制原理

Handler是用于实现线程间通信和任务调度的一种机&#xff08;Handler、 Looper、MessageQueue、 Message&#xff09;。Handler 允许线程间发送Message或Runnable对象进行通信。在Android中UI修改只能通过UI Thread&#xff0c;子线程不能更新UI。如果子线程想更新UI&#xff0…

Dify 实战教程 | 5分钟打造文本生成应用( Stable Diffusion 提示词生成器)

AI 绘画离不开「提示词&#xff08;Prompt&#xff09;」——如何构造清晰、生动、有表现力的提示词&#xff0c;直接决定你生成图像的质量。而 Stable Diffusion 的提示词构造相比 Midjourney 更加自由&#xff0c;但也更考验组织语言的能力。 今天这篇教程&#xff0c;教你零…

RPC框架源码分析学习(二)

RPC框架源码分析与原理解读 前言 在分布式系统开发中&#xff0c;远程过程调用(RPC)是一项基础且关键的技术。通过对KVstorageBaseRaft-cpp项目RPC模块的源码分析&#xff0c;我深入理解了RPC框架的工作原理和实现细节。本文将从程序员视角分享我的学习心得。 框架概述 本项…

当下流行的智能体通信协议:MCP、A2A、ANP 分别是什么?

在当前人工智能&#xff08;AI&#xff09;智能体生态系统中&#xff0c;智能体之间的有效沟通至关重要。为了让AI智能体能够高效、安全地协同工作&#xff0c;业界提出了多种通信协议。其中&#xff0c;MCP、A2A 和 ANP 代表了三个关键层级的通信协议&#xff0c;各自应对不同…

为什么 cout<<“中文你好“ 能正常输出中文

一, 简答: 受python3字符串模型影响得出的下文C字符串模型结论 是错的&#xff01;C的字符串和python2的字符串模型类似&#xff0c;也就是普通的字符串是ASCII字符串和字节串两种语义&#xff0c;类似重载或多态&#xff0c;有时候解释为整数&#xff0c;有时候是字节串。Uni…

鸿蒙的卓易通,让我踩了一次坑

前言 因为我本身对鸿蒙提不起兴趣&#xff0c;哪怕有些文章给鸿蒙穿上了“黑丝”&#xff0c;再加上公司当前没有适配鸿蒙的计划&#xff0c;所以关于鸿蒙的消息我都关注的很少。 今早&#xff0c;看到了徐宜生老师的一篇文章&#xff1a;“鸿蒙卓易通&#xff0c;是饮鸩止渴…

Cursor vs VS Code vs Zed

代码编辑器的世界已经迎来了创新的爆发。曾经由重量级IDE或基础文本编辑器主导的领域,如今开发者们发现自己正在探索全新一波聚焦于AI集成、协作和性能的工具。 在本文中,我们将深入探讨2025年三款流行的编辑器:Cursor、Visual Studio Code (VS Code)和Zed Code Editor。每…

使用 LiteFlow 实现灵活的业务逻辑解耦

1. 引言 1.1 业务逻辑复杂性带来的挑战 在现代软件开发中,随着业务需求不断增长,代码结构日趋复杂。硬编码式的流程控制方式难以适应频繁变更的需求,导致维护成本高、可读性差、扩展性弱。 1.2 规则引擎在解耦中的作用 规则引擎(Rule Engine)通过将业务逻辑与程序代码…