基于目标检测的实时单目测距

最近在做目标检测及测距,总结一下。

单目摄像头的大致测距原理,是先通过图像匹配进行目标识别(各种车型、行人、物体等),再通过目标在图像中的大小去估算目标距离。


环视测距

特点:鱼眼镜头畸变矫正较大,环视相机一般用于低速场景,主要用于检测地面标识,所以相机镜头朝下

前视相机测距

特点:前视镜头畸变较小,相机安装位置为车后视镜下方,可应用于低速、高速场景,用于检测前方车辆、行人、障碍物等,所以相机镜头朝前

测距方案比较:

环视鱼眼相机因为镜头朝下,且畸变系数大,基于相机模型,采用数学几何的方式进行测距不再试用,会造成误差较大;采用的是基于单应性矩阵和仿射变换的思路来进行测距。核心知识点是得到畸变校正图的四个点和自定义图片四个点对应的单应性矩阵求解,与标定的准确性极为相关。

前视相机为普通的畸变较小的相机,可以基于相机模型,推导出像素坐标和世界坐标之间的关系即可。下面的推导过程是基于前视相机的单目测距过程。

两种方案的前提是都是基于地面假设的前提,因为单个摄像头失去了空间信息。

  1. 将单目视觉系统简化为摄像机投影模型;
  2. 几何关系推导建立测距模型,获得图像坐标与世界坐标系之间的转换关系。 (畸变矫正模型,主要的两个调用函数)
    cv::fisheye::initUndistortRectifyMap(camera_kMatrix, camera_distortMatrix, R, getOptimalNewCameraMatrix(camera_kMatrix, camera_distortMatrix, image_size, 1, image_size, 0), image_size, CV_32FC1, mapx, mapy);

cv::remap(imgRaw, imgUndistort, mapx, mapy, INTER_LINEAR); //图片重映射 就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。

//imgRaw输入畸变的原始图像; imgRectify矫正后的输出图像,跟输入图像具有相同的类型和大小; map1和第四个参数map2X坐标和Y坐标的映射; interpolation定义图像的插值方式; borderMode定义边界填充方式;

3.实现距离测算。

测距步骤

  1. 使用摄像机采集道路前方的图像;
  2. 在道路区域对物体进行检测,通过矩形框将物体形状框出来。(SSD目标物体检测,调用c++接口)
  3. 结合矩形框信息,找到该矩形框底边的两个像平面坐标,分别记为(u1,v1)和(u2,v2);(opencv自带函数,输出矩形框像素点坐标)
  4. 使用几何关系推导法,由像平面坐标点(u1, v1)、(u2, v2)推导出道路平面坐标(x1,y1)、(x2, y2);(投影到地面上,z轴为0)
  5. 通过欧氏距离公式计算出d。

难点整理:

1.图像畸变矫正模型的理解;

(标定参数,内参矩阵,畸变矩阵,外参矩阵(平移、旋转向量矩阵))

2.像素坐标与世界坐标公式的推导 及验证;

3.测距方法,对于检测物体在摄像头前方、左侧、右侧的判别思路

4.弄清反畸变;对于畸变矫正后的图像中的检测框中的点进行反畸变处理。

5.目标检测网络ssd的c++接口使用。

相机镜头畸变矫正、目标检测(ssd)、测距

相机镜头畸变矫正-->得到相机的内外参数、畸变参数矩阵

  1. 外参数矩阵。世界坐标经过旋转和平移,然后落到另一个现实世界点(摄像机坐标)上。
  2. 内参数矩阵。告诉你上述那个点在1的基础上,是如何继续经过摄像机的镜头、并通过针孔成像和电子转化而成为像素点的。

3. 畸变矩阵。告诉你为什么上面那个像素点并没有落在理论计算该落在的位置上,还产生了一定的偏移和变形.

好了,到这里是不是明白了一点?上述3点的每一个转换,都有已经有成熟的数学描述,通过计算:

图像坐标系:

理想的图像坐标系原点O1和真实的O0有一定的偏差,由此我们建立了等式(1)和(2),可以用矩阵形式(3)表示。

相机坐标系(C)和世界坐标系(W):

通过相机与图像的投影关系,我们得到了等式(4)和等式(5),可以用矩阵形式(6)表示。我们又知道相机坐标系和世界坐标的关系可以用等式(7)表示:

由等式(3),等式(6)和等式(7)我们可以推导出图像坐标系和世界坐标系的关系:

其中M1称为相机的内参矩阵,包含内参(fx,fy,u0,v0)。M2称为相机的外参矩阵,包含外参(R:旋转矩阵,T:平移矩阵)。

编辑于 2019-08-21

文章被以下专栏收录