问题标签 [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 回答
236 浏览

c++ - 世界坐标中的相机位置不起作用,但相机坐标系中的物体姿势正常工作

我正在使用solvepnp为头戴式设备(Hololens)使用LED作为标记进行相机(iphone相机)姿势估计。我已经校准了下面的相机是相机内在参数

usng solvpnp 能够在相机坐标系中获得正确的对象姿势 下面是代码

输出是

使用这个rotation_vector 和translation_vector 通过投影点为的三向量来可视化姿势

projectionPoints 的输出为

这似乎是正确的,如下所示

相机坐标系中的物体姿态

我尝试通过使用由solvepnp给出的rotation_vector和translation_vector的变换来在世界/对象坐标系中找到相机姿势

我使用了 rot_matrix_wld、translation_vec_wld 来可视化姿势(与我在相机坐标系中可视化对象姿势的方式相同,如上所述)

我得到错误的翻译向量(低于 2 个投影点用于视频的 2 个不同图像帧)

我使用了近似相机模型和校准相机模型都给出了错误的平移向量。

我已经浏览了这里的链接并验证了我的校准程序,我做得正确。

我不确定哪里做错了,任何人都可以帮我解决这个问题。

提前致谢。

0 投票
1 回答
1330 浏览

python - 使用opencv python获取错误的目标旋转角度

我正在尝试使用 opencv python 找出对象的旋转角度。为此,我已经检测到目标,然后我能够找出旋转向量,并将其转换为旋转矩阵,并从该矩阵计算欧拉角。但是当我在视频中旋转对象时,所有三个角度(x、y、z)都会发生变化,当我在平面上移动目标时也会发生变化,即使它显示出角度的变化。请建议我一些方法来获得准确的结果。

这是目标的图像: 这是目标的图像。

所需输出:x = 5,y = 0,z = 0
电流输出:x = 6.1,y = 4.7,z = -2.0

0 投票
1 回答
277 浏览

opencv - opencv solvePnP,所有轴看起来都不错,除了 Y

我在图像数据集上运行 solvePnPRansac,具有 2d 特征点和三角化 3d 地标点。它运行良好,旋转、前轴和侧轴的结果看起来很棒。但是,Y 轴是完全错误的。

我正在根据数据集的基本事实测试输出,它会上升到应该下降的位置,并且很快就会偏离基本事实。其他轴保持锁定的时间要长得多。

这让我觉得很奇怪,其他轴怎么可能是正确的,而一个轴却是错误的?当然这是不可能的,我会认为要么每个轴都是坏的,要么每个轴都是好的。

我可能做错了什么才能做到这一点?我该如何调试这种怪异之处?我的 PnP 代码非常标准:

0 投票
1 回答
2063 浏览

opencv - 通过旋转组合求解PNP vs recoverPose:为什么翻译不一样?


第 1 部分:更新前


我正在尝试使用两种不同的方法来估计相对位置:solvePNPrecoverPose,并且似乎R矩阵在某些错误方面看起来不错,但平移向量完全不同。我究竟做错了什么?一般来说,我需要使用这两种方法找到从第 1 帧到第 2 帧的相对位置。

输出:


第 2 部分:更新后


更新:我改变了R -s 和t -s 在solvePnP之后的组合方式:

这个构图是用相机的实际运动检查的,看起来是正确的。

此外,recoverPose 现在从非平面对象获取点,并且这些点处于一般位置。测试的运动也不是纯旋转以避免退化情况,但平移向量仍然非常不同。

第一帧: 第一帧 第一帧: 跟踪和匹配绿色点,可以在第二帧上看到(在第二帧上它们是蓝色的): 绿点被跟踪并且可以在第二帧上看到(虽然它们是蓝色的) 第二帧: 第二帧 第二帧: 在恢复姿势的一般位置上的跟踪点: 用于恢复姿势的一般位置的跟踪点

输出:

我也尝试过相机静止不动(没有R,没有t)并且R -s 接近但翻译不接近的情况。那么我在这里缺少什么?

0 投票
0 回答
637 浏览

opencv - Solvepnp CPP 函数给出不同的结果

我试图了解solvepnp是如何工作的。我尝试给出一个对象的 8 个角点(它的 2D - 3D 对应关系)和相机的内在函数。我得到的结果为

rvec

-1.59 -1.6 -0.89

特维克

-18 3000 1400

当我尝试使用 solvepnp rvec 和 tvec 的输出重新投影时,这些点会正确覆盖在输入图像上。当我将我的一个图像点的值增加一时(例如(400,300)之前,现在我只是更改为(401,300))。我的 rvec 更改符号和 tvec 值变化很大。现在它是

rvec

1.6 1.6 -0.8

特维克

9 -900 5000

重投影也失败了。我很好奇这种变化是如何随着微小的变化而发生的。如何解决?

0 投票
1 回答
772 浏览

c# - ARKit 中是否有 pnp 求解器,或者如何使用 EmguCV c# 包装器在 Unity3D 项目中使用 opencv 的 SolvePnP 函数

高级上下文:

在 Unity3D AR 项目中,系统使用机器学习提供图像中的一组 2D 像素坐标与世界坐标中的同一组 3D 点之间的对应关系。根据这两组之间的对应关系,我想估计导致该图像的相机姿势。

要实现的低级目标:

我的研究结果建议我使用 PnP-Ransac 算法。Perspective-n-Points 是我遇到的这个问题的名称:从匹配的 2D-3D 点中找到相机姿势。PnP 问题定义:https ://en.wikipedia.org/wiki/Perspective-n-Point

我试过的

1)我试图在 ARKit 中找到一个 PnP 求解器,但我找不到它,所以我猜它没有暴露。2) 我尝试使用商店中的 EmguCV 资产,这应该允许我在我的 Unity 项目中使用 openCV。OpenCV solvePnP 文档:https ://docs.opencv.org/3.3.0/d9/d0c/group__calib3d.html#ga50620f0e26e02caa2e9adc07b5fbf24e

