基于YOLOv5+单目的物体距离和尺寸测量

本文介绍了YOLOv5的目标检测原理,并详细阐述了利用单目相机通过相似三角形法计算物体距离和尺寸的原理。通过实例展示了如何计算物体与相机的距离,以及如何反推出物体的实际尺寸。YOLOv5因其高速、高精度和易用性在目标检测领域表现出色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1,YOLOv5原理介绍

2,单目测尺寸以及距离原理

2.1单目测物体距离

2.2单目测物体尺寸

3,成果展示

3.3测距离

3.2测尺寸:


1,YOLOv5原理介绍

YOLOv5是目前应用广泛的目标检测算法之一,其主要结构分为两个部分:骨干网络和检测头。

骨干网络采用的是CSPDarknet53,这是一种基于Darknet框架的改进版卷积神经网络。CSPDarknet53通过使用残差结构和跨层连接来提高网络的表达能力,并且采用了空洞空间金字塔池化(ASPP)来实现多尺度的信息提取。这样设计的骨干网络具有较强的特征提取能力,可以有效地提取出图像中的目标信息。

检测头是YOLOv5的另一个关键组成部分,主要用于从骨干网络特征图中提取目标检测信息。它由三个子模块组成:SPP、PAN和YOLOv5输出层。

SPP模块:空洞空间金字塔池化模块,用于对特征图进行多尺度的池化和下采样操作,从而实现对不同大小的目标进行检测。

PAN模块:特征金字塔自上而下的路径,用于将不同层次的特征图融合在一起,并进行上采样操作,以便将低分辨率的特征图与高分辨

以下是YOLOv5+目测物体尺寸的步骤: 1.相关配置 首先,需要安装YOLOv5OpenCV库。可以使用以下命令安装: ```shell !git clone https://github.com/ultralytics/yolov5.git !pip install opencv-python ``` 2.测原理 目测是通过计算物体在图像上的像素大小实际物体大小之间的比例来实现的。这个比例可以通过相机标定来获得。 3.相机标定 相机标定是通过拍摄已知大小的物体来确定相机的内部参数外部参数。这里介绍两种标定方法。 3.1:标定方法1(针对图片) 首先,需要准备一组已知大小的棋盘格图片。然后,使用以下代码进行标定: ```python import numpy as np import cv2 # 准备棋盘格图片 objp = np.zeros((6*7, 3), np.float32) objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2) objpoints = [] # 存储物体点 imgpoints = [] # 存储图像点 images = glob.glob('*.jpg') # 图片路径 for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, (7, 6), None) if ret == True: objpoints.append(objp) imgpoints.append(corners) cv2.drawChessboardCorners(img, (7, 6), corners, ret) cv2.imshow('img', img) cv2.waitKey(500) cv2.destroyAllWindows() # 标定 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) ``` 3.2:标定方法2(针对视频) 首先,需要准备一段包含已知大小的棋盘格的视频。然后,使用以下代码进行标定: ```python import numpy as np import cv2 # 准备棋盘格图片 objp = np.zeros((6*7, 3), np.float32) objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2) objpoints = [] # 存储物体点 imgpoints = [] # 存储图像点 cap = cv2.VideoCapture('calibration_video.mp4') # 视频路径 while True: ret, frame = cap.read() if ret == True: gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, (7, 6), None) if ret == True: objpoints.append(objp) imgpoints.append(corners) cv2.drawChessboardCorners(frame, (7, 6), corners, ret) cv2.imshow('frame', frame) cv2.waitKey(500) else: break cv2.destroyAllWindows() # 标定 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) ``` 4.相机测 4.1 测添加 在YOLOv5的detect.py文件中添加以下代码: ```python def get_distance(bbox, focal_length): # 计算物体在图像上的像素大小 pixel_width = bbox[2] - bbox[0] pixel_height = bbox[3] - bbox[1] pixel_size = (pixel_width + pixel_height) / 2 # 计算物体在实际世界中的大小 real_size =
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今夕是何年,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值