作者:禅与计算机程序设计艺术
近年来,随着激光雷达、相机等传感器的广泛应用,三维重建技术逐渐成为热门研究方向。三维重建技术可以从多种角度帮助我们理解世界,并进行精准定位、建筑物三维模型化、环境规划、自然现象研究以及各种各样的应用。 但由于三维重建技术的复杂性和多样性,很难给出一个通用的、可行的、完整的解决方案。因此,本文将简要介绍一下如何利用激光雷达、相机进行三维重建技术的基本流程,然后结合具体的代码实例对这一流程进行具体地阐述。
首先,激光雷达与相机分别由哪些参数决定了三维重建结果?其次,如何通过互补信息增强三维重建结果的精确度?最后,如果没有有效的校正或处理,三维重建结果会受到什么影响?本文将分别对以上三个问题进行回答。
2.基本概念术语说明
2.1激光雷达与相机参数
激光雷达包括两种类型,为偶极子阵列(Active Radar)与超声波阵列(Ultrasound)。其采集到的信号具有不同的特性,激光雷达采用矩形脉冲传输系统(Radar Antenna Pattern),超声波阵列则采用方形波束(Square Wave Beam)。激光雷达与相机参数如下图所示:
参数名称 | 描述 |
---|---|
激光频率 | 激光频率是指激光能量的变化速度。通常按照毫米波、红外线波、可见光波、INFRA-Red波以及可调焦段波等标准定义。 |
探测距离 | 激光雷达探测距离越远,性能越高,但是信号不易被其他物体接收;相机也需要相同的距离才能捕捉到相同的图像。 |
视场角 | 表示相机能够拍摄的垂直范围。例如,普通镜头的视场角约为60°,超广角镜头的视场角可以达到90°。 |
分辨率 | 表示成像设备能显示的最小单位。通常在摄影中,分辨率通常用英寸作为单位,如照相机的ISO100、ISO200、F1.8等表示不同分辨率下的曝光时间、白平衡等参数。 |
抗辐射 | 指激光雷达或者相机产生的辐射对被检测目标造成的抵抗能力。常见的辐射包括红外辐射、可见光辐射、微弱外界辐射等。 |
曝光时间 | 是指一张图片被成像设备持续曝光的时间。一般情况下,高光学图像由于聚焦时间长,会存在噪声,因而分辨率越高,则可控曝光时间就越短,所以一般认为“优先保证分辨率”。 |
快门速度 | 是指相机设备按下快门按钮时拍摄图像的速度,单位为秒/100英寸。通常来说,电动相机的快门速度为20秒/100英寸,静止相机的快门速度为1/30秒/秒。 |
幅度 | 表示激光雷达或相机的最大可测量距离。对于激光雷达,其长度通常为几毫米至几厘米,宽度为几毫米至几厘米;对于相机,其所能捕捉到的最短光线长度为几毫米至几厘米。 |
角度 | 用于描述激光雷达或相机的扫描方向。对于激光雷达,扫描角度是指激光束在水平面上扫过的角度,通常是180度。对于相机,扫视方向一般是固定的。 |
全景角度 | 由于激光雷达或相机的视野范围是球形或椭圆形,因此无法形成一个全局的立体效果,只能看到局部区域。全景角度就是为了得到更加细致的全局环境信息。 |
2.2三维重建相关术语
2.2.1相机坐标系
三维重建过程中,激光雷达和相机都采用三维坐标系,即以某点为原点建立局部坐标系,该局部坐标系的X轴、Y轴、Z轴分别代表该点处在图像坐标系的什么位置,以此类推,局部坐标系到世界坐标系的转换矩阵为R(Rotation),T(Translation)。
2.2.2激光雷达坐标系
激光雷达在三维重建过程中扮演角色,它也需要由一个坐标系来进行描述。激光雷达坐标系采用笛卡尔坐标系,它的X轴朝向前方,Y轴朝向右方,Z轴朝向上方,所有的物体都是以这个坐标系为参考的。
2.2.3相机投影矩阵
激光雷达和相机在三维重建过程中,经历了图像和激光数据两个过程。首先,激光雷达在某个时刻观察到一组激光束,然后将这些激光束投射到相机面前形成一副图像。之后,相机将图像转化为像素,并根据相机内参计算出每一像素对应的激光束的深度值。
但在投影的过程中,由于激光束经过障碍物、环境等因素反射后可能与真实距离差距较远,因此,将激光束投射到像素上时,有可能会出现像素到激光束的映射关系。这时,就需要用到投影矩阵P,它是一个投影关系矩阵,用来将激光数据投影到像素上。
2.2.4视差映射
对于相机视野很小或者不可导导致的失焦现象,可以通过视差映射技术进行修复。视差映射是在原始图像与修正后的图像之间建立一对一映射关系的过程。当把原始图像上某一点的像素值映射到修正后的图像上时,映射值可以使得两者之间的特征点匹配程度更好。
2.2.5配准问题
因为激光雷达和相机存在漂移和旋转等偏移情况,所以三维重建过程中还需考虑配准问题。配准问题主要是指激光雷达坐标系到相机坐标系的转换。
目前,常见的三维重建配准方法有几何重配准法、变换重配准法、优化重配准法。几何重配准法主要采用闭环控制法,先估计激光雷达与相机初始位置的误差,然后通过闭环控制法确定激光雷达与相机的正确位置及姿态。变换重配准法也属于闭环控制法,不同之处是不需要估计初始位置的误差,直接根据已知的激光雷达与相机运动关系、摄像机内参、环境光流等计算相机坐标系与激光雷达坐标系的转换关系。优化重配准法则是一种非闭环控制法,优化重配准法通过找寻初始位置的最小二乘解,通过迭代的方式寻找最优解,找到最佳的激光雷达与相机的配准关系。
3.核心算法原理和具体操作步骤以及数学公式讲解
3.1计算相机投影矩阵P
为了完成三维重建的第一步——投影,需要计算出相机投影矩阵P。假设激光雷达的位置坐标为s=[x s]T,激光雷达到相机的距离为d,激光雷datera人坐标系的方向向量为r=[rx ry rz]^T,则相机投影矩阵P为:
P = K [R; -Rr^T]
其中,K为相机内参矩阵,[Rx Ry Rz]为相机坐标系在激光雷达坐标系的旋转矩阵,[-Rr^T]为相机坐标系到激光雷达坐标系的转换矩阵,Rr=Rr^T。
3.2从图像中提取特征点
为了计算出三维重建的第二步——特征提取,需要从图像中提取特征点。图像特征提取的方法有Harris、SIFT等。这里,我们以Harris算法为例,来讲解特征点的提取过程。
假设一副图像大小为W*H,每个像素点的灰度值记作G,且每个像素点的坐标为uv=[u v]T。Harris算法的基本思路是通过计算像素梯度的二阶导数来检测角点。具体地,假设邻域窗口为W×W,则其梯度I=[∂Gx, ∂Gy]=[I1 I2],图像梯度的二阶导数IxIy=[∂^2Ix, ∂^2Iy]=∑(∂Ix)^2+(∂Iy)^2。
用以下公式来计算每个像素的二阶梯度幅值:
R=det((Ix)^2 (Iy)^2)-tr((Ix)(Iy))^2 / ((Ix)^2 + (Iy)^2)^2
然后,根据阈值确定每个角点的响应值,只保留响应值高于阈值的特征点,将它们纳入最终的特征点集合。
3.3计算深度
假设已知若干个特征点,每个特征点有一个深度值D。那么,已知每个点的深度值,就可以得到整个图像的三维点云。
如果已知相机投影矩阵P、图像内参矩阵K、相机坐标系到激光雷达坐标系的转换矩阵R、激光雷达到相机的距离d和图像中所有角点的位置,则可以使用深度映射法来计算每个像素的深度值。具体地,假设一副图像的大小为W*H,每个像素的坐标为uv,则其投影坐标为p=[px py]T,则可以得到:
depth = p' * P'/d
其中,P'为投影矩阵P的逆矩阵,p'=[px']/[(px+π)^2+(py+π)^2]^{1/2}=[px' py']T。
3.4获取三维点云
假设已知每个点的深度值,即可构造出三维点云。
不过,因为实际环境中的真实物体往往不是完美的平面形状,所以,三维点云通常是包含着许多不规则的结构。为了解决这一问题,通常采用像素级的法向量法或激光法来进行修复。
3.5基于视差的三维点云修复
因为激光雷达的视野范围较小,所以可能导致相机在某些场景下失焦或被遮挡。在这种情况下,可以通过视差映射技术恢复缺失的区域。
假设一副图像的大小为W*H,设定两个点的图像坐标分别为uv1=(u1 v1)T和uv2=(u2 v2)T,则可以在uv1和uv2之间建立一对一的映射关系,即可以用两点之间的数据作为差值。
假设两点的位置误差和视差误差的相关系数为ρ,则可以通过估计出每个像素的差值:
Δθ = ρ * Δz / d
然后,通过差值差积分拟合出缺失区域的深度。文章来源:https://www.toymoban.com/news/detail-842272.html
4.具体代码实例和解释说明
4.1代码示例
这里给出使用Matlab语言进行三维重建的具体代码示例,该示例使用一个Matlab开源项目baka-cv实现了基于激光雷达与相机的三维重建。该项目中提供了常见的激光雷达和相机的内参、标定、标定误差的评价等功能。文章来源地址https://www.toymoban.com/news/detail-842272.html
% 导入样例图像
img = imread('example.jpg');
% 加载激光雷达的内参矩阵、激光到相机的距离d
K = [...]; % (3,3)
d =...;
% 计算相机投影矩阵P
[cx cy fx fy] = size(img);
u0 = cx/(fx+fy)/2; % 假设相机坐标系原点重合图像中心
v0 = cy/(fx+fy)/2; % 假设相机坐标系原点重合图像中心
[R, T] = lookat([0, 0, d], 'xz', [u0, v0]); % 以图像中心为焦点
P = K * [R; -R'*T'];
% 计算图像点云
points = getPointCloudFromImage(img, P, K, d, 'threshold', 1e-4);
% 可视化三维点云
view(points(:, :), 'xzy')
% 三维重建结果精度评价
errors = evaluateCalibrationErrors(K, d, points);
disp(['RANSAC Reprojection Error:', num2str(mean(errors))])
到了这里,关于计算机视觉中的三维重建:基于激光雷达与相机的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!