问题标签 [opencv-solvepnp]

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 回答
21 浏览

opencv-solvepnp - 当目标点以 ecef 世界坐标表示时,tvec 的输出是什么?

我正在尝试获取飞机上相机的相机姿态估计。相机朝下,我将图像中的点与以 ECEF 表示的世界坐标相关联。

当我运行solvePNP时,我得到一个rvec和一个tvec。据我了解,rvec 是我的相机相对于世界参考系的旋转矢量,而 tvec 是从世界原点到我的相机的平移。所以我的主要问题是,这是否意味着 tvec 是我的相机在世界框架中的 XYZ 位置?如果我在 XYZ 开始 [0,0,0] 并移动到相机原点,那是我在 XYZ 坐标中的相机位置还是我误解了什么?

我问的主要原因是,为了在世界坐标中实际获得我的相机位置,我必须使用以下等式:

完整代码如下。

0 投票
0 回答
40 浏览

opencv - 如何结合 PnP、ICP 和直接法的非线性方法?

我目前正在研究一些视觉里程计算法,我发现在解决 PnP 和 ICP 等问题时​​有非线性和线性方法,而直接方法可以最大限度地减少两点之间的强度误差。上述非线性方法还可以最大限度地减少两点之间的重投影误差。

我可以用 Gauss-Newton 方法实现 PnP、ICP 和直接方法求解,因为它们的实现仅在雅可比矩阵和误差函数上有所不同,我想问有没有办法最小化三个误差函数并将它们组合在一起?例如,opencv库在“opencv_contrib/odometry.cpp”中结合了ICP和direct方法,我贴在下面,但是我不太明白“calcRgbdLsmMatrices”函数中的原理,有没有其他方法可以结合三个他们使用非线性方法?

感谢您提前提供任何帮助!

0 投票
0 回答
848 浏览

python - 如何估计带有标签的对象的姿势,并始终显示具有已知旋转和平移向量的整个对象?

我已经能够在这样的 apriltags 板上检测到多个 apriltags:在此处输入图像描述

这是使用 AprilTag 库完成的:https ://github.com/swatbotics/apriltag 。我使用 OpenCV solvePnP() 和 projectPoints() 来获取旋转和平移向量,并将 3D 点投影到 2D 点上以显示这些 apriltags 的位姿。

请参见下面的代码:

这非常适合 apriltag 板。但是,现在我正在尝试检测附加了 apriltags 的对象(十二面体:Dodecapen)的姿势。这些已经校准并附带列出每个标签大小的 json 文件,以及对应于正确标签 ID 的旋转和平移向量。

使用该 json 文件中的旋转和平移向量,我需要将所有 apriltags(甚至是在框架中未检测到的那些)覆盖到 OpenCV 窗口上。为此,我将不得不使用对象点内的旋转和平移向量,而不仅仅是使用标签大小来使用来自 json 的向量获取对象点的位置,并将它们用作solvePnP中的3D点( )。我会将罗德里格斯应用于旋转矢量,然后将其应用于对象点,但我不确定如何将它们应用于对象点。

为了始终将所有 apriltags 显示在屏幕上,我在想,一旦我从 solvePnP() 获得旋转和平移,我可以将该旋转和平移应用于对象附带的预定义旋转和平移向量,然后使用 projectPoints() 投影这些点并绘制它,以显示覆盖?

因此,总而言之,在检测到帧中的 1 个或多个 apriltags 时,我试图估计整个对象(十二面体)的姿势,对于未检测到的 apriltags(例如对象后面的那些),我是使用现有的起始姿势(来自 .json 文件的旋转和平移向量)将它们显示在屏幕上。

因此,基于此,我的问题是:

  1. 我将如何去做,最好的方法是什么?

  2. 如何在对象点内使用为对象提供的旋转和平移向量来获得 3D 世界中的姿势并将它们投影到 2D 图像中,以便所有 apriltags 都显示在 openCV 窗口上,是我认为最好的方法是什么?

  3. 如果我要在 for 循环之外提供对象和图像点数组,如下所示:

这些数组被附加在第一个代码示例的循环中。在 for 循环中,solvePnP 会正常工作吗?

任何帮助将不胜感激!

0 投票
0 回答
126 浏览

python - 如何通过从solvePnP()获得的姿势(旋转矩阵和平移向量)获得姿势速度和加速度?

我目前正在通过 solvePnP() 获取 apriltag 对象的姿势并使用 projectPoints() 投影点

这在 videoStream 上调用,因此为了尝试优化solvePnP(),我试图获取前一个姿势(前一帧中对象的姿势),并将该姿势传递给当前帧的solvePnP()。

这是代码:

在视频流功能中:

我现在想获得姿势的速度和加速度,并将其传递给solvePnP()。

