单目测距(yolo目标检测+标定+测距代码)

news2025/1/23 10:25:24

单目测距(目标检测+标定+测距)**

   实时感知本车周围物体的距离对高级驾驶辅助系统具有重要意义,当判定物体与本车距离小于安全距离时便采取主动刹车等安全辅助功能,这将进一步提升汽车的安全性能并减少碰撞的发生。上一章本文完成了目标检测任务,接下来需要对检测出来的物体进行距离测量。首先描述并分析了相机成像模型,推导了图像的像素坐标系与世界坐标系之间的关系。其次,利用软件标定来获取相机内外参数并改进了测距目标点的选取。最后利用测距模型完成距离的测量并对采集到的图像进行仿真分析和方法验证。

5.1 单目视觉测距与双目视觉测距对比**

测距在智能驾驶的应用中发挥着重要作用。测距方法主要包含两类:主动测距与被动测距,主动测距是当前研究的热点内容之一。主动测距方法包括采用传感器、摄像机、激光雷达等车载设备进行测距。摄像头由于价格相对低廉且性能稳定应用较为广泛,本文采用摄像头进行距离测量。

单目测距主要运用测距模型结合目标矩形框来进行测距任务,通过目标在图像中的大小位置信息去估算距离。单目测距算法具有计算量小、成本低廉的优点,并且测距误差也可以通过后续的调校来消除,很多算法都在采用基于单目视觉传感器来开发产品。因此相对其他测距方法,单目视觉有更成熟的算法,本文亦采用单目视觉测距。
利用双目视觉可以获取同一物体在成像平面上的像素偏移量。然后可以使用相机焦距、像素偏移以及两个相机之间的实际距离从数学上得出对象之间的距离。与单目测距相比,双目测距虽然更加精确,不需要数据集,但计算量大,速度相对较慢,而且由于使用了两个摄像头,成本也变得更高。

5.2 相机成像模型**

想要得到距离信息需要获得三维真实世界里的点,而由于处理的对像是摄像头捕捉后的二维平面图像,因此如何将二维图像上的某个点转换为三维世界里的点是值得考虑的问题。进一步的,把图像上的点转换到真实世界的点,就需要进行像素坐标系、图像坐标系、相机坐标系以及世界坐标系之间的相互转换。四种坐标系之间的相互关系如图5-1所示。坐标系描述如下:
 图5-1 坐标关系图**** ****

(1)像素坐标系。数字图像一般是三维图像并且由众多像素点组合而成的,像素坐标系的原点为O2,以宽度方向为u轴,以高度方向为v轴。
(2)图像坐标系。图像坐标原点为O1,并且像素坐标系和图像坐标系是平行的,以图像宽度方向为x轴,以高度方向为y轴,长度单位为mm。
(3)相机坐标系。相机坐标系原点Oc,Xc轴、Yc轴分别是与图像坐标系下的x轴、y轴相互平行,相机Zc轴和摄像头光轴重合。
(4)世界坐标系。我们所处的环境即是在世界坐标系之下,也就是图5-1中Xw-Yw-Zw平面。Pw通过真实世界上的一点至图像上的P点,完成从世界坐标到图像上坐标的转换。

5.3 坐标系转换

(1)像素坐标系转换到图像坐标系

像素坐标系是以像素来表示各个像素位置信息的,但是它不能够表达出图像中物体的物理大小,因此需要进行坐标系之间的转换。

在这里插入图片描述

                图5-2 图像坐标系

在图5-2中,图像坐标系的坐标(x,y)与像素坐标系的坐标(u,v)之间的关系可以表示为:
在这里插入图片描述

(5.1)

式(5.1)中,(u0,v0)是图像中心的像素坐标,dx、dy分别是横向和纵向像素在感光板上的单位物理长度。
写成齐次坐标矩阵的形式为:
在这里插入图片描述

	(5.2)

# (2)图像坐标系变换到相机坐标系

在这里插入图片描述

                       **图5-3 相机坐标系**

在图5-3中,OcO1之间的距离为焦距f。图5-4表示了物体成像到图像坐标系的过程,P点、 P'点分别为相机坐标系和图像坐标系下的坐标。

