问题标签 [visual-odometry]
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.
object-detection - 移动相机 3d 检测。我做对了吗?
我正在研究移动单目相机 3d 检测问题。到目前为止,它有两个主要组件:
- 使用卷积网络(F-RCNN、SSD、YOLO)检测图像平面(2d)中的对象。我能够在移动相机上的至少两帧中检测到相同的物体
- 通过三角测量找到检测到的物体的 3d 位置。为此,我正在构建类似于此处的本地捆绑调整过程的(简化)版本。我的步骤是:
- 初始化。从前两帧中提取特征(ORB,SWIFT),匹配它们(FLANN),找到 EssentialMatrix,找到第二帧相机矩阵(R|t)并将匹配三角化为 3d。
- 对于每个连续的帧:提取特征,与前一个匹配,找到已经有相应 3d 点的匹配,找到帧相机矩阵(通过 PnP),然后对没有 3d 点的匹配进行三角剖分以创建新的 3d 点。之后,我运行本地捆绑优化(在谷神星上)来调整最后 n 个摄像机(帧)的姿势和 3d 点。
- 我得到的结果:
有人可以验证我正在做的事情是否有意义?我跳过了一些重要的事情吗?这可以做得更简单吗?有没有类似的例子?谢谢!
optimization - SLAM 中的协方差估计
我尝试用 ceres 分析 vins_fusion 中优化器的协方差,但发现协方差与 EVO 计算的轨迹误差相差甚远。我怎样才能得到正确的协方差?我使用了以下命令:
tensorflow - 计算两个 RGB 点云之间的差异
我有两批点云是大小为 ((batch_size,num of points,3),(batch_size,num of points,3)) 的元组,第一个元素是 3D 坐标,第二个是 RGB 值,点数是相同。有什么方法可以计算它们之间的差异作为深度学习的损失吗?我考虑过ICP,但我真的不需要R,T信息。我考虑了倒角损失,但它不需要任何 rgb 信息。
opencv - 如何结合 PnP、ICP 和直接法的非线性方法?
我目前正在研究一些视觉里程计算法,我发现在解决 PnP 和 ICP 等问题时有非线性和线性方法,而直接方法可以最大限度地减少两点之间的强度误差。上述非线性方法还可以最大限度地减少两点之间的重投影误差。
我可以用 Gauss-Newton 方法实现 PnP、ICP 和直接方法求解,因为它们的实现仅在雅可比矩阵和误差函数上有所不同,我想问有没有办法最小化三个误差函数并将它们组合在一起?例如,opencv库在“opencv_contrib/odometry.cpp”中结合了ICP和direct方法,我贴在下面,但是我不太明白“calcRgbdLsmMatrices”函数中的原理,有没有其他方法可以结合三个他们使用非线性方法?
感谢您提前提供任何帮助!
computer-vision - 世界坐标系中的 Kitti 立体姿势
我目前正在试验 Kitti 立体数据集(http://www.cvlibs.net/datasets/kitti/eval_odometry.php),目标是找到一个正确的矩阵,将像素投影到世界坐标系中的点。问题是我不确定 Kitti 数据集中使用的是哪个坐标系。自述文件说:
每个文件 xx.txt 包含一个 N x 12 表,其中 N 是该序列的帧数。第 i 行通过 3x4 变换矩阵表示左相机坐标系的第 i 个姿势(即,z 指向前方)。矩阵以行对齐的顺序存储(第一个条目对应于第一行),并在第 i 个坐标系中取一个点并将其投影到第一个 (=0th) 坐标系中。因此,平移部分(第 4 列的 3x1 向量)对应于第 i 帧中左侧相机坐标系相对于第一(=第 0)帧的位姿。
所以据我所知,这个矩阵代表一个世界到相机的映射,因此我应该把它的逆从相机 cs 投影到世界 cs?
另一个问题是我需要以不同的方式定位世界坐标系:-z 指向前方,y 向上。
我的代码的当前版本如下所示:
javascript - 在 ORB-SLAM 中,找到输出随机值的平移向量
我试图找出两个连续图像之间的平移向量(基本上是姿势估计)。这是我在 OpenCV (.js) 中所做的:
- 从网络摄像头获取输入
- 获取连续图像
- 使用 ORB 在两个图像中查找特征
- 应用 BFMatcher 来获得匹配
- 良好匹配的应用比率测试
- 现在借助两个图像的关键点,我使用 cv.findEssentialMat(pt1,pt2...) 找到了基本矩阵
- 因为我有基本矩阵,所以我可以找出连续两个图像的旋转矩阵和平移向量 b/w
但是通过这种方式,我得到了一个随机的平移向量值,我正在研究视觉惯性 SLAM,因为我需要从视觉中找到加速度(如果我有正确的平移黑白图像,可以找到)。
我怀疑匹配是否给了我好的结果。有人可以帮我解决这个问题吗?
编辑: 我正在添加到目前为止我能够实现的结果: 匹配和其他结果
python - 视觉里程计 - 旋转和平移问题
我试图通过从图像中提取特征并计算相机姿势来重建相机的轨迹,但是轨迹并不像我预期的那样。对于我的视觉里程计系统,我使用的是英特尔相机 D435i,它可以提取颜色和深度帧。我的代码是用 python 编写的,使用的所有重要函数都来自 OpenCV 库。
我正在使用一个数据集,其中相机只是简单地移动,因此我希望旋转是单位矩阵并且平移向前。但是,这不是我在计算它们时得到的原因。
这是我的方法:
- 读取彩色帧,将它们转换为灰度并应用 CLAHE 方法来减少光对比
- 使用 SIFT 从第 t 帧和第 t+1 帧中提取特征
- 使用 FLANN 匹配它们并应用 Lowe 比率检验过滤异常值
- 使用相机固有矩阵 (K) 和像素深度 (s)(从深度帧中获取)将特征的 2D 像素坐标 (u1p, v1p) 转换为 3D 世界坐标:
归一化:x_y_norm = (K^-1) * [u1p ,v1p, 1] 缩放:x_y_norm_s *= x_y_norm
之后我尝试了两种方法:PNP和基本矩阵
A) PNP: 4. 使用函数cv2.solvePNPRansac()得到旋转向量和平移向量。函数的输入是帧 t(对象点)的归一化和缩放的关键点和帧 t+1(图像点)的归一化关键点。然后使用函数cv2.Rodrigues()计算旋转矩阵
B) 基本矩阵: 4. 使用cv2.findEssentialMat()并将关键点的标准化 xy 坐标作为输入。通过检查奇异值来检查基本矩阵是否计算正确。使用cv2.recoverPose()来获得旋转和平移(这里我也使用了标准化的 xy 坐标作为输入)。
- 计算轨迹如下(假设第二个 camera_pose 是 [R|t] 并且第一个位姿是单位矩阵,如书中多视图几何中所述):
camera_pose[t+1] = pose[t] * pose[t+1]^-1 (通过将先前和当前位姿相乘来从初始位置获取位姿,如将相对相机旋转和平移与已知位姿相结合中所述)
position = pose[t+1] * [0,0,0,1](从原点计算的位置)
轨迹[:,t+1] = 位置[0:3]
我希望有人可以帮助我,因为我不知道我的错误在哪里,而且 PnP 方法和基本矩阵方法都不起作用。
编辑:对于这两种方法,我添加了从数据集的前 15 帧中获得的轨迹图片(在 ZX 和 XY 平面中)以及包含旋转矩阵和某些帧的平移向量的文本文件的提取. ZX-Plane 应显示在正方向上形成一条线的点,因为我的数据集仅显示相机直接移动的图像,但显示的是随机轨迹。绿点是旧相机姿势,红点是当前姿势。我还添加了一个在第一帧中提取的特征并与第二帧匹配的示例,它们看起来也不错。
kinect - 计算图 slam 的信息矩阵
我是 SLAM 的新手。我正在研究图形大满贯,我需要进行姿势图优化。对于这个要求,在已经使用迭代最近点计算变换的两条边之间需要信息矩阵。我使用 Open3D 库来计算这个以及信息矩阵。但是我不知道什么是信息矩阵以及如何计算两个节点之间的转换。
python - 使用 Python OpenCV 从视差/深度图计算尺度模糊因子
对于我的项目,我正在使用 Python (openCV) 在 Carla 模拟器中进行视觉里程计。我可以使用单个相机来计算视觉里程计,也可以使用立体相机对来计算视差/深度。
我用一个摄像头完成了这个部分,我得到了我的车辆的轨迹,唯一的问题是它没有正确地缩放到世界地图,这是预期的,因为这项工作是使用单个摄像头完成的。所以现在我正在尝试使用立体相机解决这个比例模糊问题(只获得比例因子),我知道我应该为此使用视差图。所以我想如果我比较两个连续的视差图(来自两个连续帧的图),可能在匹配点中,我可以找到这个因素?
我不确定如何在 openCV 中完成这部分,算法和必要步骤是什么?
谢谢您的帮助!
c++ - 在 TUM VO 数据集上生成 pcalib.txt 和 vignette.png
为了运行 Direct Sparse Odometry(由德国慕尼黑工业大学开发),我使用 mono-dataset-code 来生成光度校准和晕影图像。我正在尝试使用 TUM 数据集的数据集序列之一生成 pcalib.txt 和 vignette.png。
使用./responseCalib
我能够在其中一个序列上生成 pcalib.txt。但它与 TUM 数据集提供的原始 pcalib.txt 不同。我无法理解为什么会有所不同。不仅我得到非增加值,而且所有值都在 100...255 范围内。
此外,我无法./vignetteCalib
使用原始 pcalib.txt 在同一序列上生成 vignette.png,因为使用生成的 pcalib./responseCalib
不正确。(PS:我已经安装了 aruco 并尝试在安装后创建标记板示例。效果很好。)
./playDataset
当我在 TUM 数据集序列上运行时,我也会遇到错误。错误看起来像
这样
有没有人遇到过类似的问题或对此有一些解决方案?
谢谢!