问题标签 [pose-estimation]

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 投票
2 回答
7068 浏览

opencv - OpenCV projectPoints的逆向

我有一个相当于棋盘的相机。我知道点的世界 3d 位置以及相机图像上相应投影点的 2d 位置。所有的世界点都属于同一个平面。我使用solvePnP:

然后我可以使用 projectPoints 从 3d 世界点转到 2d 图像点:

projPoints 非常接近 imgPoints。

如何使用对应于属于同一平面的 3d 世界点的屏幕点进行反向操作。我知道从一个单一的角度来看,重建 3d 位置是不可能的,但在这里我在同一个平面上,所以这确实是一个 2d 问题。我可以计算反向旋转矩阵以及反向平移向量,但是我该如何进行呢?

0 投票
0 回答
1035 浏览

opencv - OpenCV findEssentialMat() 和 recoverPose() 签名约定?

如果我有两个分别从左右相机拍摄的图像 L 和 R,我将调用基本矩阵函数,如下所示:

E = findEssentialMat(rightImagePoints, leftImagePoints, ...),然后是 recoverPose(E, rightImagePoints, leftImagePoints)..

我最终得到的平移向量中的符号不​​是应该的 [-1, 0, 0] (因为我正在从相机 R 计算相机 L 的姿势)而是 [1, 0, 0].. 可以任何人请向我解释为什么?我很自然地认为,如果函数按点 1、点 2 的顺序传递点,它会在点 1 和点 2 之间寻找手性。在我的函数调用中,哪个相机被视为原点?

0 投票
0 回答
599 浏览

opencv - 在使用solvePnP估计姿势之前不扭曲图像

我必须使用已知标记估计相机的姿势。相机已校准,我拥有所有校准系数。

当前版本的算法从帧中提取 4 个共面点,并使用它们使用 solvePnP 函数来估计位姿。

算法似乎工作正常,但我有疑问。由于solvePnP也将校准系数作为输入,我是否需要在查看4个点之前不扭曲图像?

在下面的代码中,是否需要 initUndistortRectifyMap/remap 函数?

0 投票
0 回答
89 浏览

c++ - 用于标记识别的对应搜索

我的总体目标是进行基于标记的姿势估计。为此,我需要图像坐标和对象坐标之间的对应关系。

因此,在检测到圆形标记后,我需要确定左上角的标记是 A,右侧的第一个标记是 B,然后是 C,然后是 D。如下面的示例图像所示。

在此处输入图像描述

现在我的第一个想法是基于这个距离。因为我知道我的标记在现实世界中的宽度,所以我可以简单地计算欧几里得距离乘以一个像素的现实世界大小。


我目前的做法:

有了这些信息,对应搜索算法就像这样。

符号:

初始测量距离存储在集合 P =(dist(m1,m2),...,dist(mi,mi+1)}