在这里插入图片描述

图5-4 相似三角形模型
由上图易知,三角形OcO1B和三角形OcCA相似,三角形OcBP'和三角形OcAP相似,根据相似三角形原理有:
在这里插入图片描述

	(5.3)

并且OcO1的距离为焦距f,结合P(Xc,Yc,Zc),P'(x,y)点坐标,上式可写为:
在这里插入图片描述

	(5.4)

进一步推倒可得:
在这里插入图片描述

将其写成齐次坐标矩阵的形式为:
在这里插入图片描述

	(5.5)

(3)相机坐标系变换到世界坐标系
在这里插入图片描述

                **图5-5相机坐标系到世界坐标系的转换**

相机坐标系变换到世界坐标系可以描述为一个旋转平移的过程,分别将旋转和平移的分量加起来就是整个坐标系转换的全过程了。对于旋转过程,假设相机坐标系的Z轴与世界坐标系重合,那么有:
在这里插入图片描述

	(5.6)

同理,绕X轴旋转会得到如下关系:
在这里插入图片描述

	(5.7)

绕Y轴旋转会得到如下关系:
在这里插入图片描述

	(5.8)

对于平移分量来说,可以表达为:
在这里插入图片描述

	(5.9)

得到平移向量和旋转矩阵后,从相机坐标系变换到世界坐标系的公式可以完整的写为:
在这里插入图片描述

	(5.10)

其中旋转矩阵R为:
在这里插入图片描述

,平移矩阵T表示为:。结合式(5.2),式(5.5),式(5.10),就完成了从像素坐标系到世界坐标系的转换,整合起来为:
在这里插入图片描述

	(5.11)

这样针对图像上的一个点,就可以利用上述公式结合相机内外参数求解出具体的距离值。

5.4 相机内外参数与畸变系数

相机内外参数对图像矫正和测距具有重要意义。内外参数以及畸变系数可以通过相机标定得到机。并且相机都会发生畸变,这对于测量来说显然是不能容忍的,因此消除畸变是十分有必要的

5.4.1相机内外参数

在公式(5.11)中,等号右端第一项为相机的外参数,等号右端第二项表示为相机内参数,内参属于相机内在属性。式中未知参数Zc表示物体到光学中心的距离。同时也说明了,在相机标定的过程中,如果物体相对于相机的位置不同,那么需要对于每一个位置都需要去进行相机标定。

5.4.2相机畸变系数

相机畸变造成了图像平面上某一像素点的真实位置与理想位置不完全重合的现象,因此了解相机畸变现象并对相机进行矫正十分有必要。相机畸变主要包括径向畸变和切向畸变二类。图5-6展示了畸变模型,对于平面上任意理论点P,由与畸变的存在,会使得P点偏移到P'点。图中dr表示相机的径向畸变,dt表示相机的切向畸变。
在这里插入图片描述

    图5-6 相机畸变模型

(1)径向畸变
径向畸变与透镜的形状密切相关,而且离透镜中心越远的地方畸变越明显。径向畸变大都表现为桶形畸变和枕型畸变两种方式。畸变的多项调节公式为:
在这里插入图片描述

	(5.12)

其中(xi,yi)是图像平面上的理想点。(x0,y0)是畸变矫正后实际位置点。理想点与成像中心的距离,k1,k2,k3表示为相机径向畸变系数。如果这三个系数都小于零,那么将造成桶型畸变;如果三个系数均都大于零,则将造成枕型畸变。
(2)切向畸变
切向畸变的产生大都由于整个摄像机的组装和制造过程。对于切向畸变来说,可以使用两个切向畸变系数p1和p2进行纠正。
得到上述矫正公式后就可以完成对图像良好的修正。将切向矫正函数与径向矫正函数联合起来后,可以用如下公式表示:
在这里插入图片描述

	(5.14)

由于本文测距是面向自动驾驶领域,其对精度要求很高,畸变会对智能驾驶性能造成深远的负面影响。所以在这些应用中,系统必须使用相机标定法求取 p1和p2以及k1、k2和k3,并且这些参数后续测距模型也将应用到。

