Mar*_*o90 6 image-processing computer-vision
假设我在房间内的平地板上放置一个小物件.
我可以移动小物体,为每个像素坐标重复这三个步骤并创建一个查找表(键:像素坐标;值:距离).这个程序对我的用例来说足够准确.我知道如果有多个对象(一个对象可以覆盖另一个对象)会有问题.
我的问题:是否有更简单的方法来创建此查找表?意外地将摄像机角度改变几度会破坏艰苦的工作.;)
也许可以对世界坐标系中的几个特定像素坐标或位置执行三个步骤,并执行一些"校准"来计算与计算参数的距离?
如果地板是平的,那么它的等式就是飞机的等式
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图像中的长度.
大多数视觉库(包括 opencv)都有内置函数,这些函数将从相机参考系中获取几个点,并从笛卡尔平面中获取相关点,并为您生成扭曲矩阵(仿射变换)。(有些足够奇特,可以包含具有足够输入点的非线性映射,但这会让您回到校准问题的时间)
最后一点:大多数视觉库使用某种类型的网格来校准,即棋盘图案。如果您编写的校准是在这样的工作表上进行的,那么您只需要测量到 1 个目标对象的距离,因为转换将由工作表计算,而目标将仅提供世界偏移。