假设是静态场景,单个摄像机在小距离处正好侧向移动,有两帧和以下计算的光流(我使用 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 的幂只是我脑海中的一个神奇数字。问题是,一般来说,深度光流之间的关系是什么,我该如何估计给定场景的光流?我们只是在这里考虑相机翻译。我偶然发现了一些论文,但没有运气试图找到一个通用方程。有些人,比如那个,提出了 的变体1 / flow
,我猜这是行不通的。
更新
让我有点困扰的是,简单的几何图形也让我不得不1 / flow
回答。就像,光流与视差相同(在我的情况下),对吗?然后使用这个公式我得到d = Bf / (x2 - x1)
,其中 B 是两个相机位置之间的距离,f 是焦距,x2-x1 正是光流。焦距是一个常数,对于任何两个给定的帧,B 都是常数,所以这让我1 / flow
再次乘以一个常数。我对什么是光流有误解吗?