对于姿势速度,我知道我只需要从当前平移向量中减去先前的平移向量,但我不确定如何处理旋转矩阵(通过 Rodrigues() 获得,以及获得加速度.我在想,也许我必须得到两个旋转矩阵之间的角度,而差异会产生变化,从而产生角速度?或者就像从solvePnP()中找到旋转向量之间的差异一样简单?

我的问题是:

  1. 如何根据旋转矩阵获得姿势之间的速度,就获得平移速度而言,仅从当前平移向量中减去前一个平移向量的方法是否正确?
  2. 如何获得平移向量和旋转矩阵的加速度?
  3. 我用来获取先前姿势的方法是最好的方法吗?
  4. 对于加速度,既然只是速度的变化,那么只跟踪帧之间获得的速度并获取差异以获得加速度是否明智?

任何帮助将不胜感激!

0 投票
1 回答
497 浏览

opencv - 未知内在和外在参数内的 OpenCV 相机校准:组合算法 DLT 和 SolvePNP

我正在尝试估计未校准图像的绝对相机位置,即在单个图像上。我有 2 组关键点:在 3d 模型(对象坐标)和 2d 图像(uv 坐标)上。让我们假设关键点是准确的。然后我执行以下步骤:

  • 我应用标准直接线性变换 (DLT) 来估计投影矩阵 P - 从 3d“世界”到 2d 图像变换 x = P*X;
  • OpenCV DecomposeProjectionMatrix() 函数有助于将投影矩阵分解为外在矩阵和内在矩阵:P = K {R|t};
  • 为了改进我对旋转和平移矩阵的第一次猜测,我将 SolvePnP(使用迭代方法,据我所知它为我提供了“最佳”解决方案)函数应用于关键点集和相机参数;

在几种情况下运行我的组合算法时,我注意到在大多数情况下 SolvePnP 返回非常接近基本事实的结果。其余结果不准确,旋转和平移与实际相差甚远。

问:是否可以针对我当前算法失败的这些情况进行改进:可能是基于 OpenCV CameraCalibrate() 优化内在参数,或应用其他 SolvePnP 算法?

0 投票
0 回答
217 浏览

python - 如何使用 QR/Aruco 代码(Python CV)将点云从相机框架转换为世界框架?

我想将来自多个深度相机的点云合并在一起。为了实现这一点,我试图将点云从每个相机帧转换为单个世界帧,由 aruco 代码(类似于 QR 代码)定义。

现在,我只是从一台相机开始。

假设我有

我目前执行以下操作:

然后,我在原点 (0,0,0) 处绘制轴的场景中显示新的点云。

我现在期望当我将相机对准 Aruco 代码时,这些点应该会发生变化,而且确实会发生变化。

但是我也希望点云现在应该保持静止,即使我旋转相机,因为这些点已经转换到世界框架中,并且世界相对于世界框架没有移动。这不会发生,当我移动相机时,这些点会继续移动(尽管以不同的方式)。

我相信旋转和平移是正确的,我使用它们将轴显示到 rgb_image 中的 aruco 代码上,并且它们位于正确的位置。

任何帮助将不胜感激!

0 投票
0 回答
41 浏览

python - 等距矩形相机姿态估计求解即插即用

我有一个 equirectangular 图像和几个 2D-3D 对应关系。 在此处输入图像描述 我的 2D 点是图像点,即像素坐标和 3D 点(对象点)是球形的(r,theta,phi)

我的 equirectangular 图像形状是 (512, 1024)。

我获得了以下相机矩阵,该矩阵将球面点映射到 eq​​uirectangular 图像点 (x,y):

从 (x, y) 点到球坐标的映射为:

要点是 -

我应该如何在这里使用 solvePnP ( cv2.solvePnP) 函数?

0 投票
1 回答
288 浏览

opencv - 想从图像中的二维点找到平面透视世界中的旋转和位置

我有 2D png 图像框架

我想在沙发的完美旋转和位置放置一个 3D 平面,如图所示最后一帧

我正在使用three.js 和透视相机手动将旋转和平移添加到平面。

我有放置绿色平面的区域的中心和角坐标。我有初始 3D 坐标位置 - (0,0,0) 和旋转 - (0,0,0)。我有 Object (0,0),(0,100),(140,0),(1 like初始帧

我想使用 OpenCV 和 three.js将初始帧转换为最终帧。如何从该 2D 图像中找到最后一帧中绿色平面的角度,以旋转并将绿色平面转换为白色平面?

我们的最终目标是在这样的平面上放置一个 3D 对象 -最终图像

我尝试使用 OpenCV solvePNP 解决相同的问题,但没有得到想要的结果,它的旋转和平移向量不起作用,并且给出了错误的结果。

0 投票
0 回答
36 浏览

python - 关于旋转向量/矩阵的困惑

solvePnP()用来获取 3D 形状的旋转矩阵,根据某些来源,它是一个 3x3 矩阵。就我而言,我得到一个向量(3x1)。我做错了什么还是格式取决于我的相机矩阵,dist coeffs,等等?我正在使用这条线:

我在形状中使用 5 个 image_points 和 object_points((x,y)用于 2D 点,(x,y,z)用于 3D 点,z=0,因为表面是平坦的),相机矩阵是

并且 dist_coeffs 是

这是在对相机进行校准后确定的。旋转向量返回如下:

旋转矢量:

在用 Rodrigues() 转换后,我得到了

我的问题是,旋转矩阵的定义是围绕每个轴的旋转矩阵的乘积,所以根据定义,它应该是一个 3x3 矩阵。有人可以解释一下或告诉我我做错了什么吗?

0 投票
0 回答
43 浏览

opencv - 姿势估计后 3D 坐标轴错位

作为一个新手,我正在尝试使用 OpenCV 的solvePnP 计算平面对象的姿态。但是,我看到一个奇怪的输出。我绘制的轴总是在框架的角上绘制轴。要绘制我的轴,我使用:

drawFrameAxes(frame_copy, cameraMatrix, distanceCoeffisions, rvec, tvec, length); 我得到的输出如下:

Ps(X:红色,Y:绿色,Z:蓝色)

我的代码 输出 我的代码高亮

我没有任何深度信息我不确定这是否属实,但为了获得 3D 点,我使用内点并将 z 坐标定义为 0。

那么可能是什么问题,任何资源指针或建议都是我的客人。

解决了问题

解决方案:固定相机校准并解决问题。

谢谢!