在自动化系统中,深度学习和计算机视觉已经变得非常流行和无处不在。计算机视觉领域在过去十年中发展迅速,尤其是在障碍物检测领域。障碍物检测算法,例如YOLO或RetinaNet,提供了一个2D注释框,指示图像中障碍物的位置。为了获得到每个障碍物的距离,工程师将摄像头与激光雷达(光探测和测距)传感器融合在一起,该传感器使用激光返回深度信息。计算机视觉和激光雷达的输出使用传感器融合技术融合在一起。以这种方式使用激光雷达存在价格昂贵的问题。工程师为此使用的一个有用技巧是对齐两个摄像头并使用几何原理计算到每个障碍物的距离。我们称这种新设置为伪激光雷达。单目视觉和立体视觉伪激光雷达利用几何原理构造深度图,并结合物体检测得到三维距离。如何使用立体视觉实现距离估计?以下5步伪代码用于获取距离:校准2个相机(内部和外部校准)创建极线方案首先构建视差图,然后构建深度图然后,深度图将与障碍物检测算法相结合,我们将估计边界框像素的深度。更多内容在本文末尾。让我们开始吧!1.内部和外部校准每个相机都需要校准。校准意味着将具有[X,Y,Z]坐标的3D点(在世界中)转换为具有[X,Y]坐标的2D像素。相机模型今天的相机使用针孔相机模型。这个想法是使用针孔让少量光线通过相机,从而产生清晰的图像。如果图像中间没有障碍物,每条光线都会穿过,图像就会模糊。它还允许我们确定变焦和更好锐度的焦距f。为了校准相机,我们需要通过相机坐标将世界坐标转换为像素坐标。相机标定过程从世界坐标到相机坐标的转换称为外部标定。外部参数称为R(旋转矩阵)和T(平移矩阵)。从相机坐标到像素坐标的转换称为内部校准。它取的是相机的焦距、光心等内在参数,内参就是我们称之为K的矩阵。CalibratedCameraCalibration可以找到K矩阵。通常,我们使用棋盘和自动算法来执行它。当我们这样做时,我们告诉算法棋盘上的一个点(例如:0,0,0)对应于图像中的一个像素(例如:545、343)。校准示例为此,我们必须用相机拍摄棋盘图像,在经过一些图像和一些点后,校准算法将通过最小化最小二乘损失来确定相机的校准矩阵。通常,校准对于消除图像失真是必要的。针孔相机模型包括变形,即“GoPro效果”。为了获得校正后的图像,必须执行校准。变形可以是径向的或切向的。校准有助于保持图像不失真。图像校准这是相机校准返回的矩阵:f是焦距-(u?,v?)是光学中心:这些是固有参数。每个计算机视觉工程师都必须了解和掌握相机标定。这是最基本也是最重要的要求。我们习惯于在线处理图像,从不接触硬件,这是一个错误。-尝试运行OpenCV进行相机校准。同类坐标在相机校准过程中,我们有两个公式在世界像素空间中创建一个点O:equation:worldtoimageconversion如果您查看矩阵维度,则完整公式不匹配。因此,我们需要将O_world从[XYZ]修改为[XYZ1]。这个“1”被称为齐次坐标。2.PolarGeometry-StereoVision立体视觉是基于两个图像来寻找深度。我们的眼睛就像两个照相机。因为他们从不同的角度看同一张图片,所以他们可以比较两个视图之间的差异并计算出距离估计值。以下是立体相机设置的示例。你会在大多数自动驾驶汽车上找到类似的东西。立体相机如何估计深度假设您有两台相机,一左一右。两个相机在相同的Y轴和Z轴上对齐。基本上,唯一的区别是它们具有不同的X值。现在,看看下面的描述。StereoCameraDiagram我们的目标是估计O点(代表图像中的任意像素点)的Z值,也就是深度距离。X是对齐轴;Y是高度;Z为深度;两个蓝色平面对应于两个相机的图像。现在从鸟瞰的角度考虑这一点。立体相机鸟瞰图说明:xL对应左相机光心,xR对应右相机光心。b是基线,即两个相机之间的距离。如果你应用泰利斯定理,你会发现我们可以得到左相机的两个方程:左相机方程?我们得到Z=X*f/xL。对于右相机:右相机方程:?我们得到Z=(X—b)*f/xR。放在一起,我们可以找到正确的视差d=xL--xR和目标的正确XYZ坐标。3.视差与深度图什么是视差?视差是来自两个不同摄像机角度的图像中3D点位置的差异。立体视觉公式?从立体视觉我们可以估计任何物体的深度。假设我们做了正确的矩阵校准。它甚至可以计算深度图或视差图。为什么视差图是“基线几何”?要计算视差,我们必须找到左图中的每个像素并将其与右图中的每个像素匹配。这称为立体对应问题。要解决这个问题——现在在左图中取一个像素。要在正确的图像中找到这个像素,只需在基线上搜索它。不需要二维搜索,点应该位于这条线上,搜索范围缩小到一维。基线这是因为两个相机沿同一轴对齐。基线搜索的工作原理如下:基线搜索应用:构建伪LiDAR现在,是时候将这些应用到真实世界的场景中,看看我们如何使用立体视觉来估计物体的深度。考虑两幅图像——立体视觉每幅图像都有外部参数R和t,它们是通过校准预先确定的(步骤1)。视差对于每幅图像,我们可以计算相对于另一幅图像的视差图。我们将执行以下操作:确定两个图像之间的差异。投影矩阵被分解为相机的内在矩阵K和外在矩阵R,t。使用我们在前两个步骤中收集的数据来估计深度。我们将获得左右图像的视差图。为了帮助您更好地理解差异的含义,我在StackOverflow上找到了很好的解释。视差图是指一对立体图像之间明显的像素差异或运动。要体验这一点,请尝试快速闭上一只眼睛,同时睁开另一只眼睛。离你很近的物体看起来会跳很远的距离,而离你很远的物体几乎不会移动。这种运动是视差的。在立体相机的一对图像中,您可以测量每个点的视运动像素,并根据测量结果制作强度图像。从视差到深度图?我们有两张视差图,基本上可以告诉我们两幅图像之间的像素位移是多少。每个摄像机都有一个投影矩阵P_left和P_right。为了估计深度,我们需要估计K、R和t。世界坐标系到相机坐标系的转换一个名为cv2.decomposeProjectionMatrix()的OpenCV函数执行此操作并从P获取K、R和t;对于每个相机,现在是生成深度图的时候了。深度图将使用其他图像和视差图来告诉我们图像中每个像素的距离。过程如下:从矩阵K中得到焦距f;使用变换向量t中的对应值计算基线?;使用前面的公式和视差图d计算图像的深度图;我们为每个像素计算的立体视觉公式。估计障碍物的深度对于每个相机,我们都有一个深度图!现在,假设我们将其与YOLO等障碍物检测算法相结合。对于每个障碍物,该算法返回一个包含4个数字的边界框:[x1;y1;x2;y2]。这些数字代表框的左上角和右下角的坐标。例如,我们可以在左边的图像上运行算法并使用左边的深度图。现在,在这个边界框内,我们可以取最近的点。我们知道它是因为我们知道图像中每个点的距离。边界框中的第一个点是我们到障碍物的距离。极好的!我们刚刚建立了伪激光雷达!多亏了立体视觉,我们不仅知道图像中的障碍物,还知道它们离我们的距离!这个障碍物离我们有28.927米!立体视觉是一种简单的几何形状和一个额外的摄像头将2D障碍物检测转换为3D障碍物检测技术。如今,大多数新兴边缘平台都考虑了立体视觉,例如新的OpenCVAI套件或Raspberry和NvidiaJetson卡的集成。在成本方面,与使用LiDAR相比,它仍然相对便宜,并且仍然提供出色的性能。我们称它为伪激光雷达,因为它可以替代激光雷达的功能。检测障碍物,对其进行分类,并在3D中对其进行定位。本文转载自雷锋网。如需转载,请在雷锋网官网申请授权。