问题:

ARKit 框架中是否有 PnP 求解器,如果没有,我如何在 Unity 项目中使用 EmguCV C# 包装器正确使用 openCV 的 PnP 求解器(要注意坐标系,正确的函数参数以提供像相机内在矩阵,如何解释输出以使相机姿势正确)?

我在尝试回答问题时遇到的问题:

使用 SolvePnPRansac 会导致 Unity-Editor 自身崩溃,即使我将它放在 try-catch 块中(可能我的输入参数有意外的格式)。仅使用solvePnP,我取得了更大的成功,但结果不是我所期望的。该文档指出,输出向量 rvec 和 tvec 对应于将对象从模型坐标系带到相机坐标系的平移和旋转。因此,如果我将相机置于 (0,0,0) 并观察 -z 方向,使对象位于 tvec 且具有欧拉旋转 rvec,我希望渲染的对象与我用于像素坐标对应的图像相似. 我误会了吗?

我的怀疑:openCV 的坐标系表明图像坐标 y 从上到下,而 z 和 x 保持向前向右。我尝试在 y 轴上反转 2D 和 3D 坐标,但它没有用

编辑 [我在这里删除了我的代码,因为自从我提出问题让它工作以来我改变了很多]

(许多中的一些)相关帖子 我看了其他 41 个带有标签 opencv-solvePnP 的 stackoverflow 问题,但没有一个与 Unity3D 或 c# 相关

使用 Unity3D 解决即插即用

没有答案

通过单应性或solvePnP()函数估计相机位姿

如何估计具有 3d 到 2d 点对应的相机姿势(使用 opencv)

区别:我需要在 unity3D c# 项目中进行

获取 pnp 或 posit 的 2d-3d 点对应关系

我明白了,我需要使用数学算法,这就是理论,但现在我如何使用我可以使用的库

0 投票
0 回答
377 浏览

opencv - OpenCV 相机校准和 SolvePNP 转换结果

我正在尝试使用棋盘初步校准传感器。我跑了大约 50 次,在校准相机后,我继续使用 solvepnp 来教授坐标系,因为我使用的是定义明确的棋盘来实际学习真实世界的坐标。

作为 SolvePnP 的输入,我使用所有角点值及其对应的现实世界距离。

我最大的问题是我从 SolvePvP 计算的转换矩阵有点奇怪。据我了解,平移矩阵是相机与坐标系之间的实际偏移量,我将其定义为棋盘的上半部分。但是我得到了完全随机的值,Tz 给了我一个大约 6000 的值,即使相机和棋盘之间的距离大约是 1600 毫米,而且我什至没有使用深度值作为 solvePnP 方法的参数。

关于可能关闭的任何输入?

代码示例:

每次运行总共 18 (6x3) 个结果,总共运行 50 次。

之后我校准相机:

之后,使用 cameraMatrix 和 distCoeffs,我通过使用左上角、右上角、左下角和右下角以及它们的真实世界坐标来使用 SolverPnP。

我从校准中得到的结果是:

0 投票
0 回答
1193 浏览

python - 如何从 cv2.decomposeProjectionMatrix 理解欧拉角?

我已经在互联网上搜索了几个小时关于如何理解cv2.decomposeProjectionMatrix.

我的问题似乎很简单,我有这架飞机的 2D 图像。 在此处输入图像描述 我希望能够从该图像中得出飞机相对于相机的方向。最终,我正在寻找外观凹陷(即方位角和仰角)。我的图像中选择的 2D 特征有相应的 3D 坐标 - 在我的代码中列出。

下面是我的输出图像,如您所见,向后投影的点似乎没有遵循中心线。我不完全确定我的代码是否按预期工作,因此请随时提供有用的输入。 在此处输入图像描述

提前致谢!!

0 投票
1 回答
213 浏览

opencv - 从 3D 三角点恢复姿势

我有一个立体摄像机设置,我使用 OpenCV 方法cv::triangulatePoints来检测 3D 空间中的棋盘角。我想知道采取这些三角点并准确估计棋盘的 3D 姿势的方法是什么

我在这里找到了一种方法,将点输入 PnP 算法:

http://answers.opencv.org/question/168400/triangulating-points-into-world-space-and-using-in-solvepnp/

虽然这是对我的问题的简单解决方案,但我不确定这是否完全正确,因为我对方法的大部分经验都是针对单机使用的。

任何见解将不胜感激!

0 投票
0 回答
397 浏览

python - OpenCV solvePnP:Blender 的完美坐标没有正确转换

我正在尝试使用 OpenCV 的 solvePnPRansac 方法来定位在 Blender 中加载的 3D 模型周围的相机位置。但是,手动输入点会给我一个不正确的 t/r 向量,而 cv2.projectPoints 得到的图像坐标是错误的,所以我怀疑输入的某些内容搞砸了。

我在 Blender 的任意单位中手动选择了 3D 模型上的 10 个点,并将它们用作世界坐标。我在 960x540 渲染图像中找到了这些点的相应位置,这些是我输入的 2D 坐标(按像素)。

相机的焦距和传感器尺寸设置为 40mm 焦距和 40x18mm 传感器,因为这是毫米,所以我手动测量了它们的长度(以像素为单位),大约为 916 像素和 412 像素 - 但是,这两组值都给了我坐标完全关闭。

对我来说,projectPoints 的输出是范围从 -13,000 到 20,000 的坐标。我认为我的输入值不正确,但我该如何解决?