机器人原理与实践单目摄像头标定与单目测距

Posted 与光同程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器人原理与实践单目摄像头标定与单目测距相关的知识,希望对你有一定的参考价值。

摄像头标定

我们可以想到在单目测量中我们在图像中找到某个目标以后可以获得的是一组像素的坐标,对于这样的一组像素并没有与实际空间中的转换关系,所以我们使用视觉传感的第一步就是尝试进行视觉标定,将图像中的坐标转换为实际的坐标。

摄像机标定(Camera calibration)简单来说是从世界坐标系转换为相机坐标系,再由相机坐标系转换为图像坐标系的过程,也就是求最终的投影矩阵的过程。即:世界坐标系 --> 相机坐标系 --> 图像坐标系 --> 像素坐标系
世界坐标系(world coordinate system):用户定义的三维世界的坐标系,为了描述目标物在真实世界里的位置而被引入,单位为m。
相机坐标系(camera coordinate system):在相机上建立的坐标系,为了从相机的角度描述物体位置而定义,作为连通世界坐标系和图像/像素坐标系的中间一环。单位为m。
图像坐标系(image coordinate system):为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标,单位为m。
像素坐标系(pixel coordinate system):为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系。单位为个(像素数目)。

4.1 单目相机的建模

4.1.1 图像坐标系到像素坐标系的转换

像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点。图像坐标系的单位为mm,属于物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。所以这两者之间的转换如下:其中dx和dy表示每一列和每一行分别代表多少mm,点(u,v)为像素坐标系上的点,对应的图像坐标系上的点为(x,y)。

4.1.2相机坐标系到图像坐标系的转换

设内参矩阵 K,相机坐标系 Q(Xc,Yc,Zc),投影图像坐标系 q ( x , y )。

4.1.3 合并矩阵

分析这个公式,我们发现当我们知道世界坐标求解这个坐标在图片上的位置是一定可以求解出来的,但是当你获取到了图像上的坐标要求解这个位置在实际的坐标的时候,就会求不出来。这个就是没有深度信息的原因。这个时候我们需要建立一个模型,基于摄像头在显示中的位置,和主要的成像位置,可以直接通过像素算出距离信息。

4.2 固定向下摄像头标定

从上面的计算公式我们不难发现,在已知u,v的情况下,我们实际上是无法得出所在的位置相对于摄像头的坐标的,这是因为我们在某些情况下是必较难以获取所在位置的深度。简单的说就是单独的一个摄像头无法在不结合外部信息的情况下直接获取三维信息。在这种情况下可以有一种较为简单的方法,就是固定Z信息,就是对于图像上每一个点所有对应的Z都是固定的并且是已知的。


固定向下的矩阵计算是基于相机标定的一种特殊情况:

下面演示通过九点标定法,获取相机的矩阵:
1.准备好一张标定板,里面有3X3的圆。

2.对于所有的中心点记录所有的像素坐标和实际坐标
[-190,70,1],
[-180,10,1],
[-180,-70,1],
[-140,80,1],
[-140,10,1],
[-150,-140,1]]

[[324,331,1],
[578,296,1],
[958,331,1],
[210,115,1],
[587,133,1],
[1096,132,1]]
3.通过求解矩阵方程,获取转化矩阵
正常求解的话只需要三组点,也可以使用SVD分解法,这个时候需要六个点
采用SVD分解法求解矩阵方程

res,X=cv2.solve(A, B,flags= cv2.SVD_FULL_UV)

在这种情况下可以得到一个3X3的转换矩阵,基于这样的一个矩阵,在已知u,v像素坐标
的情况下可以计算出世界坐标。

4.3 俯视摄像头标定

[6]对于上面的情况摄像头需要保持一个固定高度,在一些情况下不是非常方便,还有一种其实类似的情况就是当摄像头只是保持一个角度俯视,而不是固定平行向下,这个时候的标定就涉及到根据现实情况计算Z,这就涉及到了一个单目摄像头测距的问题。

目标:输入一个像素坐标点,然后计算出该像素点实际位置距离摄像头水平距离和垂直距离,即实现了单目摄像头测距
摄像头固定角度,倾斜照射到地面,先不考虑镜头畸变

需要提前测得的量:
H:摄像头高度
Dmin:图像底边距摄像头实际距离
Dmax:图像顶边距摄像头实际距离
图像像素高度:480
图像像素宽度:600
输入:
X0:要测量的点的像素X坐标
Y0:要测量的点的像素Y坐标
输出:
X1:该点距摄像头的水平距离
Y1:该点距摄像头的垂直距离

算出Z以后使用标定好的矩阵直接计算也可以通过像素坐标计算实际坐标。

4.4 本章小结

本章分析了摄像头的成像原理,成像原理与小孔成像的原理是一样的。分析出像素坐标,摄像头坐标,世界坐标的转换关系。基于单目摄像头不能获取深度信息,我们通过两种模式:分别是固定向下和俯视向下的现实模型先计算出深度信息,然后通过标定矩阵,构建像素坐标与世界坐标之间的关系。

以上是关于机器人原理与实践单目摄像头标定与单目测距的主要内容,如果未能解决你的问题,请参考以下文章

单目相机测距

ROS+opencv实践-USB单目相机实现标定

opencv 单目相机pnp测距(Cpp)

C++利用opencv实现单目测距

双目三维重建系统(双目标定+立体校正+双目测距+点云显示)Python

双目三维重建系统(双目标定+立体校正+双目测距+点云显示)Python