yolov11与双目测距结合,实现目标的识别和定位测距(onnx版本)
一、yolov11+双目测距基本流程
yolov11 + 双目测距的大致流程就是:
双目标定 --> 立体校正(含消除畸变) --> 立体匹配 --> 视差计算 --> 深度计算(3D坐标)计算 --> 目标检测 --> 目标距离计算及可视化
下面将分别阐述每一个步骤并使用python来实现。
二、双目测距
其中双目测距的原理及过程请查看我下面的博客
保姆级双目测距原理及代码-CSDN博客
三、目标检测
在本项目中,我们选用了轻量级且高效的目标检测模型 YOLOv11,并使用其 ONNX格式模型部署,结合OpenCV和ONNX Runtime完成前向推理,实现高性能目标识别。整个检测流程主要包括 模型转换、图像预处理、模型推理、后处理 四个步骤,以下是详细解析:
3.1 模型转换(PyTorch → ONNX)
为提升系统在不同平台的兼容性与环境,我们将 PyTorch 格式的 YOLOv11 模型转换为 ONNX 格式,供 onnxruntime
加载使用。
Ultralytics 框架提供了简洁的模型导出接口,支持直接将训练好的 .pt
权重导出为 ONNX 文件。转换代码如下:
from ultralytics import YOLO# 加载YOLOv11模型
model = YOLO("./weight/yolo11s.pt")# 转onnxsimplify
model.export(format="onnx", simplify=False, device="cpu", opset=15)
其中参数说明如下:
-
format="onnx"
:指定导出格式为 ONNX。 -
simplify=False
:是否使用onnxsim
简化模型结构。此处设置为False
,保持模型结构完整。 -
device="cpu"
:导出时使用 CPU 进行模型加载和转换。 -
opset=15
:指定 ONNX 的算子集版本,确保在现代推理环境中兼容性良好。
导出成功后,系统会在当前目录生成名为 yolo11s.onnx
的模型文件。
该模型可直接通过 onnxruntime.InferenceSession
加载,用于后续图像目标检测与测距任务。
3.2 图像预处理(Preprocess)
输入图像在送入YOLOv11模型前,需要经过标准化与尺寸调整。预处理的关键操作包括:
-
颜色空间转换:BGR转RGB(符合模型训练时的格式要求);
-
等比例缩放:根据模型输入尺寸(如640x640)对图像缩放,同时添加灰色边框填充,确保图像比例不变;
-
归一化:将像素值归一到0,10, 10,1;
-
维度调整:转换为
NCHW
格式,以匹配ONNX模型输入要求。
其中,图像预处理代码如下:
def preprocess_image(self, image):# 调节颜色通道image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# rsize + paddingh, w, c = image.shape# 求各自缩放到模型的缩放比例,找出最小比例r_w = self.model_width / wr_h = self.model_height / hratio = 0if r_h > r_w:tw = self.model_widthth = int(h * r_w)ratio = r_w# 填充尺寸p_x1 = p_x2 = 0p_y1 = int((self.model_height - th) / 2)p_y2 = self.model_height - th - p_y1else:th = self.model_heighttw = int(w * r_h)ratio = r_h# 填充尺寸p_y1 = p_y2 = 0p_x1 = int((self.model_width - tw) / 2)p_x2 = self.model_width - tw - p_x1image = cv2.resize(image, (tw, th))image = cv2.copyMakeBorder(image, p_y1, p_y2, p_x1, p_x2, cv2.BORDER_CONSTANT, (128, 128, 128))image2 = image# 转换为浮点型并归一化到 [0, 1]image = image.astype(np.float32) / 255.0# 转换为 NCHW 格式(批次、通道、高、宽)image = np.transpose(image, (2, 0, 1))image = np.expand_dims(image, axis=0)return image, ratio, [p_x1, p_x2, p_y1, p_y2]
3.2 ONNX模型推理
通过 onnxruntime.InferenceSession
加载YOLOv11的ONNX模型,并根据模型定义的输入输出节点,构建推理输入:
self.onnx_session = onnxruntime.InferenceSession(self.onnx_path)
input_feed = {self.input_name[0]: preprocessed_image}
pred_bbox = self.onnx_session.run(None, input_feed)[0]
3.3 后处理(Postprocess)
在目标检测模型完成前向推理后,其输出通常为大量未筛选的候选框(bounding boxes),每个候选框包含位置坐标、各类别置信度等信息。为了从中提取有效的目标信息,并在原始图像上可视化展示,需对模型输出进行后处理。后处理步骤如下:
-
维度变换与置信度筛选:
模型输出的张量pre_box
通过np.einsum("bcn->bnc", pre_box)
调整维度顺序,得到[num_boxes, num_channels]
形式的数据。随后提取每个候选框的最大类别置信度,并只保留置信度高于设定阈值conf_thres
的候选框。 -
提取目标框与类别索引:
对保留的候选框,提取其前四个位置坐标、最大置信度和类别索引。类别索引由np.argmax
得到,即置信度最大的类别。 -
非极大值抑制(NMS):
通过 OpenCV 的cv2.dnn.NMSBoxes
实现 NMS,去除重叠度(IoU)过高的冗余候选框,保留最优检测结果。 -
坐标解码与图像尺度还原:
检测框坐标从中心点形式cx, cy, w, h
转换为边界框形式x1, y1, x2, y2
,并根据预处理的 padding 和缩放比例ratio
还原为原始图像坐标。边界值被限制在图像范围内,防止越界。
其中,后处理代码如下:
def postprocess_image(self, original_image, pre_box, points_3d, ratio, pad_size):pre_box = np.einsum("bcn->bnc", pre_box)# 获取每个预测框的最大置信度conf_scores = np.amax(pre_box[..., 4:], axis=-1)# 只保留置信度大于阈值的预测框x = pre_box[conf_scores > self.conf_thres]x = np.c_[x[..., :4], conf_scores[conf_scores > self.conf_thres], np.argmax(x[..., 4:], axis=-1)]# NMS filteringx = x[cv2.dnn.NMSBoxes(x[:, :4], x[:, 4], self.conf_thres, self.iou_thres)]# Decode and returnif len(x) > 0:# cxcywh -> xyxyx[..., [0, 1]] -= x[..., [2, 3]] / 2x[..., [2, 3]] += x[..., [0, 1]]# 恢复成原图尺寸x[..., :4] -= [pad_size[0], pad_size[2], pad_size[1], pad_size[3]]x[..., :4] /= ratio# 检查边界x[..., [0, 2]] = x[:, [0, 2]].clip(0, original_image.shape[1])x[..., [1, 3]] = x[:, [1, 3]].clip(0, original_image.shape[0])
四、目标距离计算及可视化
在完成目标检测的后处理阶段后,系统已经获得每个候选目标的二维图像坐标和置信度信息。为了进一步实现三维感知功能,本系统结合双目测距模块输出的 points_3d
,实现目标距离的估算与图像可视化展示。
4.1 距离估算(3D中心点提取)
首先,对通过置信度筛选和 NMS 处理后的目标框,计算其中心点坐标:
随后,根据中心点的像素坐标,从稠密深度图中提取该位置对应的三维坐标:
其中,Z表示相机到目标的深度距离。
4.2 类别过滤与绘制逻辑
为提升系统的针对性与应用适应性,引入了可配置的 detection_name
白名单机制。仅当检测到的目标类别存在于该名单中时,才执行可视化绘制与距离估算操作。该策略可适用于特定场景(如仅关注“人”或“汽车”等对象)。
4.3 可视化结果展示
最终,为提升用户体验并实现直观展示,系统将检测结果绘制回原始图像中,具体包括:
-
目标框绘制:使用
cv2.rectangle
绘制每个目标的边界框,不同类别采用不同颜色(由COLORS
字典控制); -
距离信息叠加:在目标框上方添加该目标与相机之间的距离信息,格式为
"Distance: 1.52 m"
; -
类别与置信度(可选):支持在框上叠加类别名称与预测置信度,用于辅助判断目标识别准确性。
yolov11双目测距图像
yolov11双目测距深度
五、整体代码介绍
本代码实现了基于双目立体视觉的目标检测与测距系统,涵盖了畸变矫正、立体校正、视差计算及深度计算和目标检测关键步骤。
测距模块从 stereoconfig 模块中加载相机标定参数,包括内外参和畸变系数,利用 OpenCV 的 cv2.stereoRectify() 对左右相机图像进行立体校正,保证图像对齐。随后,采用 SGBM(半全局匹配算法)计算视差图,并结合 WLS(加权最小二乘滤波)滤波器对视差图进行优化,提高视差的平滑性和准确性。接着,通过 cv2.reprojectImageTo3D() 将视差图转换成三维点云,得到每个像素的三维信息。检测模块基于ONNX格式的YOLO模型,结合后处理与非极大值抑制筛选检测框,并计算目标中心点的三维坐标实现距离估计。
系统支持两种运行模式:图片模式(image_mode)用于处理静态双目图像,摄像头模式(camera_mode)支持实时视频流处理,实现动态测距与目标检测。可根据自己需求进行相应选择。
本代码仅依赖 ONNX、NumPy 和 OpenCV 库,无需依赖 PyTorch 等深度学习框架,因而更适合部署在边缘设备上,具有较低的资源消耗和良好的跨平台兼容性。
关于该系统涉及到的完整源码、测试图片视频、说明、安装环境等相关文件,均已打包上传,感兴趣的小伙伴可以通过下载链接自行获取。
yolov11+双目测距代码
相关文章:

