本文来源公众号“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提供了进行相机标定的工具和步骤。您可以从下面链接学习如何校准相机并获取内部参数。
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!
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。