使用静态场景中的单个摄像机测量到物体的距离

Mar*_*o90 6 image-processing computer-vision

假设我在房间内的平地板上放置一个小物件.

  • 第一步:从世界坐标系中的已知静态位置拍摄房间地板的照片.
  • 第二步:检测图像中对象的下边缘,并将像素坐标映射到世界坐标系中的对象位置.
  • 第三步:使用卷尺测量与物体的实际距离.

我可以移动小物体,为每个像素坐标重复这三个步骤并创建一个查找表(键:像素坐标;值:距离).这个程序对我的用例来说足够准确.我知道如果有多个对象(一个对象可以覆盖另一个对象)会有问题.

我的问题:是否有更简单的方法来创建此查找表?意外地将摄像机角度改变几度会破坏艰苦的工作.;)

也许可以对世界坐标系中的几个特定像素坐标或位置执行三个步骤,并执行一些"校准"来计算与计算参数的距离?

Yve*_*ust 6

如果地板是平的,那么它的等式就是飞机的等式

a.x + b.y + c.z = 1
Run Code Online (Sandbox Code Playgroud)

相机坐标中(原点是相机的光学中心,XY形成焦平面,Z形成观察方向).

然后,从相机中心到像素坐标处的图像上的点的光线由下式(u, v)给出

(u, v, f).t
Run Code Online (Sandbox Code Playgroud)

f焦距在哪里.

射线撞击飞机时

(a.u + b.v + c.f) t = 1, 
Run Code Online (Sandbox Code Playgroud)

即在那一点上

(u, v, f) / (a.u + b.v + c.f)
Run Code Online (Sandbox Code Playgroud)

最后,从相机到该点的距离是

p = ?(u² + v² + f²) / (a.u + b.v + c.f)
Run Code Online (Sandbox Code Playgroud)

这是您需要制表的功能.假设f是已知的,则可以确定未知系数a,b,c通过取三个非对齐点,测量图像坐标(u, v)和距离,并求解线性方程组的3×3系统.

从最后一个等式,您可以估计图像任何点的距离.

可以通过在已知距离处观察已知尺寸的目标来测量焦距(以像素为单位).通过比例,距离超过尺寸的比率超过f图像中的长度.


Sne*_*ear 2

大多数视觉库(包括 opencv)都有内置函数,这些函数将从相机参考系中获取几个点,并从笛卡尔平面中获取相关点,并为您生成扭曲矩阵(仿射变换)。(有些足够奇特,可以包含具有足够输入点的非线性映射,但这会让您回到校准问题的时间)

最后一点:大多数视觉库使用某种类型的网格来校准,即棋盘图案。如果您编写的校准是在这样的工作表上进行的,那么您只需要测量到 1 个目标对象的距离,因为转换将由工作表计算,而目标将仅提供世界偏移。