YOLO 单目测距:原理、方法与代码

news2024/12/24 10:16:48

一、原理

单目测距的一个常见方法是假设物体的尺寸已知。通过测量物体在图像中的高度(或宽度),并结合物体的实际高度(或宽度),最简单的一种方式就是利用相似三角形的原理来计算物体的距离。

二、相似三角形原理

物体在图像中的尺寸与其实际尺寸成比例,而这个比例与物体到摄像头的距离成反比。如果公式化为:

F = (P x D) / W

例如,假设现在我们有一张A4纸(8.27in x 11.69in), in代表英寸,1in = 25.4mm。纸张宽度W=11.69in,相机距离纸张的距离D = 32in,此时拍下的照片中A4纸的像素宽度为P=192px(我的相机实际测量得到的值)。

此时我们可以算出焦距 F =(192x30)/11.69。

当我们将摄像头远离或者靠近A4纸时,就可以用相似三角形得到相机距离物体的距离。

此时的距离: D’ = (W’ x F ) / P’。

注意:这里测量的距离是相机到物体的垂直距离,产生夹角,测量的结果就不准确了。

YOLO 单目测距

三、测距步骤

  1. 使用摄像机采集道路前方的图像;

  2. 在道路区域对物体进行检测,通过矩形框将物体形状框出来。

  3. 结合矩形框信息,找到该矩形框底边的两个像平面坐标,分别记为(u1,v1)和(u2,v2);

  4. 使用几何关系推导法,由像平面坐标点(u1, v1)、(u2, v2)推导出道路平面坐标(x1,y1)、(x2, y2);(投影到地面上,z轴为0)

  5. 通过欧氏距离公式计算出d。

四、代码

焦距计算

def calculate_focalDistance(img_path):
    first_image = cv2.imread(img_path)
    # 获取矩形的中心点坐标,长度,宽度和旋转角度
    marker = find_marker(first_image)
    # 获取摄像头的焦距
    focal_Length = (marker[1][0] * KNOWN_DISTANCE) / KNOWN_WIDTH
    print('焦距(focal_Length) = ', focal_Length)
    return focal_Length

测距代码

foc = 1990.0  # 镜头焦距
# 通用高度或宽度均可
real_hight_person = 66.9  # 行人高度 170cm/2.54
real_hight_car = 57.08  # 轿车高度
​
​
# 这里用到h-2是因为框的上下边界像素点不接触物体
def person_distance(h):
    dis_inch = (real_hight_person * foc) / (h - 2)
    dis_cm = dis_inch * 2.54
    dis_cm = int(dis_cm)
    dis_m = dis_cm / 100
    return dis_m
​
​
def car_distance(h):
    dis_inch = (real_hight_car * foc) / (h - 2)
    dis_cm = dis_inch * 2.54
    dis_cm = int(dis_cm)
    dis_m = dis_cm / 100
    return dis_m

代码使用

for xyxy, conf, cls in zip(all_xyxy, all_conf, all_cls):
    cls = int(cls)
    x1, y1, x2, y2 = [int(i) for i in xyxy]
    h = y2 - y1
    if names[cls] == "person":
        dis_m = person_distance(h)
    if names[cls] == "car":
        dis_m = car_distance(h)
    label = f'{names[cls]} {conf:.2f} {dis_m}m'
​
    orig_img = draw_info(lw, tf, sf, orig_img, xyxy, label, colors)

五、链接作者

欢迎关注我的公众号:@AI算法与电子竞赛

硬性的标准其实限制不了无限可能的我们,所以啊!少年们加油吧!

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

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

相关文章

使用深度学习来进行击剑动作识别的裁判工作

在击剑比赛中,当双方几乎同时击中对方时,记分板两边都会亮起。这时裁判需要决定哪一方得分。一般而言,谁更主动或控制了局势就会得分。我尝试训练了一个模型来辅助裁判做这样的判断!目前该模型在花剑测试集上的准确率大约为60%&am…

Vue开发者工具安装详细教程

欢迎大家订阅【Vue2Vue3】入门到实践 专栏,开启你的 Vue 学习之旅! 文章目录 前言一、下载二、安装三、调试 前言 Vue 是一个框架,也是一个生态,其功能覆盖了大部分前端开发常见的需求。本文详细讲解了 Vue 开发者工具的安装。 …

ES7.17.5 float类型 terms带来的隐患

背景 1.用户在mapping中加一个字段 testid,结果写数据的时候使用 testId,同时也没有strict限制动态mapping,只是使用了默认的 true,即允许动态生成mapping 2.动态生成的字段 testId 被识别成了 float,用户为了方便&a…

【Netty 一】

Netty是什么 Netty 是一个高性能、异步事件驱动的 NIO 框架,基于 JAVA NIO 提供的 API 实现。它提供了对 TCP、 UDP 和文件传输的支持,作为一个异步 NIO 框架, Netty 的所有 IO 操作都是异步非阻塞 的, 通过 Future-Listener 机制…

ssrf漏洞之——漏洞复现

漏洞介绍 SSRF漏洞:SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由恶意访问者构造url,由服务端对此url发起请求的一个安全漏洞。 漏洞原理 SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,并且没有对目…