5.5 相机标定流程

相机标定可以获得畸变参数和相机内外参数,相机的标定可以分为依赖于标定参照物的标定方法和相机自标定方法两种。前者适用于对精度要求高的应用场合。后者由于标定后的计算结果会产生较大的误差,因此不适用于对精确度要求很高的应用场景。为了追求计算精度,本文采取第一种方法进行标定。

采用matlab进行标定:在这里插入图片描述
上图为引用图片。
通过采集标定板的图片,然后喂入matlab 获取相机内参。外参。
在这里插入图片描述

5.6 单目测距模型

在完成了相机畸变矫正和相机内外参数的求取之后,建立了如下的单目测距模型,再结合第四章目标检测获取的矩形框就可以进行距离的求取。
在这里插入图片描述

   图5-10 测距模型

测距模型可以看作是一个凸透镜成像的过程。上图中,Xc-Yc-Zc是相机坐标系,xO1y是图像坐标系,O1O为焦距f,x1O2y1是地面坐标系,OO2为摄像头安装高度h。图中有一辆车在地面上,那么其接地点Q必定在地面上。在单目测距过程中,实际物体上的Q点在成像的图片上对应Q'点,Q'点在y轴上的投影为P'点。水平线与Zc轴的夹角为α,Zc光轴与PP'的夹角为β,直线OP与地面x1轴的夹角为γ。

5.6.1目标点的选取

根据第四章的运行结果将获得图5-11中的目标检测框,并且已知相机内外参数,将其联合起来就可以得到测距值。具体的本文首先要选取参考点(目标点),拟选取目标框底部中点位置作为参考点,并根据大量目标框的获取结果。观察到目标矩形框比目标物实际尺寸略大,因此采取偏移的方式对目标参考点进行矫正以保证测距精确度。本文采取让参考点向上偏移d个像素点,并且获取的是目标框的左上角和右下角坐标,因此参考点坐标可以表示为:
在这里插入图片描述

	(5.15)

其中xL、xR、yR表示红色框的左上角x坐标、右下角x坐标、右下角y坐标。
在这里插入图片描述

 图5-11 目标点的选取

然而上述目标点适合前方物体在本车正前方的场景,当面对场景如图5-12时,目标物会出现在本车侧方位置。如果再把目标框下部中点作为测距目标点,会出现目标点严重偏离车辆正下方的问题,存在目标点出现在汽车中心位置左侧或中心右侧的现象,这会造成测距精度不高的缺点。因此,进一步的对其进行改进,当目标点(xp,yp)与图像下部中点斜率k满足阈值δ时,就会更新xp'的值,新的xp'可以表示为:
在这里插入图片描述

	(5.16)

其中λ为偏移权重系数,当k值为负时,λ为负;当k值为正时,λ也为正

测量结果

在这里插入图片描述
实测6.01
实测6.01米

代码

def object_point_world_position(u, v, h, w, out_mat, in_mat):
    x_d = (v + w) / 2  # 目标框  左上右下
    y_d = h
    #         print('关键点坐标:', u1, v1)

    #         alpha = -(90 + 0) / (2 * math.pi)
    #         peta = 0
    #         gama = -90 / (2 * math.pi)
    # H = 4032 # 手机拍出来的宽高
    # H=1280
    # W=720
    H=320
    W=240
    fx = in_mat[0, 0]  # k内参矩阵
    fy = in_mat[1, 1]
    cam_H = 1.32
    # angle_a = math.pi/10.5# 俯仰角pi/180*x
    angle_a = 0
    angle_b = 0 #math.atan((y_d - H / 2) / fy)  # 如果V在下面  V1+H/2
    angle_c = angle_b + angle_a
    #     print('angle_b', angle_b)

    depth = (cam_H / np.sin(angle_c)) * math.cos(angle_b)
    #     print('depth', depth)

    k_inv = np.linalg.inv(in_mat)
    p_inv = np.linalg.inv(out_mat)
    # print(p_inv)
    point_c = np.array([x_d, y_d, 1])  ##相机坐标
    point_c = np.transpose(point_c)
    #     print('point_c', point_c)
    #     print('k_inv_in', k_inv)
    c_position = np.matmul(k_inv, depth * point_c)
    #     print('c_position', c_position)
    c_position = np.append(c_position, 1)  # 世界坐标
    c_position = np.transpose(c_position)
    c_position = np.matmul(p_inv, c_position)  # 世界坐标
   
    return d1, distance,x_d,y_d,H,W

