问题标签 [structure-from-motion]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
511 浏览

opencv - Structure from motion using sparse bundle adjustment

I don't have calibrated camera,I have taken stereoscopic images from web.

I wanted to create structure from motion of the images,So I was lookin at Tsai's algorithm and Sparse Bundle adjustment.

But,I got struck while finding camera parameters.What mathamtical background will be reuqired to understand these concepts?

The 'Multiple view Geometry' is not that much helping.

0 投票
1 回答
2686 浏览

opencv - 光流与深度关系的性质

假设是静态场景,单个摄像机在小距离处正好侧向移动,有两帧和以下计算的光流(我使用 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再次乘以一个常数。我对什么是光流有误解吗?

0 投票
0 回答
396 浏览

c++ - 使用 OpenCV 计算基本矩阵时出现异常

我正在阅读 Mastering OpenCV 一书中的第 4 章的“运动结构”。我目前正在尝试Essential Matrix使用Fundamental Matrix. 此语句 Mat_<double> E = K.t() * F * K; 导致异常,我无法弄清楚。我假设它的类型不匹配。

0 投票
1 回答
948 浏览

python - 在终端中运行 python 脚本时出错:OSError: [Errno 2] No such file or directory

我正在尝试使用一个名为“bundler_sfm”的软件,它是使用 python 脚本执行的。

我正在尝试使用的软件在这里可用,如果您想看一下,脚本在 utils 目录中。

尝试运行它时,出现以下 python 错误:

导致此错误的代码如下:

我已经查看了具有类似错误的其他各种答案,但仍然不知道如何解决这个问题。

我正在尝试在基本操作系统的终端中运行它。

任何帮助将不胜感激。

0 投票
0 回答
221 浏览

opencv - 运动结构:从基本矩阵计算旋转和平移矩阵时出错

我正在尝试从运动中模拟结构。

  1. 考虑运动在 x 方向的情况。我创建了如下所示的匹配点,其中仅在 x 方向上移动了 50 个像素。

上一张图片坐标

当前图像坐标 [0] {x=100.0 y=50.0 } [1] {x=150.0 y=50.0 }
[2] {x=200.0 y=50.0 } [3] {x=250.0 y=50.0 } [ 4] {x=300.0 y=50.0 } [5] {x=350.0 y=50.0 } [6] {x=100.0 y=100。} [7] {x=150.0 y=100。} [8] {x=200.0 y=100。} [9] {x=250.0 y=100。} [10] {x=300.0 y=100。} [11] {x=350.0 y=100。}
[12] {x=100.0 y=150。} [13] {x=150.0 y=150。} [14] {x=200.0 y=150。} [15] {x=250.0 y=150。}

固有矩阵 6.2821272+002 0. 3.474665e+002 0. 6.2886809e+002 2.4486120e+002 0. 0. 1. 已知固有矩阵 我使用 opencv 函数计算了基本cvFindFundamentalMatrix矩阵

平均像素误差非常接近于零。

然后使用下面给出的公式找到基本矩阵

X 偏移量的基本矩阵 -6.227048e-030、1.8018814e-014、4.30140591e-015 3.1235024e-014、2.7432764e-015、7.02982759 9.885755751e-015、-7.0298276e-0153。

然后使用 SVD - SVD decomp = SVD(E); 分解下面链接中给出的旋转和平移矩阵;

从基本矩阵中提取平移和旋转

当分解旋转角度Rx =0deg Ry =0deg 和Rz =0deg。

这似乎很好,因为旋转为 0 或 180 度。

当坐标随 y 方向的平移而改变时,仅作为下面给出的坐标

上一个坐标

当前坐标

相同的过程和相同的内在矩阵用于构造基本矩阵和本质矩阵。

Y 偏移量基本矩阵 -2.791314e-030, 2.5449611e-015, 5.095796479e-016
4.3544169e-015, -0.039722588, 0.99921074] 1.78226326e-015, -0.99972107586, -02

但旋转分解为 Rx=-2.27653561deg Ry = 180, Rz = 0