Autosar(Davinci) --- 创建一个Implementation Data Types

前言 这里我们讲一下如何创建一个Implementation Data Types(IDT) 一、什么是IDT 二、如何创建一个IDT 鼠标右键【Implementation Data Types】,选择【new Type Reference...】 起一个名字【IdtDoorState】,Data Types选择【boolean】,这里…

RFID光触发标签应用于制造业供应链管理的应用与探索

制造业作为国民经济的支柱产业,其供应链管理的复杂性和重要性日益凸显,在全球化竞争的背景下,企业需要更高效、更精准、更智能的供应链解决方案来满足市场需求,提高客户满意度,降低运营成本,RFID光触发标签…

【mysql】mysql的卸载和安装

mysql的卸载 mysql是否安装: 首先我们先来看看mysql是否安装: 快捷键winR输入cmd,进入命令输入框 输入mysql --version 查看mysql的版本 如果出现了mysql的版本就说明你已经安装了 系统用户root -p就是输入密码所以代码如下 mysql -ur…

AI大模型编写多线程并发框架(六十一):从零开始搭建框架

系列文章目录 文章目录 系列文章目录前言一、项目背景二、第一轮对话-让AI大模型理解我们的诉求二、第二轮对话-优化任务处理方法和结果处理方法三、参考文章 前言 在这个充满技术创新的时代,AI大模型正成为开发者们的新宠。它们可以帮助我们完成从简单的问答到复杂…

模拟实现STL中的unordered_map和unordered_set

目录 1.unordered_map和unordered_set简介 2.unordered_map和unordered_set设计图 3.迭代器的设计 4.哈希表的设计 5.my_unordered_map和my_unordered_set代码 1.unordered_map和unordered_set简介 unordered_map和unordered_set的使用非常类似于map和set,两…

【Linux】日志函数

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言日志内容日志等级日志函数的编写函数原型参数说明功能描述使用场景示例代码 引言 日志在程序设计中扮演着至关重要的角色,它不仅是程序运行情况的记录者,还是问题诊断、性…

【机器学习】智驭未来:机器学习如何重塑现代城市管理新生态

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀目录 🔍1. 引言:迈向智能城市的新时代📒2. 智驭交通:机器学习在智能交通管理中的应用&#x1…

仿Muduo库实现高并发服务器——LoopThreadPool模块

这个模块需要具备那些基础知识。 线程创建相关操作,锁,条件变量。 设置线程数量: _thread_count 是线程池中,记录线程数量的成员。 创建线程池: 上图就是线程池的创建,将线程与EventLoop对象 通过数组下…

关于嘉立创eda中同一个项目下多个原理图是否独立

嘉立创项目底下,如果你新建了多张原理图,如下 我发现,多张原理图是互相连接的,所以命名是不能重复的 多页原理图 | 嘉立创EDA标准版用户指南https://docs.lceda.cn/cn/Schematic/Multi-Sheet/index.html 上面是嘉立创原文介绍 综…

豆瓣评分7.9!世界级讲师耗时5年整理出的Python学习手册!

Python是一门流行的开源编程语言,广泛用于各个领域的独立程序与脚本化应用中。它不仅免费、可移植、功能强大,同时相对简单,而且使用起来充满乐趣。从软件业界的任意一角到来的程序员,都会发现Python着眼于开发者的生产效率以及软…

编程仙尊——深入理解指针(2)

目录 4.const修饰指针 4.1const修饰变量 5.指针运算 5.1指针-整数 5.2指针-指针 5.3指针的关系运算 6.assert断言 4.const修饰指针 4.1const修饰变量 在编程中,为了防止代码在运行过程中变量的内容意外改变,可以使用const函数,对变量…

介绍python的回归模型原理知识

一.回归 1.什么是回归 回归(Regression)最早是英国生物统计学家高尔顿和他的学生皮尔逊在研究父母和子女的身高遗传特性时提出的。1855年,他们在《遗传的身高向平均数方向的回归》中这样描述“子女的身高趋向于高于父母的身高的平均值&…

Linux云计算 |【第二阶段】SHELL-DAY2

主要内容: 条件测试(字符串比较、整数比较、文件状态)、IF选择结构(单分支、双分支、多分支)、For循环结构、While循环结构 一、表达式比较评估 test 命令是 Unix 和 Linux 系统中用于评估条件表达式的命令。它通常用…

小乌龟运动控制-1 小乌龟划圆圈

目录 第一章 小乌龟划圆圈 第二章 小乌龟走方形 文章目录 目录前言一、准备工作步骤一:创建ROS工作空间步骤二:创建ROS包和节点步骤三:编写Python代码步骤四:运行ROS节点总结 前言 本教程将教会你如何使用Python编写ROS小海龟节…

【SpringCloud】(一文通)优雅实现远程调用-OpenFeign

目 录 一. RestTemplate存在问题二. OpenFeign介绍三. 快速上手3.1 引入依赖3.2 添加注解3.3 编写 OpenFeign 的客户端3.4 远程调用3.5 测试 四. OpenFeign 参数传递4.1 传递单个参数4.2 传递多个参数4.3 传递对象4.4 传递JSON 五. 最佳实践5.1 Feign 继承方式5.1.1 创建⼀个Mo…