相机模型、相机标定及基于YOLOv5的单目测距实现
1. 前言
注意 此方法不需要预先知道物体尺寸,不需要参照物体!!!!
在摄像头成像的过程中,物体反射的光线通过摄像头的凸透镜聚焦到成像器件上,形成一张二维图像。这一过程将三维世界中的物体转换为二维图像,导致深度信息丢失,因此单目摄像头难以直接进行距离测量。然而,借助某些假设条件(例如假设物体位于地面上),我们可以通过特定方法估算物体的距离。
本文将详细介绍相机模型及其相关参数的标定过程,并探讨如何结合YOLOv5实现单目测距功能。这不仅涉及到理论上的理解,还包括实际应用中的一些挑战和解决方案。
2. 相机模型及单目测距原理
2.1 相机模型
相机模型可以简化为一个凸透镜成像系统,如图所示,其中(X_cY_cZ_c)代表相机坐标系,其原点(O)即为光心,也就是相机凸透镜的中心点;而(x-o_1-y)则构成了图像坐标系。当车辆等物体出现在视场内时,其底部接触地面的点(Q)会映射到图像平面上的一个对应点(Q’)。
在这个场景下,如果已知相机的高度(H)以及相机光轴与水平线之间的夹角(\alpha),并且假设物体位于水平地面上,则可以通过简单的几何关系计算出物体到相机的距离。具体来说,就是利用(Q’)点相对于图像中心的位置来推算角度,进而求解深度(OD)。但是需要注意的是,这种基于假设的方法对于动态环境或不平坦地面的有效性有限。
3. 相机参数标定
为了确保单目测距的准确性,首先需要精确获取相机的内部和外部参数。
3.1 内参矩阵
相机内参指的是相机内部的固有属性,包括焦距(f_x)和(f_y)(沿x轴和y轴方向)、主点偏移量(c_x)和(c_y)(图像中心)。这些参数定义了从相机坐标系到图像坐标系的转换关系:
其中,(u)和(v)表示图像坐标系中的像素位置,而(Z_c)是物体在相机坐标系下的深度。
3.2 内参标定
通常使用张正友提出的棋盘格标定法来进行内参标定。该方法要求拍摄一系列不同角度下的棋盘格图像,并通过MATLAB等工具自动计算出内参矩阵。步骤如下:
打印即可用@@@
- 准备一组约20张不同视角下的棋盘格照片。
- 使用MATLAB中的Camera Calibration应用程序导入图片并完成标定。
- 导出得到的内参矩阵用于后续处理。
3.3 外参矩阵
外参矩阵描述了相机坐标系与世界坐标系之间的相对位置和姿态。它由旋转矩阵(R)和平移向量(T)组成,共同决定了两者间的转换关系:
其中,(R)表示旋转矩阵,(T)表示平移向量。确定这两个矩阵的关键在于明确两个坐标系之间的旋转顺序和平移矢量。
4. 基于YOLOv5的单目测距实现
在实际应用中,我们开发了一个名为estimate_distance.py
的Python脚本作为核心程序,其中包含了DistanceEstimation
类,实现了目标检测后的距离估计功能。以下是主要的工作流程:
- 目标检测:利用预训练好的YOLOv5模型对输入视频流或静态图片进行实时检测,识别出感兴趣的物体。
- 特征提取:对于每个检测到的目标框,提取底部中点作为参考点(Q’),类似于前面提到的测距原理。
- 距离计算:根据相机内参和外参信息,结合上述几何关系公式,计算出物体的实际距离。
通过这种方式,即使是在单目条件下,也能够较为准确地估计物体的距离,为诸如自动驾驶等领域提供了有力支持。当然,在实际部署过程中还需要考虑更多因素,比如光照变化、物体遮挡等问题,以保证系统的稳定性和可靠性。
代码
def distance(self, k xw=5, yw=0.1):
print('\n','=' * 50)
print('开始测距')
fig = go.Figure()
#p外参矩阵, k内参矩阵
p, k = self.camera_parameters(self.excel_path)
if len(kuang):
obj_position = []
u, v, w, h = k1] * self.W, k[2] * self.H, k[3] * self.W, k4] * self.H
# u,v中心点坐标 w,h框宽和框高
print('中心点', u, v)
print('框宽/高', w, h)
d1 = self.object_point_world_position(u, v, w, h, p, k)
distance = 0
print('距离', d1)
if d1[0] <= 0:
d1[:] = 0
else:
distance = math.sqrt(math.pow(d1[0], 2) + math.pow(d1[1], 2))
标签:RKNN,物体,矩阵,相机,单目,self,测距
From: https://blog.csdn.net/qq1309399183/article/details/144850936