我不明白的是为什么 Rx 有一些价值,因为平移是在 X 和 y 方向,我觉得旋转应该是 0 或 180 度。

如果我的代码有任何问题,请给我一些提示。

0 投票
1 回答
1016 浏览

c++ - OpenCVs triangulatePoints() 之后的均匀 4D 矢量归一化

我有两组对应的图像点和投影矩阵。我使用 OpenCVs triangulatePoints() 函数(API | src 代码),均匀 3D 点的结果是:

由于三角剖分使用 SVD 组合来计算解,因此点(上述矩阵中的每一行代表一个 4D 点)被归一化为单位向量。由于齐次点被定义为

我是否必须分别对所有计算点进行归一化,因为它们的最后一个条目是单位以获得点的度量重建?

0 投票
4 回答
4171 浏览

c++ - 相机姿态估计:如何解释旋转和平移矩阵?

假设我在两个图像之间有很好的对应关系,并尝试恢复它们之间的相机运动。我可以为此使用 OpenCV 3 的新功能,如下所示:

现在,我很难理解什么Rt真正的意思。它们是否是将坐标从相机空间 1 映射到相机空间 2 所需的变换,例如p_2 = R * p_1 + t

考虑这个例子,使用人工标记的对应关系

在此处输入图像描述

我得到的输出是这样的:

我尝试将此与我在图像中看到的内容相匹配并提出解释,这[-0.96,-0.04,0.25]告诉我,我已经向右移动了,因为坐标沿着负 x 轴移动,但它也会告诉我,我已移动得更远,因为坐标已沿正 z 轴移动。

我还围绕 y 轴旋转了相机(向左旋转,我认为这将是围绕负 y 轴逆时针旋转,因为在 OpenCV 中,y 轴指向下方,不是吗?)

问题:我的解释是否正确,如果不正确,正确的解释是什么?

0 投票
1 回答
480 浏览

opencv - 旋转下的场景重建和很少的相机移动

我正在尝试使用安装在门旋转中心附近的单相机来实现某种具有深度测量的物体检测。基本思想是检测门前的物体(向上摆动时)并在门无法完全打开时发出碰撞警告。

我必须处理一些问题:

  • 小幅移动:相机从 0°-90° 旋转,并且只有有限的平移(由于相机位置)
  • 相机镜头是鱼眼(AOV ~100° 垂直和 180° 水平)

我尝试了什么:

  • 运动结构:

    即使有一个完整的序列(从 0°-90° 旋转),我也只能得到一个非常糟糕的场景重建。由于相机移动很小,我认为使用这种方法很难获得好的结果(特别是因为在碰撞警告方面我不能使用完整的视频序列)。

  • 伪造立体重建:

    我使用了两个连续的图像,对它们进行校正并尝试生成视差图。几乎每次极点都位于图像内部,这会在校正时导致大量失真。但即使极点位于图像之外(可以进行校正),视差图也无法使用(碎片,没有独特的结构)。

如果有人有一些想法我可以在这里尝试,我将不胜感激。也许光流适合这里?

当解决方案实际上不可能时,我也对某种(数学)证明感兴趣。使用 SfM 等算法获得良好的重建结果是否需要最少的移动量?对于 SfM,平移是否比旋转更好?

0 投票
1 回答
9135 浏览

python - 如何估计 OpenCV 中两个摄像头的位置?

我有来自两个图像的两组对应点。我估计了编码相机之间转换的基本矩阵:

然后我提取了旋转和平移组件:

但是我如何真正获得两个相机的相机矩阵,以便我可以cv2.triangulatePoints用来生成一点点云?

0 投票
1 回答
206 浏览

triangulation - 2 个视图的 3D 重建

我正在从两个视图和固定的已知相机焦距对 3d 重建进行一些研究。我不清楚的是三角测量是否给了我们物体的真实世界比例,或者结果的比例与实际比例不同?如果比例尺与实际尺寸不同,我如何从中找到点的深度?我想知道是否需要更多信息来创建真实世界的对象比例。