首页 > 编程语言 >yolov8双目测距(包含有前端的源码和无前端的源码Sgbm双目测距算法)-内含测距代码,视差图和深度图代码,以及极线矫正代码

yolov8双目测距(包含有前端的源码和无前端的源码Sgbm双目测距算法)-内含测距代码,视差图和深度图代码,以及极线矫正代码

时间:2024-08-19 18:58:07浏览次数:13  
标签:right calibration 代码 cv2 源码 params 视差 测距 left

  1. YOLOv8:YOLOv8 是一个目标检测模型,它是 YOLO(You Only Look Once)系列的一部分,用于实时物体检测。YOLOv8 能够快速准确地检测视频或图像中的对象。

  2. 双目测距:双目测距是指使用两个摄像头(或一个立体相机)从不同角度拍摄同一场景,通过比较两个摄像头捕捉到的图像差异来计算物体的距离。这里提到的 SGBM(Semi-Global Block Matching)算法是一种常用的双目匹配算法,用于计算视差图,进而得到深度图。

  3. 前端源码和无前端源码:前端源码通常指的是用于用户界面的部分,可能包括用于显示实时视频流、检测结果、测距结果等的图形用户界面(GUI)。无前端源码则仅包含后端处理逻辑,不包含任何用户界面部分。

  4. SGBM 双目测距算法:SGBM 算法用于计算两个摄像头捕捉到的图像之间的视差图。视差图反映了物体相对于摄像头的距离,距离越近的物体,视差越大;距离越远的物体,视差越小。

  5. 视差图和深度图:视差图是通过 SGBM 算法计算出来的,它表示每个像素点在两个摄像头中的位置差异。深度图则是从视差图计算得出的,它表示每个像素点对应的实际距离。

  6. 极线矫正:在双目视觉系统中,极线矫正(Epipolar Geometry Correction)是一种技术,用于确保两个摄像头捕捉到的图像在同一水平线上,这有助于简化后续的视差计算过程。

项目概述

这个项目可能包括以下几个组成部分:

  • YOLOv8 模块:负责检测视频或图像中的目标。
  • SGBM 算法模块:用于计算视差图,进而得到深度图。
  • 极线矫正模块:用于对齐两个摄像头的图像,简化视差计算。
  • 前端模块(可选):提供用户界面,用于显示视频流、检测结果和测距结果等。
  • 后端模块:处理视频流,执行目标检测和双目测距。

使用场景

  • 安防监控:通过检测和测量人员或物体的距离,可以提高监控系统的智能化水平。
  • 自动驾驶:用于识别道路上的障碍物及其距离,辅助车辆的导航和避障。
  • 人机交互:通过检测人体姿势和距离,可以实现更加自然的交互方式。

技术要点

  • YOLOv8:YOLOv8 是一个高效的实时目标检测模型,可以快速检测视频中的多个对象。
  • SGBM 算法:SGBM 算法是一种快速的双目匹配算法,适用于实时应用。
  • 极线矫正:通过极线矫正,可以保证两幅图像的对应点处于同一条直线上,简化视差计算过程。

环境准备

首先,确保安装了必要的库,如OpenCV、PyTorch等。可以使用以下命令安装:

pip install opencv-python-headless torch torchvision

1. 加载YOLOv8模型

加载YOLOv8模型并进行目标检测。

import cv2
import torch

def load_yolov8_model(model_path):
    model = torch.hub.load('ultralytics/yolov5', 'custom', path=model_path)
    return model

def detect_objects(frame, model):
    results = model(frame)
    boxes = results.xyxy[0].numpy()
    return boxes

2. 双目图像读取与预处理

读取双目摄像头的图像,并进行预处理。

def read_stereo_images(left_camera, right_camera):
    left_frame, _ = left_camera.read()
    right_frame, _ = right_camera.read()
    # 转换为灰度图像
    left_gray = cv2.cvtColor(left_frame, cv2.COLOR_BGR2GRAY)
    right_gray = cv2.cvtColor(right_frame, cv2.COLOR_BGR2GRAY)
    return left_gray, right_gray

3. 极线矫正

使用OpenCV进行极线矫正。

def stereo_rectify(left_gray, right_gray, calibration_params):
    # 根据标定参数进行极线矫正
    R1, R2, P1, P2, Q, _, _ = cv2.stereoRectify(
        calibration_params['camera_matrix_left'],
        calibration_params['dist_coeffs_left'],
        calibration_params['camera_matrix_right'],
        calibration_params['dist_coeffs_right'],
        calibration_params['image_size'],
        calibration_params['R'],
        calibration_params['T']
    )
    
    map1x, map1y = cv2.initUndistortRectifyMap(
        calibration_params['camera_matrix_left'],
        calibration_params['dist_coeffs_left'],
        R1, P1,
        calibration_params['image_size'],
        cv2.CV_16SC2
    )
    map2x, map2y = cv2.initUndistortRectifyMap(
        calibration_params['camera_matrix_right'],
        calibration_params['dist_coeffs_right'],
        R2, P2,
        calibration_params['image_size'],
        cv2.CV_16SC2
    )
    
    left_rectified = cv2.remap(left_gray, map1x, map1y, cv2.INTER_LANCZOS4)
    right_rectified = cv2.remap(right_gray, map2x, map2y, cv2.INTER_LANCZOS4)
    
    return left_rectified, right_rectified

