前言
本文主要讲解如何基于单目相机的图像数据恢复图像中特定目标的深度信息,进而完成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.算法整体流程
后期补