OpenCV与AI深度学习 | 使用单相机对已知物体进行3D位置估计

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。

原文链接:使用单相机对已知物体进行3D位置估计

0 导  读

        本文主要介绍如何使用单个相机对已知物体进行3D位置估计,并给出实现步骤。  

1 前 言

        在计算机视觉中,有很多方法可以找到物体的3D位置,例如使用立体摄像头、激光雷达、雷达等。但有时仅用单个摄像头就可以实现3D感知。使用单相机找到3D位置的一个条件是,需要知道图片中需要估计位置的物体的大小。请记住,当对象的方向发生变化时,图片中的对象可能会具有不同的大小。在本文中,为了避免这种需要我们了解对象方向的复杂性,我们将尝试估计球的 3D 位置。因为一个球,无论从任何方向看,都具有相同的大小。

下面是它的工作原理:

  • 我们计算Camera坐标系中的3D世界与图像中的2D像素坐标之间的关系。此步骤称为相机标定,更具体地说是内参计算
  • 然后我们使用对象分割算法来找到感兴趣的对象。
  • 接下来测量物体的大小。
  • 我们使用步骤 1 中获得的内部参数,使用对象的大小和对象中心的像素位置来估计3D位置。

本文将涵盖理解该算法所需的基本背景知识并解释该算法。      

2 原理与步骤

2.1 相机坐标系

        相机坐标系是一个3D笛卡尔坐标系,原点位于相机的焦点处,Z轴是相机的光轴。这用于了解3D中对象相对于相机位置的位置。

2.2 像素坐标

像素坐标就是图像中每个像素从左上角开始的位置。

2.3 相机标定

        相机标定是理解相机的内部参数和外部参数的过程。简单地说,外部参数告诉我们世界上给定的3D坐标系与相机位置之间的关系,而内部参数告诉我们物体的3D坐标与相机捕获的图像的2D像素坐标之间的关系。

        我们将只关注相机的内部参数。下面的方程将帮助您从数学上理解内在参数。

    X、Y、Z 值是现实世界中一点的笛卡尔坐标,相机位于原点,Z 轴与相机光轴共线。

2.4 对焦参数

        fx 和 fy 是 x 轴和 y 轴上的焦点(以像素为单位)。在针孔相机模型中,焦点以距离为单位,并且 x 轴和 y 轴上的焦点相同。但在数码相机中,由于相机传感器的尺寸和镜头引起的畸变等因素,x 轴和 y 轴的焦点并不总是相同。

    这是一个理解“像素焦点”概念的方程式,  fx = F * W/w,其中参数解释如下:

  • fx 是 x 轴的焦点(以像素为单位)
  • F 是相机的焦点,单位为毫米
  • W 是相机传感器的宽度,单位为毫米
  • w 是图像的宽度(以像素为单位)

内参矩阵通过使用像素值的焦点,将现实世界从距离(毫米)测量单位映射到图像中的像素单位。

2.5 主点参数

        主点表示两个坐标系(像素坐标和相机坐标系)之间的像素偏移。

        相机坐标系的原点通常位于图像的中心,而像素坐标系的原点通常位于图像的左上角。因此,cx 的值通常是图像宽度的一半,cy 的值通常是图像高度的一半。

2.6 如何得到内参矩阵

        OpenCV提供了进行相机标定的工具和步骤。您可以从下面链接学习如何校准相机并获取内部参数。

OpenCV: Camera Calibration

2.7 对象分割

        我们需要进行对象分割而不仅仅是对象检测,因为我们不仅需要知道图像中对象的位置,还需要知道图像中对象的宽度,以便我们可以将其与对象的真实宽度进行比较。

        使用 Masked R-CNN 等神经网络进行对象分割有多种方法。或者对于类似的情况,例如检测彩色球,我们可以对图像进行颜色分割,然后进行形状分析。

2.8 尺寸估计

    一旦我们从对象分割中知道了属于该对象的像素,我们就可以计算图像中属于该对象的像素的数量。这将为我们提供图像中物体的大小。

2.9 计算3D位置

现在我们以查找图像中已知大小的彩球的 3D 位置为例。我们假设球的直径为 8 厘米。

    Z = (fx * 0.08) / (d_pix)

    X = ((x-cx)*Z)/fx

    Y= ((y-cy)*Z)/fy

  • d_pix - 直径(以像素数为单位)
  • x,y - 图像中球的中心
  • 物体在相机坐标系中的X,Y,Z -3D位置
  • cx,cy - 要点。

这种寻找 3D 位置的方法可能并不总是可行,但当满足条件时,它可以为您节省很多成本。

THE END!

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个广泛应用于计算机视觉领域的开源库。它提供了丰富的图像处理和计算机视觉算法,可以用于对车道线进行深度学习深度学习是一种机器学习的方法,它基于人工神经网络模型。对于车道线检测,可以使用深度学习模型进行训练和预测。具体步骤如下: 1. 数据收集:收集包含车道线的图像数据集。可以使用摄像头或其他传感器采集车辆在道路上行驶时的图像。 2. 数据预处理:对采集到的图像进行预处理,包括图像增强、尺度归一化、去噪等。这一步骤可以提高深度学习模型的性能。 3. 模型训练:使用预处理后的图像数据集训练深度学习模型。一种常见的模型是卷积神经网络(CNN),它能够有效地提取图像特征并进行分类。 4. 模型优化:优化训练后的模型,提高模型在车道线检测任务上的准确性和鲁棒性。可以使用交叉验证、正则化技术等方法来减少过拟合和提升泛化能力。 5. 车道线检测:使用训练好的深度学习模型对新的图像进行车道线检测。模型会根据图像中的特征进行预测,输出车道线的位置、形状等信息。 总而言之,OpenCV可以与深度学习结合,通过训练和预测深度学习模型来实现车道线检测。这种方法可以提高车道线检测的准确性和鲁棒性,为自动驾驶、交通管理等领域提供强大的算法支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值