单目ADAS系列教程-深度估计

本文探讨了如何利用单目相机图像数据恢复目标深度信息,以实现ADAS的碰撞预警功能,如车辆、行人和车道线预警。通过相机内参和地面高度,可以计算目标的绝对距离。在Kitti数据集上的实测显示,这种方法能有效恢复目标深度,尽管与激光雷达相比存在约1米的误差,但已满足预警需求。
摘要由CSDN通过智能技术生成

前言

本文主要讲解如何基于单目相机的图像数据恢复图像中特定目标的深度信息,进而完成ADAS中的预警功能。具体的,包括车辆碰撞预警,行人碰撞预警,车道线偏离预警。
PS:本文只针对针孔相机,其余类型相机不做讨论!

1.深度恢复理论基础

在上一篇文章《单目ADAS系列教程-相机基础篇》中已经讲解了相机相关的四大坐标系,通过一个简单的矩阵运算即可将像素坐标恢复到相机坐标系下,即测量出图像中某个目标与相机之间的距离,公式如下:
ps:fx,fy,cx,cy为相机内参,标定一次后通常不会发生变化
在这里插入图片描述
但是此时恢复的距离为相对距离,不包含尺度信息(假设测出来的Xc值为5.5,但并不知道是5.5米,还是5.5厘米),即Zc未知,因此我们需要考虑如何求出Zc,恢复目标的绝对距离。
在算法实际应用环境中,待测目标为车辆、行人、车道线,这三者均在地面上(借助目标检测算法如yolo系列,检测目标的坐标[u,v]),这意味着相机安装固定后与目标的高度相对固定了,根据相机与地面的高度这一绝对尺度信息,即可恢复出目标的绝对距离(即求出Zc)。

2.深度恢复实测

测试数据为kitti,提供完整的相机的内参、相机高度,并且还包含深度数据
在这里插入图片描述
代码实例:

# -*- coding: utf-8 -*-
import numpy as np

camera_ground_height = 1.65     # 相机与地面的高度(米)
Fx = 721.5377                   # 相机内参
Fy = 721.5377
Cx = 596.5593
Cy = 149.854

# 车轮处的像素坐标,目标检测算法能够完成
image_point = np.matrix([[593], [195], [1]], dtype="float")

camera_k_matrix = np.matrix([[Fx, 0, Cx], [0, Fy, Cy], [0, 0, 1]], dtype="float")
camera_k_matrix_intrinsic = camera_k_matrix.I
print("不包含尺度信息的坐标:")
camera_point = camera_k_matrix_intrinsic * image_point

print(camera_point)

Zc = camera_ground_height / camera_point[1][0]
print("Xc:", camera_point[0][0] * Zc)
print("Yc:", camera_point[1][0] * Zc)
print("Zc:", camera_point[2][0] * Zc)

测距结果,Zc=26.37米表示目标深度距离信息
在这里插入图片描述

对比激光雷达测距27米,有接近1米的误差,用于预警完全足够!
在这里插入图片描述

3.测距误差校正方法

后期补

4.算法整体流程

后期补

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值