问题标签 [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.
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 个不同图像帧)
我使用了近似相机模型和校准相机模型都给出了错误的平移向量。
我已经浏览了这里的链接并验证了我的校准程序,我做得正确。
我不确定哪里做错了,任何人都可以帮我解决这个问题。
提前致谢。
python - 使用opencv python获取错误的目标旋转角度
我正在尝试使用 opencv python 找出对象的旋转角度。为此,我已经检测到目标,然后我能够找出旋转向量,并将其转换为旋转矩阵,并从该矩阵计算欧拉角。但是当我在视频中旋转对象时,所有三个角度(x、y、z)都会发生变化,当我在平面上移动目标时也会发生变化,即使它显示出角度的变化。请建议我一些方法来获得准确的结果。
这是目标的图像:
所需输出:x = 5,y = 0,z = 0
电流输出:x = 6.1,y = 4.7,z = -2.0
opencv - opencv solvePnP,所有轴看起来都不错,除了 Y
我在图像数据集上运行 solvePnPRansac,具有 2d 特征点和三角化 3d 地标点。它运行良好,旋转、前轴和侧轴的结果看起来很棒。但是,Y 轴是完全错误的。
我正在根据数据集的基本事实测试输出,它会上升到应该下降的位置,并且很快就会偏离基本事实。其他轴保持锁定的时间要长得多。
这让我觉得很奇怪,其他轴怎么可能是正确的,而一个轴却是错误的?当然这是不可能的,我会认为要么每个轴都是坏的,要么每个轴都是好的。
我可能做错了什么才能做到这一点?我该如何调试这种怪异之处?我的 PnP 代码非常标准:
opencv - 通过旋转组合求解PNP vs recoverPose:为什么翻译不一样?
第 1 部分:更新前
我正在尝试使用两种不同的方法来估计相对位置:solvePNP 和recoverPose,并且似乎R矩阵在某些错误方面看起来不错,但平移向量完全不同。我究竟做错了什么?一般来说,我需要使用这两种方法找到从第 1 帧到第 2 帧的相对位置。
输出:
第 2 部分:更新后
更新:我改变了R -s 和t -s 在solvePnP之后的组合方式:
这个构图是用相机的实际运动检查的,看起来是正确的。
此外,recoverPose 现在从非平面对象获取点,并且这些点处于一般位置。测试的运动也不是纯旋转以避免退化情况,但平移向量仍然非常不同。
第一帧: 第一帧: 跟踪和匹配绿色点,可以在第二帧上看到(在第二帧上它们是蓝色的): 第二帧: 第二帧: 在恢复姿势的一般位置上的跟踪点:
输出:
我也尝试过相机静止不动(没有R,没有t)并且R -s 接近但翻译不接近的情况。那么我在这里缺少什么?
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
重投影也失败了。我很好奇这种变化是如何随着微小的变化而发生的。如何解决?
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# 相关
没有答案
如何估计具有 3d 到 2d 点对应的相机姿势(使用 opencv)
区别:我需要在 unity3D c# 项目中进行
我明白了,我需要使用数学算法,这就是理论,但现在我如何使用我可以使用的库
opencv - OpenCV 相机校准和 SolvePNP 转换结果
我正在尝试使用棋盘初步校准传感器。我跑了大约 50 次,在校准相机后,我继续使用 solvepnp 来教授坐标系,因为我使用的是定义明确的棋盘来实际学习真实世界的坐标。
作为 SolvePnP 的输入,我使用所有角点值及其对应的现实世界距离。
我最大的问题是我从 SolvePvP 计算的转换矩阵有点奇怪。据我了解,平移矩阵是相机与坐标系之间的实际偏移量,我将其定义为棋盘的上半部分。但是我得到了完全随机的值,Tz 给了我一个大约 6000 的值,即使相机和棋盘之间的距离大约是 1600 毫米,而且我什至没有使用深度值作为 solvePnP 方法的参数。
关于可能关闭的任何输入?
代码示例:
每次运行总共 18 (6x3) 个结果,总共运行 50 次。
之后我校准相机:
之后,使用 cameraMatrix 和 distCoeffs,我通过使用左上角、右上角、左下角和右下角以及它们的真实世界坐标来使用 SolverPnP。
我从校准中得到的结果是:
opencv - 从 3D 三角点恢复姿势
我有一个立体摄像机设置,我使用 OpenCV 方法cv::triangulatePoints来检测 3D 空间中的棋盘角。我想知道采取这些三角点并准确估计棋盘的 3D 姿势的方法是什么。
我在这里找到了一种方法,将点输入 PnP 算法:
虽然这是对我的问题的简单解决方案,但我不确定这是否完全正确,因为我对方法的大部分经验都是针对单机使用的。
任何见解将不胜感激!
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 的坐标。我认为我的输入值不正确,但我该如何解决?