yolov8双目测距-yolov8+sgbm(原理+代码)

YOLOv8结合SGBM立体匹配算法进行双目测距的工作流程和原理主要包括以下几个核心步骤:

往期热门博客项目回顾:

计算机视觉项目大集合

改进的yolo目标检测-测距测速

路径规划算法

图像去雨去雾+目标检测+测距项目

交通标志识别项目

yolo系列-重磅yolov9界面-最新的yolo

姿态识别-3d姿态识别

深度学习小白学习路线

图像分类:

正文开始!!!!!!! 发车------------------>

双目测距基本原理:

双目测距是基于立体视觉技术,利用两个平行放置的摄像头捕捉同一场景的两幅稍有偏移的图像。通过比较两幅图像中相同物理点在左右相机图像上的像素坐标差异(视差),结合相机的基线长度和焦距信息,可以计算出相应点在三维空间中的深度信息。
在这里插入图片描述

SGBM(Semiglobal Block Matching)算法:

SGBM是OpenCV库中用于立体匹配的一种高效算法,它基于半全局匹配思想,在优化视差图的过程中考虑局部连续性和全局一致性。SGBM通过对左右图像块进行匹配,找出最优视差值,生成一个精确的视差图,这个视差图的每个像素值代表了该像素在三维空间中的深度信息。

工作流程:

  1. 相机标定

    • 使用棋盘格或者其他标定图案,对双目相机进行内外参数标定,获取相机的焦距、主点坐标、畸变系数以及两个相机之间的相对位置关系(旋转和平移矩阵)。
  2. 图像校正与同步

    • 分别从左右相机获取图像并对图像进行校正,消除镜头畸变。
    • 确保两幅图像的同步采集,以便后续的立体匹配。
  3. SGBM立体匹配

    • 应用SGBM算法对校正后的左右图像进行匹配,生成视差图。
      在这里插入图片描述
  4. 深度图计算

    • 根据视差图和已知的相机参数,通过三角测距原理计算出每个像素点对应的深度值,生成深度图。
  5. YOLOv8目标检测

    • 利用YOLOv8在左相机图像上进行目标检测,识别出图像中的物体位置及其边界框。
  6. 融合深度信息

    • 将YOLOv8检测到的目标边界框中心点或整个框范围内的深度信息提取出来,结合深度图的数据,计算出目标物体的精确距离。

结合应用场景:

  • 当YOLov8检测到某个目标物体时,可以在深度图中查找该物体所在区域的深度信息,进而确定目标物体相对于相机的距离。

通过以上流程,YOLOv8与SGBM立体匹配算法的结合实现了实时的深度感知和目标识别功能,广泛应用于自动驾驶、机器人导航、无人机避障等领域。

代码

import cv2
import numpy as np
import time
import random
import math

import shutil,os

from sgbm import YOLO
yolo = YOLO()
# 联系:qq1309399183

