假设静态场景,单个摄像机在小距离处完全侧向移动,有两个帧和一个跟随计算的光流(我使用opencv的calcOpticalFlowFarneback
):
此处散点是检测到的特征,它们以伪彩色绘制,具有深度值(红色深度很小,靠近相机,蓝色更远)。现在,我通过简单地反转光流量来获得这些深度值,如d = 1 / flow
。看起来有点直观,以运动视差方式 - 物体越亮,它越接近观察者。所以有一个立方体,向相机露出正面边缘和一些侧边缘。
但是后来我试图将这些特征点从相机平面投影到现实生活坐标,以制作一种顶视图(X = (x * d) / f
和Y = d
(其中d是深度, x是像素坐标,f是焦距,X和Y是现实生活坐标。)这就是我得到的:
嗯,对我来说不是立方体。看起来图片偏向右边。我花了一些时间思考为什么,似乎1 / flow
不是一个准确的深度指标。使用不同的值,比方说,如果我使用1 / power(flow, 1 / 3)
,我会得到一个更好的图片:
但是,当然,1/3的力量只是我头脑中的一个神奇数字。问题是,一般来说光学流程之间的关系是什么,以及我如何为给定场景估计它?我们在这里只考虑相机翻译。我偶然发现了一些文件,但没有运气试图找到一个通用的方程式。有些像that one那样提出了1 / flow
的变体,我认为这种变体无效。
更新
让我感到困扰的是,简单的几何形状指向我1 / flow
也回答。就像,光学流动是一样的(在我的情况下)是不一样的,对吧?然后使用this formula得到d = Bf / (x2 - x1)
,其中B是两个相机位置之间的距离,f是焦距,x2-x1恰好是光流。焦距是一个常数,B对于任何两个给定的帧都是常数,因此我再次将1 / flow
乘以常数。我是否误解了光流是什么?
答案 0 :(得分:1)
对于静态场景,将摄像机精确地横向移动已知的量与立体摄像机的设置完全相同。由此,如果您的系统已校准,则您确实可以估算深度。
请注意,这种意义上的校准相当广泛。为了获得真正准确的深度,您最终需要在openCV中具有的常规校准材料的顶部提供一个比例参数,否则3D会有一个统一的歧义(最后一步通常称为going只能从“欧几里得”转换为“公制”。
除了广泛的校准之外,另一件事是镜头失真补偿。首先,您可能想要强制相机像针孔相机一样工作(现实世界中的相机通常不这样做)。
话虽如此,光流与度量深度图绝对有很大不同。如果您先正确校准并校正系统,则光流仍然不等同于视差估计。如果您的系统已校正,则没有必要进行完整的光流估算(例如Farnebäck),因为此后问题被沿图像的水平线约束。进行上述校正后,进行完整的光流估计(给定2 d.o.f)会引入更多的误差。