代码获取:全部代码

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

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

相关文章

Shell 标准输入和输出

无论是要交给程序处理的数据,还是控制脚本的简单命令,都少不了输入和输出。程序要做的第一件事就是处理如同一阴一阳的“输入与输出”。 1 、从文件获取输入 当我们希望向文件输出内容时,我们可以通过符号 > 或 >> 实现。而用代表…

[ Linux ] 线程独立栈,线程分离,Linux线程互斥

目录 1.线程栈 1.1pthread_t 1.2用户级的线程id与内核LWP的对应关系 2.分离线程 2.1 pthread_detch 3.线程互斥 3.1互斥相关概念 3.2 互斥量mutex 3.3 售票系统案例验证共享变量会有问题 3.4 解决抢票问题 3.5互斥量的接口 3.5.1初始化互斥量 3.5.2 销毁互斥量 3…

MSF之ssh_login漏洞

ssh_login准备实操准备 目标机:windows xp 攻击机:kali 工具:metasploit framework 实操 先查看两机器的ip kali的ip为172.17.0.1 xp的ip为192.168.17.130 互相ping一下 没问题。 打开msf search ssh_login 爆出模块 use 0 show o…

vue项目打包流程与反向代理Nginx的使用

目录 前言 参考文章 正文 1.打包前的配置工作 做反向代理的原因(Vue项目打包后Proxy失效的问题): 2.Nginx使用 前言 突发灵感想学习下打包,第一反应是学习webpack,翻找一通后发现用不着webpack,因为…

ORB-SLAM2 --- Tracking::UpdateLocalPoints函数

目录 1.函数作用 2.函数流程 3.code 4.函数解析 1.函数作用 更新局部关键点。先把局部地图清空,然后将局部关键帧的有效地图点添加到局部地图中。 2.函数流程 这是更新局部地图中的一个小函数,我们在Tracking::UpdateLocalKeyFrames更新了局部关键…

C++ Reference: Standard C++ Library reference: Containers: map: map: value_comp

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/value_comp/ 公有成员函数 <map> std::map::value_comp value_compare value_comp() const;返回值比较对象 返回一个比较对象&#xff0c;该对象可用于比较两个元素&#xff0c;以获得第一个元素的键…

Python 基础| Python 直接赋值、深拷贝和浅拷贝

先看这三个词的意思我觉得菜鸟的总结就很好 Python 直接赋值、浅拷贝和深度拷贝 | 菜鸟教程 直接赋值&#xff1a;其实就是对象的引用&#xff08;别名&#xff09;。 浅拷贝(copy)&#xff1a;拷贝父对象&#xff0c;不会拷贝对象的内部的子对象。 深拷贝(deepcopy)&#xf…

采购过程中会遇到的四种风险!如何管理和控制?

采购风险通常是指采购过程可能出现的一些意外情况&#xff0c;这些情况都会影响采购预期目标的实现。采购风险通常是由管理不善引起的&#xff0c;本文解释了采购过程中会遇到的四种风险&#xff0c;并介绍通过正确实施8Manage SRM采购管理系统&#xff0c;可以有效管理和控制它…

说说Python程序的执行过程

1. Python是一门解释型语言&#xff1f; 我初学Python时&#xff0c;听到的关于Python的第一句话就是&#xff0c;Python是一门解释性语言&#xff0c;我就这样一直相信下去&#xff0c;直到发现了*.pyc文件的存在。如果是解释型语言&#xff0c;那么生成的*.pyc文件是什么呢&…

工程项目管理的特点