# -----------------------------------双目相机的基本参数---------------------------------------------------------
#   left_camera_matrix          左相机的内参矩阵
#   right_camera_matrix         右相机的内参矩阵
#
#   left_distortion             左相机的畸变系数    格式(K1,K2,P1,P2,0)
#   right_distortion            右相机的畸变系数
# -------------------------------------------------------------------------------------------------------------
# 左镜头的内参,如焦距
left_camera_matrix = np.array(  [[1.06265426e+03, 0.00000000e+00, 6.40549410e+02],
                                [0.00000000e+00, 1.06309321e+03, 4.90735489e+02],
                                [0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])

right_camera_matrix = np.array( [[1.06520238e+03, 0.00000000e+00, 6.14658394e+02],
                                [0.00000000e+00, 1.06445423e+03, 4.80741249e+02],
                                [0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])

# 畸变系数,K1、K2、K3为径向畸变,P1、P2为切向畸变
left_distortion = np.array([[-0.01085743, 0.17822576, -0.00781658, 0.00246898, -0.1378341 ]])
right_distortion = np.array([[-0.00601122, 0.19590039, -0.0077834, 0.00157652, -0.16437705]])

# 旋转矩阵
R = np.array(   [[ 9.99910187e-01, 1.78596734e-04, 1.34009873e-02],
                [-2.38730178e-04, 9.99989910e-01, 4.48577430e-03],
                [-1.34000510e-02, -4.48857064e-03, 9.99900141e-01]])
# 平移矩阵
T = np.array([-64.65432992,-0.2980873,3.76597753])


# size = (640, 480)
size = (1280, 720)

R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = cv2.stereoRectify(left_camera_matrix, left_distortion,
                                                                  right_camera_matrix, right_distortion, size, R,
                                                                  T)

# 校正查找映射表,将原始图像和校正后的图像上的点一一对应起来
left_map1, left_map2 = cv2.initUndistortRectifyMap(left_camera_matrix, left_distortion, R1, P1, size, cv2.CV_16SC2)
right_map1, right_map2 = cv2.initUndistortRectifyMap(right_camera_matrix, right_distortion, R2, P2, size, cv2.CV_16SC2)
# print(Q)


# 加载视频文件
video_path = './input/outdoor.mp4'
filename = video_path.split('/')[-1][:-4]

最后,计算机视觉、图像处理、毕业辅导、作业帮助、代码获取,私聊会回复! ↓↓↓↓↓↓↓↓↓↓↓↓

  • 29
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
很抱歉,由于YoloV5不是测距算法,因此没有针对双目测距的特定代码。但是可以使用OpenCV等工具来实现双目测距,以下是一个基本的示例代码: ```python import cv2 import numpy as np # 计算双目视差 def stereo_match(left_img, right_img): # 定义SGBM算法的一些参数 window_size = 3 left_matcher = cv2.StereoSGBM_create( minDisparity=0, numDisparities=160, blockSize=5, P1=8 * 3 * window_size ** 2, P2=32 * 3 * window_size ** 2, disp12MaxDiff=1, uniquenessRatio=10, speckleWindowSize=100, speckleRange=32, preFilterCap=63, mode=cv2.STEREO_SGBM_MODE_SGBM_3WAY ) right_matcher = cv2.ximgproc.createRightMatcher(left_matcher) # 计算视差图 left_gray = cv2.cvtColor(left_img, cv2.COLOR_BGR2GRAY) right_gray = cv2.cvtColor(right_img, cv2.COLOR_BGR2GRAY) left_disp = left_matcher.compute(left_gray, right_gray) right_disp = right_matcher.compute(right_gray, left_gray) wls_filter = cv2.ximgproc.createDisparityWLSFilter(left_matcher) wls_filter.setLambda(80000) wls_filter.setSigmaColor(1.2) disparity = wls_filter.filter(left_disp, left_gray, None, right_disp) # 将视差图转换为深度图 f = 0.8 # 焦距 T = 0.12 # 基线长度 depth = f * T / disparity return disparity, depth # 绘制深度图 def draw_depth_map(depth_map, min_depth=0, max_depth=10): depth_map = np.clip(depth_map, min_depth, max_depth) / max_depth depth_map = cv2.applyColorMap((depth_map * 255).astype(np.uint8), cv2.COLORMAP_JET) return depth_map # 读取左右相机图片 left_img = cv2.imread('left.jpg') right_img = cv2.imread('right.jpg') # 计算视差和深度图 disparity, depth_map = stereo_match(left_img, right_img) # 绘制深度图 depth_map = draw_depth_map(depth_map) cv2.imshow('depth map', depth_map) cv2.waitKey() cv2.destroyAllWindows() ``` 此代码使用SGBM算法计算视差,然后将视差图转换为深度图,最后绘制深度图。在此示例中,我们假设相机的焦距为0.8,基线长度为0.12。您可以根据您的相机参数进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿利同学

一角两角不嫌少

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

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

打赏作者

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

抵扣说明:

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

余额充值