yolov11与双目测距结合,实现目标的识别和定位测距(onnx版本)
一、yolov11双目测距基本流程 yolov11 双目测距的大致流程就是: 双目标定 --> 立体校正(含消除畸变) --> 立体匹配 --> 视差计算 --> 深度计算(3D坐标)计算 --> 目标检测 --> 目标距离计算及可视化 下面将分别阐述每…...

基于51单片机和8X8点阵屏、独立按键的填充消除类小游戏
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 使用的是普中A2开发板。 【单片机】STC89C52RC 【频率】12T11.0592MHz 【外设】8X8点阵屏、独立按键 效果查看/操作演示&#x…...
将数据库表导出为C#实体对象
数据库方式 use 数据库;declare TableName sysname 表名 declare Result varchar(max) /// <summary> /// TableName /// </summary> public class TableName {select Result Result /// <summary>/// CONVERT(NVARCHAR(500), ISNULL(ColN…...

物联网技术发展与应用研究分析
文章目录 引言一、物联网的基本架构(一)感知层(二)网络层(三)平台层(四)应用层 二、物联网的关键技术(一)传感器技术(二)通信技术&…...

金融系统渗透测试
金融系统渗透测试是保障金融机构网络安全的核心环节,它的核心目标是通过模拟攻击手段主动发现系统漏洞,防范数据泄露、资金盗取等重大风险。 一、金融系统渗透测试的核心框架 合规性驱动 需严格遵循《网络安全法》《数据安全法》及金融行业监管要求&am…...
C++ 信息学奥赛总复习题
第一章 C 基础语法 一、填空题 C 源文件的扩展名通常是______。C 程序的入口函数是______。在 C 中,注释有两种形式,分别是______和______。声明一个整型变量 a 的语句是______。输出语句的关键字是______。 二、判断题 C 区分大小写。( …...

9.进程间通信
1.简介 为啥要有进程间通信? 如果未来进程之间要协同呢?一个进程要把自己的数据交给另一个进程!进程是具有独立性的,所以把一个进程的数据交给另一个进程----基本不可能!必须通信起来,就必须要有另一个人…...
性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断
🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断 📚 目录 🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断一、为什么选择 MiniProfiler? 🧐二、集成 MiniProf…...

React 基础入门笔记
一、JSX语法规则 1. 定义虚拟DOM时,不要写引号 2.标签中混入JS表达式时要用 {} (1).JS表达式与JS语句(代码)的区别 (2).使用案例 3.样式的类名指定不要用class,要用className 4.内…...
C++.OpenGL (12/64)光照贴图(Lightmaps)
光照贴图(Lightmaps) 静态光照烘焙技术 #mermaid-svg-1vJKLLr1zSCp1ASH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1vJKLLr1zSCp1ASH .error-icon{fill:#552222;}#mermaid-svg-1vJKLLr1zSCp1ASH .error-text…...

压测软件-Jmeter
1 下载和安装 1.1 检查运行环境 Jmeter需要运行在java环境(JRE 或 JDK)中 在window的"命令提示窗"查看安装的java版本: java -version 1.2 下载Jmeter 从Apache官网下载Jmeter安装包 1.3 解压和运行 解压后,进入bin文件夹,双击jmeter.bat即可…...
Linux 常用命令语法总结
Linux 常用命令语法总结 1. 文件和目录操作 1.1 基本文件操作 # 列出文件和目录 ls # 列出当前目录内容 ls -l # 详细列表格式 ls -la # 显示隐藏文件 ls -lh # 人性化显示文件大小 ls...
青少年编程与数学 01-011 系统软件简介 02 UNIX操作系统
青少年编程与数学 01-011 系统软件简介 02 UNIX操作系统 一、UNIX的历史沿革二、UNIX系统架构三、UNIX主要特性四、UNIX分支与变种五、UNIX设计哲学六、UNIX的影响与遗产 **摘要:**UNIX操作系统是现代计算领域最具影响力的操作系统之一,其设计哲学和技术…...

NLP学习路线图(三十):微调策略
在自然语言处理领域,预训练语言模型(如BERT、GPT、T5)已成为基础设施。但如何让这些“通才”模型蜕变为特定任务的“专家”?微调策略正是关键所在。本文将深入剖析七种核心微调技术及其演进逻辑。 一、基础概念:为什么需要微调? 预训练模型在海量语料上学习了通用语言表…...

leetcode刷题日记——1.组合总和
解答: class Solution { public:void dfs(vector<int>& candidates, int target, vector<vector<int>>& ans, vector<int>& combine, int idx) {if(idxcandidates.size()){//遍历完的边界return;}if(target0){//找完了能组成和…...

关于单片机的基础知识(一)
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于单片机基础知识的相关内容…...
Python训练营打卡Day45
知识点回顾: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 效果展示如下,很适合拿去组会汇报撑页数: 作业:对resnet18在cifar10上采用微调策略下,用tensorbo…...

Xilinx FPGA 重构Multiboot ICAPE2和ICAPE3使用
一、FPGA Multiboot 本文主要介绍基于IPROG命令的FPGA多版本重构,用ICAP原语实现在线多版本切换。需要了解MultiBoot Fallback点击链接。 如下图所示,ICAP原语可实现flash中n1各版本的动态切换,在工作过程中,可以通过IPROG命令切…...

Redis专题-基础篇
题记 本文涵盖了Redis的各种数据结构和命令,Redis的各种常见Java客户端的应用和最佳实践 jedis案例github地址:https://github.com/whltaoin/fedis_java_demo SpringbootDataRedis案例github地址:https://github.com/whltaoin/springbootData…...

springMVC-11 中文乱码处理
前言 本文介绍了springMVC中文乱码的解决方案,同时也贴出了本人遇到过的其他乱码情况,可以根据自身情况选择合适的解决方案。 其他-jdbc、前端、后端、jsp乱码的解决 Tomcat导致的乱码解决 自定义中文乱码过滤器 老方法,通过javaW…...

【iOS安全】iPhone X iOS 16.7.11 (20H360) WinRa1n 越狱教程
前言 越狱iPhone之后,一定记得安装一下用于屏蔽更新的描述文件(可使用爱思助手) 因为即便关闭了自动更新,iPhone仍会在某些时候自动更新系统,导致越狱失效;更为严重的是,更新后的iOS版本可能是…...
MongoDB检查慢查询db.system.profile.find 分析各参数的作用
db.system.profile.find() 是分析 MongoDB 性能的关键工具,其返回的文档包含丰富的性能指标。下面是对各参数的详细解释和优化建议: {"op": "query", // 操作类型(query/update/remove)"ns": "test.users", // 命名…...

智能标志桩图像监测装置如何守护地下电缆安全
在现代城市基础设施建设中,大量电缆、管道被埋设于地下,这虽然美化了城市景观,却也带来了新的安全隐患。施工挖掘时的意外破坏、自然灾害的影响,都可能威胁这些"城市血管"的安全运行。 传统的地下设施标识方式往往只依…...

【网站建设】网站 SEO 中 meta 信息修改全攻略 ✅
在做 SEO 优化时,除了前一篇提过的Title之外,meta 信息(通常指 <meta> 标签)也是最基础、最重要的内容之一,主要包括: <meta name="description"> <meta name="keywords"> 搜索引擎重点参考这些信息,决定你网页的展示效果与排名。…...

计算机视觉处理----OpenCV(从摄像头采集视频、视频处理与视频录制)
一、采集视频 VideoCapture 用于从视频文件、摄像头或其他视频流设备中读取视频帧。它可以捕捉来自 多种源的视频。 cv2.VideoCapture() 打开摄像头或视频文件。 cap cv2.VideoCapture(0) # 0表示默认摄像头,1是第二个摄像头,传递视频文件路径也可以 …...
elasticsearch基本操作笔记
1.通过kibana查看elasticsearch版本信息 a.左上角三道横->Management->Dev Tools b.GET / 执行 c.执行结果 { “name” : “xxxx”, “cluster_name” : “xxxxxxx”, “cluster_uuid” : “vl1UudAoQp-aHWAzyPoMyw”, “version” : { “number” : “7.15.1”, “build…...
LVGL手势识别事件无上报问题处理记录
最近在使用LVGL8.3开源库开源UI界面时,碰到使用FB驱动显示UI时,触摸屏手势识别事件接收不到的情况,通过如下调整可以处理该问题: 1、创建Top Object时,不能使用如下语句: lv_obj_t *page_obj = lv_obj_create(lv_scr_act()); 而要使用如下语句: lv_obj_t *page_obj =…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- 第一篇:MIPI CSI-2基础入门
第一篇:MIPI CSI-2基础入门 1. 为什么需要CSI-2? 痛点场景对比 (用生活案例降低理解门槛) 传统并行接口CSI-2接口30根线传输720P图像仅需5根线(1对CLK4对DATA)线距>5cm时出现重影线缆可长达1…...

变幻莫测:CoreData 中 Transformable 类型面面俱到(一)
概述 各位似秃似不秃小码农们都知道,在苹果众多开发平台中 CoreData 无疑是那个最简洁、拥有“官方认证”且最具兼容性的数据库框架。使用它可以让我们非常方便的搭建出 App 所需要的持久存储体系。 不过,大家是否知道在 CoreData 中还存在一个 Transfo…...

开源技术驱动下的上市公司财务主数据管理实践
开源技术驱动下的上市公司财务主数据管理实践 —— 以人造板制造业为例 引言:财务主数据的战略价值与行业挑战 在资本市场监管日益严格与企业数字化转型的双重驱动下,财务主数据已成为上市公司财务治理的核心基础设施。对于人造板制造业而言࿰…...