检测到的标记将在集合中 D = {d1,d2...,dn}

  1. 最初测量所有标记标记之间的距离。P = {dist(A,B),dist(A,C),dist(A,D),dist(B,C),..., dist(D,C) 注意:这仅在之前完成一次姿态估计程序的运行时间。

  2. 如果 |D| >= 3 然后

    dref=d1;

    dj = d2;

    而 ( j < |D|)

    测量 dist(dRef,dj) 并将其与 P 中的所有条目进行比较。假设当前 dist 是与 P 中的一个条目具有最高相似性的那个。将假定标记的出现增加一

3.dref = 出现值最高的标记

4.对D中的所有检测执行此操作


例子:

dref = A 并且其他检测到的标记是 B 和 C。然后程序将计数 2 次 A 一次 B 和一次 C。A 的出现率高于所有其他,因此 dref 必须是 A,


问题:

这种方法只适用于二维空间,只要标记都在同一个平面上,距离就会被校正。但是,如果某些标记不在同一平面上,则距离是错误的,因此无法再比较距离。有关示例,请参见下图。

在此处输入图像描述


问题

我知道有像 aruco 标记之类的东西,但我的问题旨在仅使用白色圆形标记进行识别。

有谁知道一种方法,我可以如何改进我的系统?就像我一开始说的,我的目标是用白色圆形标记进行姿态估计。我愿意接受任何能让我更接近这个目标的解决方案。

0 投票
0 回答
421 浏览

opencv - 基本矩阵 opencv

如果您有来自两个图像的 8 个完美跟踪点并避免了退化情况,为什么基本矩阵有时仍然是错误的(或不够好)。这是一个数字问题吗?

对于任何提示,我将不胜感激。

编辑

这是我的虚拟场景。标记点用于计算 E 和检查 E。

相机的两个视图都合并在右侧的图像中。rel 绕 Y= -15° 旋转,rel translationVec 设置为 [64, 114, 0]

在此处输入图像描述

0 投票
0 回答
3727 浏览

c++ - 外部相机校准 OpenCV

我正在尝试校准我安装在一个装置上的四个相机的外部参数。它们相距 90 度。我已经校准了内在参数,我正在考虑使用校准模式的图像来查找外在参数。到目前为止我所做的是:放置校准图案,使其平放在桌子上,使其滚动角和偏航角为 0,俯仰角为 90(因为它与相机平行)。摄像机有 0,90,180,270 度角偏航(因为它们相距 90 度),摄像机的滚动角为 0(因为它们不倾斜。所以剩下要计算的是摄像机的俯仰角。

我无法完全理解如何计算它,因为我不习惯在坐标系之间进行映射,所以欢迎任何帮助。我已经制作了程序的一部分,该程序使用cv::solvePnPRansac()函数计算旋转向量(图像中的校准模式),所以我有旋转向量(我相信我可以使用简历::罗德里格斯()

在我的计算中,下一步对我来说是什么?

0 投票
1 回答
704 浏览

c++ - 解决 PnpRansac GPU 断言失败

我正在尝试使用 solvePnPRansac 的 gpu 版本来估计相机的位姿,但出现以下错误:

OpenCV 错误:在 cv::gpu::solvePnPRansac,文件 C:\opencv\sources\modules\gpu\src 中断言失败 (object.rows == 1 && object.cols > 0 && object.type() == CV_32FC3) \calib3d.cpp,第 218 行

如果我使用solvePnP 或基于cpu 的solvePnPRansac 运行我的代码,一切正常。

我在第 218 行查看了 calib3d.cpp 的代码,问题似乎与函数的第一个参数有关(应该是参考点列表)。

看来我用来向函数发送参考点的格式是错误的,但我没有弄清楚哪个是正确的。

这是我的代码:

你有什么建议吗?

0 投票
1 回答
1434 浏览

opencv - 两幅图像之间的旋转估计

我想获得从同一相机拍摄的两个图像之间的旋转(已知内在)。我有一个近乎完美的纯旋转!

我使用 findhomography,但如果有一点平移运动,我会得到四个结果。有没有办法强制假设它是纯旋转的单应性?

编辑:图片示例:相机正在旋转 在此处输入图像描述

0 投票
0 回答
178 浏览

opencv - OpenCV:PNP 姿态估计在特定情况下失败

我正在使用 OpenCV 的 solvePnPRansac 函数来估计我的相机的姿势,给定一个由跟踪特征组成的点云。我的管道由多个相机组成,我从两个相机之间的匹配特征形成点云,并使用它作为参考来估计其中一个相机开始移动时的姿势。我已经在多种设置中对此进行了测试,只要在相机运动时有足够的功能进行跟踪,它就可以工作。

奇怪的是,在我今天做的一个测试中,我遇到了一个失败的案例,solvePnP 会一直返回垃圾值。这里令人困惑的是,在这个数据集中,我的点云要密集得多,它从两个视图中重建得非常准确,在任何给定时间跟踪的点数(当前可见特征与点云中的特征)要高得多比我通常拥有的,所以理论上它应该是一件轻而易举的solvePnP,但它失败了。

我尝试了 CV_ITERATIVE、CV_EPNP 甚至是非 RANSAC 版本的solvePnP。我只是想知道我是否在这里遗漏了一些基本的东西?在这些图像中可以看到我正在看的场景(图像1是两个视角之间的场景和特征匹配,图像2是供参考的点云)

特征匹配

点云

执行 PNP 的代码部分非常简单。如果 P3D 是跟踪的 3D 点数组,则 P2D 是相应的图像点集,

编辑:我还应该提到,我的参考点云是在相机之间 8 英尺的基线处获得的,而我正在看的建筑物可能在 100 英尺之外。可能缺乏差异也会导致问题吗?

0 投票
1 回答
602 浏览

image-processing - 间接(错误状态)卡尔曼滤波器:错误状态的传播

我正在研究错误状态卡尔曼滤波器,以使用 IMU 数据进行状态传播和基于视觉的测量进行更新来估计飞行器的位置和方向。

因此,对于我从“错误状态 KF 的四元数运动学”中了解/理解的内容:我有标称状态x和错误状态delta xx是使用我的 IMU 测量值传播的。FH矩阵是基于错误状态而不是完整状态定义的。错误状态不会传播。

delta x首次在更新的步骤中计算,使用:

delta x = K(y - h(hat( x ))) --> 错误状态独立于任何先前的错误状态估计

据我所知,这是第一次计算delta x,在它用于在正常状态下注入错误状态后,它被重置为零。

因此,据我所知,我们不需要预测/传播错误状态,因为我们没有关于错误的信息,因此它以零启动,错误状态将始终返回零。协方差矩阵显然必须随着误差的增长而更新。

在预测步骤中不预测错误状态并且仅在更新步骤中使用错误状态是否正确?