YOLOv8结合SGBM立体匹配算法进行双目测距的工作流程和原理主要包括以下几个核心步骤:
往期热门博客项目回顾:
图像分类:
正文开始!!!!!!! 发车------------------>
双目测距基本原理:
双目测距是基于立体视觉技术,利用两个平行放置的摄像头捕捉同一场景的两幅稍有偏移的图像。通过比较两幅图像中相同物理点在左右相机图像上的像素坐标差异(视差),结合相机的基线长度和焦距信息,可以计算出相应点在三维空间中的深度信息。
SGBM(Semiglobal Block Matching)算法:
SGBM是OpenCV库中用于立体匹配的一种高效算法,它基于半全局匹配思想,在优化视差图的过程中考虑局部连续性和全局一致性。SGBM通过对左右图像块进行匹配,找出最优视差值,生成一个精确的视差图,这个视差图的每个像素值代表了该像素在三维空间中的深度信息。
工作流程:
-
相机标定:
- 使用棋盘格或者其他标定图案,对双目相机进行内外参数标定,获取相机的焦距、主点坐标、畸变系数以及两个相机之间的相对位置关系(旋转和平移矩阵)。
-
图像校正与同步:
- 分别从左右相机获取图像并对图像进行校正,消除镜头畸变。
- 确保两幅图像的同步采集,以便后续的立体匹配。
-
SGBM立体匹配:
- 应用SGBM算法对校正后的左右图像进行匹配,生成视差图。
- 应用SGBM算法对校正后的左右图像进行匹配,生成视差图。
-
深度图计算:
- 根据视差图和已知的相机参数,通过三角测距原理计算出每个像素点对应的深度值,生成深度图。
-
YOLOv8目标检测:
- 利用YOLOv8在左相机图像上进行目标检测,识别出图像中的物体位置及其边界框。
-
融合深度信息:
- 将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]