工程项目管理是一种只关注工程项目的项目管理。它使用与任何其他类型的项目管理相同的标准方法和流程。这种专业化可能会吸引任何想要进入项目管理领域的具有工程背景的人。 工程项目管理与工程管理 工程管理侧重于对具有以下特点的工程师和工程任务的管理&#xff1a; 1、…

java UDP通信程序DatagramSocket数据接收

在查看本文前 您可以先看看我的文章 java UDP通信程序DatagramSocket数据发送 对UDP有一个基本的了解 然后这里我们就直接看代码了 我们先创建一个包 包下创建两个类 分别是 sendOut 发送类 参考代码如下 import java.io.IOException; import java.net.DatagramPacket; impo…

【Flutter 笔记系列 第 3 篇】如何正确对待Name source files using `lowercase with underscores`

相信很多安装了一些提示插件的小伙伴都遇见过 Name source files using lowercase with underscores flutter 提示 如下图 此时会有两种选择 1.能跑就行&#xff0c;无视它 2.好烦&#xff0c;我也没干什么怎么就提示不规范了。 3.一定是哪里出了问题&#xff0c;我要找到…

高通Ride软件开发包使用指南(8)

高通Ride软件开发包使用指南&#xff08;8&#xff09;6.9跟踪6.10 基础感知延迟分析6.10.1生成CSV6.9跟踪 用户可以使用Google Chrome中的跟踪功能分析代码的执行浏览器以下步骤中的示例显示如何分析Foundation SDK相机知觉 必须启用相关日志条目&#xff0c;因为跟踪使用SD…

说说Spring事件发布机制

文章目录前言一、 使用到事件发布机制的源码二、Springboot启动过程中用到的部分事件三、Springboot中的监听器四、自定义事件源&#xff0c;事件监听器和事件发布器4.1 目录结构4.2 事件源4.3 事件监听器4.4 事件帮助器4.4.1 事件发布帮助接口4.4.2 事件发布帮助接口实现类4.4…

运维就业现状怎么样?技能要求高吗?

运维至少需要知道哪些知识才可以去面试&#xff1f; 有一个答案对这一话题的解读非常深入&#xff0c;体系化的分析了所需掌握的技术、工作内容、性质及可发展的方向等等&#xff0c;今天特别分享给大家&#xff0c;按照这个发展&#xff0c;运维则已不需担心就业、薪酬等问题了…

MySQL -2 指令

客户端SQL指令记录&#xff1a; -- 针对 数据库和针对数据表 &#xff08;一&#xff09;数据库 1. 查看当前所有数据库&#xff1a;show databases; 2. 创建数据库&#xff1a;create database 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 3. 删除数据库&#…

【一建、一造经验分享】一建挺难的,要坚持才能得到

标签&#xff1a;【备考四年】、【2020全科通过一建】、【2021全科通过一造】 思绪回到2017年7月份&#xff0c;软考-项目管理师出成绩了&#xff0c;很幸运我通过了。由于通信行业及单位认可“以考代评”&#xff0c;所以我最先下手的是软考高级&#xff0c;拿证等同于高工。在…

程序员核心------详解调试(2)

所爱隔山海&#xff0c;山海皆可平&#xff0c;所念皆星河&#xff0c;星河不可及。 上课&#xff01; 接着上节课讲的调试&#xff08;1&#xff09;&#xff0c;本节课进一步讲解调试(2). 文章目录1.调试实例讲解&#xff08;2&#xff09;校招笔试题 2.如何写出好的&#…

【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)

MapReduce是Hadoop系统核心组件之一&#xff0c;它是一种可用于大数据并行处理的计算模型、框架和平台&#xff0c;主要解决海量数据的计算&#xff0c;是目前分布式计算模型中应用较为广泛的一种。 一、MapReduce核心思想 MapReduce的核心思想是“分而治之”。所谓“分而治之…

猿人学APP第一题

抓包分析 copy CURL 转 requests代码 def app1():import requestsheaders {"Accept-Language": "zh-CN,zh;q0.8","User-Agent": "Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; Nexus 6P Build/OPM1.171019.011) AppleWebKit/534.30 (K…