1

假设是静态场景,单个摄像机在小距离处正好侧向移动,有两帧和以下计算的光流(我使用 opencv 的calcOpticalFlowFarneback):

这里的散点是检测到的特征,用伪彩色绘制,带有深度值(红色表示深度较小,靠近相机,蓝色表示较远)。现在,我通过简单地反转光流大小来获得这些深度值,例如d = 1 / flow。看起来有点直观,以运动视差的方式 - 物体越亮,它离观察者越近。所以有一个立方体,将正面边缘和一点侧面边缘暴露给相机。

但是后来我试图将这些特征点从相机平面投影到现实生活中的坐标,以制作一种俯视图(其中X = (x * d) / fY = d(其中 d 是深度,x 是像素坐标,f 是焦距,X 和Y 是现实生活中的坐标)。这就是我得到的:

嗯,在我看来并不立方。看起来图片向右倾斜。我花了一些时间思考为什么,这似乎1 / flow不是一个准确的深度度量。使用不同的值,比如说,如果我使用1 / power(flow, 1 / 3),我会得到更好的图片:

但是,当然,1 / 3 的幂只是我脑海中的一个神奇数字。问题是,一般来说,深度光流之间的关系是什么,我该如何估计给定场景的光流?我们只是在这里考虑相机翻译。我偶然发现了一些论文,但没有运气试图找到一个通用方程。有些人,比如那个,提出了 的变体1 / flow,我猜这是行不通的。

更新

让我有点困扰的是,简单的几何图形也让我不得不1 / flow回答。就像,光流与视差相同(在我的情况下),对吗?然后使用这个公式我得到d = Bf / (x2 - x1),其中 B 是两个相机位置之间的距离,f 是焦距,x2-x1 正是光流。焦距是一个常数,对于任何两个给定的帧,B 都是常数,所以这让我1 / flow再次乘以一个常数。我对什么是光流有误解吗?

4

1 回答 1

2

对于静态场景,将摄像机精确地横向移动一个已知量,与立体摄像机设置完全相同。由此,如果您的系统经过校准,您确实可以估计深度。

请注意,这种意义上的校准相当广泛。为了获得真正准确的深度,您最终需要在 openCV 中的常规校准内容之上提供一个比例参数,否则 3D 会有一个统一的模糊性(这最后一步通常称为 go仅从“欧几里得”到“度量”重建)。

广泛校准的另一件事是镜头失真补偿。首先,您可能想强制您的相机表现得像针孔相机(现实世界的相机通常不会)。

话虽如此,光流与度量深度图明显不同。如果您首先正确校准和校正系统,那么光流仍然不等同于视差估计。如果您的系统得到纠正,那么进行完整的光流估计(例如 Farnebäck)就没有意义了,因为此后该问题被限制在图像的水平线上。进行完整的光流估计(给出 2 个自由度)可能会在所述校正后引入更多错误。

所有这些东西的一个很好的参考是经典的“计算机视觉中的多视图几何

于 2018-07-03T06:29:20.617 回答