4. SGBM双目测距

使用SGBM算法计算视差图和深度图。

def calculate_disparity(left_rectified, right_rectified):
    # 创建SGBM对象
    stereo = cv2.StereoSGBM_create(
        minDisparity=0,
        numDisparities=160,  # 必须是16的倍数
        blockSize=15,
        uniquenessRatio=1,
        speckleWindowSize=100,
        speckleRange=32,
        disp12MaxDiff=1
    )
    
    # 计算视差图
    disparity = stereo.compute(left_rectified, right_rectified).astype(np.float32) / 16.0
    
    return disparity

def calculate_depth(disparity, baseline, focal_length):
    # 计算深度图
    depth = (baseline * focal_length) / disparity
    return depth

5. 主函数

将以上组件整合在一起。

这个项目涉及的技术相对复杂,需要一定的编程基础和对相关算法的理解。

标签:right,calibration,代码,cv2,源码,params,视差,测距,left
From: https://blog.csdn.net/2401_83580557/article/details/141255313

相关文章

  • YOLOV5单目测距+车辆检测+车道线检测+行人检测(教程-代码)
     YOLOv5是一种高效的目标检测算法,结合其在单目测距、车辆检测、车道线检测和行人检测等领域的应用,可以实现多个重要任务的精确识别和定位。首先,YOLOv5可以用于单目测距。通过分析图像中的目标位置和尺寸信息,结合相机参数和几何关系,可以推断出目标与相机之间的距离。这对于......
  • 计算机视觉实战项目3(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人
     车辆跟踪及测距 该项目一个基于深度学习和目标跟踪算法的项目,主要用于实现视频中的目标检测和跟踪。该项目使用了YOLOv5目标检测算法和DeepSORT目标跟踪算法,以及一些辅助工具和库,可以帮助用户快速地在本地或者云端上实现视频目标检测和跟踪!教程博客_传送门链接-------......
  • C/C++语言基础--指针三大专题详解2(指针与数组关系,动态内存分配,代码均可)
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言指针是C/C++的灵魂,和内存地址相关联,运行的时候速度快,但是同时也有很多细节和规范要注意的,毕竟内存泄漏是很恐怖的指针打算分三篇文章进行讲解,本专题是二,介绍了指针和数组的关系、动态内存如何分配和释放等问题专题......
  • Java基础——HttpStatus.class 源码中状态码总结
    HttpStatus.class源码中状态码总结HttpStatus.class源码////Sourcecoderecreatedfroma.classfilebyIntelliJIDEA//(poweredbyFernFlowerdecompiler)//packageorg.springframework.http;importorg.springframework.lang.Nullable;publicenumH......
  • springboot基于微信小程序的4S店试驾平台(源码+文档+调试+讲解)
    收藏关注不迷路!!......
  • 「代码随想录算法训练营」第四十一天 | 单调栈 part1
    739.每日温度题目链接:https://leetcode.cn/problems/daily-temperatures/文章讲解:https://programmercarl.com/0739.每日温度.html题目难度:中等视频讲解:https://www.bilibili.com/video/BV1my4y1Z7jj/题目状态:看题解思路:定义一个单调栈,该栈存放下标,规则是要保持其下标对......
  • 通过代码添加的控件的事件如何编写?
    0背景这两天在重新复习事件,比如Winform控件的事件,利用vs很方便地实现。比如:想要在窗体加载时,修改窗口的标题;我们只需要双击Form1的标题栏即可;vs便会给我们生成如下代码,且光标自动定位到方法体中:privatevoidForm1_Load(objectsender,EventArgse){}然后我......
  • 【Java 并发编程】(四) ThreadLocal 源码解读
     介绍每个Thread对象,内部有一个ThreadLocalMapthreadLocals,这是一个哈希表,底层是一个Node[]table;当在某个线程中调用ThreadLocal的set方法时,会使用Thread.currentThread获取当前先线程的thread对象,然后将ThreadLocal对象作为key,将set方法的参数作为value......
  • HTML5服装电商网上商城模板源码
    文章目录1.设计来源1.1主界面1.2购物车界面1.3电子产品界面1.4商品详情界面1.5联系我们界面1.6各种标签演示界面2.效果和源码2.1动态效果2.2源代码源码下载万套模板,程序开发,在线开发,在线沟通         【博主推荐】:前些天发现了一个巨牛的人工智能......
  • 经典记忆卡片游戏html代码
    记忆卡片游戏是一款简单而富有挑战性的经典游戏,旨在锻炼玩家的记忆力和观察力。游戏通常由一组图案相同的卡片组成,玩家需要通过翻转卡片找到匹配的对。每当找到一对匹配的卡片时,玩家将获得一定的分数或奖励,游戏结束时,分数最高者获胜。无论是与朋友竞技,还是单独训练,这款游戏都适合......