问题标签 [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 投票
1 回答
990 浏览

python - solvePnP 的输出与 projectPoints 不匹配

我从solvePnP得到奇怪的数据,所以我尝试用projectPoints检查它:

这里 opts 是 z=0 的 3d 点,在这张图片上检测到:

在此处输入图像描述

并且 ipts 取自这张图片(这里只是图片的一部分):

在此处输入图像描述

我自己检查了点(用 SIFT 检测,点被正确检测并以正确的方式配对)。

现在我想测试 SolvePnP 找到的 rvec 和 tvec 是否正确,所以我调用 cv2.projectPoint 来测试 3d 点是否投影到图像点。这就是我所拥有的:

在此处输入图像描述

所以我看到投影点位于图像之外,y<0。

(solvePnP 的 retval 为真)

这是失真矩阵 dist:

这是mtx:

这是选择:

这是ipts:

此外,我尝试关注其中一条评论,并将 opts 中的每个 y 乘以 -1,但这给了我更疯狂的坐标,例如 10^13。

0 投票
1 回答
536 浏览

opencv - 使用 OpenCV SolvePnP 进行高架相机的姿态估计会导致高度偏离几厘米

我想获得高架摄像机的姿势(平移:x、y、z 和旋转:世界坐标系中的 Rx、Ry、Rz)。通过用机械臂移动 ChArUco 校准板(如https://www.youtube.com/watch?v=8q99dUPYCPs),我得到了许多对象点和图像点。因此,我已经有了所有对象点的确切位置。

为了向 提供许多点solvePnP,我将第一个检测到的模式(ChArUco 板)设置为第一个对象,并将其用作对象坐标系的原点。然后,我将检测到的对象点(从第二个模式到最后一个模式)添加到第一个检测到的对象点的坐标系(对象框架的原点是第一个对象的原点)。

在我得到相机和物体坐标系之间的转换后,我根据该转换计算了相机的位姿。

结果一开始看起来还不错,但是当我用尺子或卷尺测量相机的绝对位姿时,我注意到外部校准结果对于 z 方向(相机的高度)大约偏离了 15-20 毫米,尽管对于其他(x、y、Rx、Ry、Rz)几乎是正确的。即使我通过不同地移动机械臂来改变对象点的范围,结果也是一样的,它最终总是会偏离高度几厘米。

有没有人遇到过类似的问题?我想知道我可以尝试的任何事情。当深度方向 (z) 不准确时,常见的错误是什么?

0 投票
1 回答
1629 浏览

python - solvePnP/solvePnPRansac 不能提供良好的相机位置估计

我正在尝试使用此代码通过在图片中定位平面图像来查找相机位置:

https://docs.opencv.org/3.3.1/d1/de0/tutorial_py_feature_homography.html

对于这张图片,它可以正常工作:

在此处输入图像描述

并找到模式。我使用 cv2.projectPoints 在背景图片上绘制图像:

在此处输入图像描述

但有时solvePnP会返回疯狂的结果,例如这张图片:

在此处输入图像描述

如果我重新投影模式,我会得到疯狂的图像位置:

在此处输入图像描述

对于这种情况,我已经验证了 SIFT 点,它们看起来正确并且匹配:

在此处输入图像描述

我尝试使用solvePnPRansac而不是solvePnP,但它没有帮助,估计位置仍然很糟糕。可能是什么原因,我该如何解决这个问题?

0 投票
2 回答
1580 浏览

opencv - opencv Vec3d 到 Eigen::Quaternion,欧拉翻转结果

我正在使用 opencv::solvePnP 返回相机姿势。我运行 PnP,它返回 rvec 和 tvec 值。(旋转向量和位置)。

然后我运行此函数将值转换为相机姿势:

这是可行的,但在某些旋转角度,转换后的旋转值会在正值和负值之间随机翻转。然而,源rvecV值没有。我认为这意味着我的转换出错了。如何从 PnP 返回的 cv::Vec3d 中获得稳定的四元数?

编辑:这似乎是四元数翻转,如此处所述:

四元数正在翻转符号以进行非常相似的旋转?

基于此,我尝试添加:

但我看到同样的翻转。

0 投票
0 回答
1250 浏览

c++ - 为什么我在 opencv 中的 solvePNP() 函数得到错误的结果,但 MATLAB 得到更合理的结果?

详细信息:
我在 ROS Kinetic 中使用 OpenCV3 中的 solvePnP() 来通过 LED 标记估计我的机器人的姿势。
相机分辨率为128*128。
当我在 opencv 中运行我的代码时,它总是返回荒谬的结果。
似乎我不了解 PNP,但 MATLAB 得到了更合理的结果。
阅读 OpenCV 和 Matlab 文档后,我仍然感到困惑。我不知道我哪里错了。

这是C++代码:

CV_ITERATIVE 函数的结果如下所示:

CV_EPNP 函数的结果如下图所示:

CV_P3P 函数的结果如下图所示:

这是 Matlab 代码:

Matlab(P3P)函数的结果如下图所示:

相机支架的groundtruth位置:

有人能帮我吗?

这个问题困扰了我很久,也没有找到相关的答案。
感谢您的时间!

0 投票
1 回答
720 浏览

opencv - 比较 openCv PnP 与 openGv PnP

我正在尝试构建一个测试项目以将 openCv solvePnP 实现与 openGv 实现进行比较。

opencv在这里详细介绍:

https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#solvepnp

和这里的openGv:

https://laurentkneip.github.io/opengv/page_how_to_use.html

使用 opencv 示例代码,我在图像中找到一个棋盘,并构建匹配的 3d 点。我运行 cv pnp,然后设置 Gv 求解器。cv pnp 运行良好,并打印值:

我通过重新投影 3d 点进行测试,它看起来不错。

然而,Gv Pnp 为所有值打印 nan。我试图按照示例代码进行操作,但我一定在某处犯了错误。代码是:

我在设置 openGv Pnp 求解器时哪里出错了?

0 投票
0 回答
167 浏览

c++ - 将相机对准目标

我正在做一个小项目,将相机对准固定目标(以毫米为单位的尺寸是已知的)。目标必须在相机图像中水平和垂直居中对齐,不能旋转。为了实现这一点,相机安装在具有 6DoF 的设备上,因此相机可以在 x、y、z 方向上平移并在俯仰、滚动、偏航方向上旋转。图像中的目标是通过在其角落使用四个标记来检测的。我尝试了以下但对齐不正确。

结果值不正确,无法像图片中那样以目标对齐的方式移动相机。我究竟做错了什么?我混合了不同的坐标系吗?

在此处输入图像描述

0 投票
0 回答
526 浏览

python - cv2.solvePnP 的返回值实际上在哪里保持相机的位置?

现实世界中有一个立方体和一个相机。每个点的坐标如下图所示。很明显,相机的坐标在[0,0,1]在此处输入图像描述

我们可以计算出每个位置在屏幕上的显示坐标。

结果,我们得到

现在,我想计算相机的位置,我们定义为[0,0,1]

结果看起来像这样。

去哪儿了[0,0,1]

免责声明:我从本文中借用了数字和代码。

0 投票
1 回答
696 浏览

opencv - OpenCV:如何使用欧拉角确定相机方向

我有一个关于如何使用 EulerAngle 来确定相机方向的问题首先,我使用了 solvePnP 函数并得到了两个输出“rvec”和“tvec”,然后我使用 Rodrigues 将 rvec 转换为旋转矩阵“R”。之后,我使用以下函数计算了 EulerAngle:

{

我知道不同的旋转顺序会产生不同的结果。所以如果我想获得相机的方向,我应该选择什么样的旋转顺序?

0 投票
1 回答
1128 浏览

c# - 相机旋转 SolvePnp

有人可以帮助我计算相机的 Y 旋转吗?我使用 SolvePnP 来获取 rvec。从这个 rvec 我想知道我的相机围绕它自己的 Y 轴旋转了多少。

我不确定如何继续,以便获得一个代表相机 Y 旋转的值。

编辑

我设法使用 DllImport 和@Tahera.T 的答案在 C# 中工作。现在我收到一个错误,我认为这与我为函数提供的变量有关。如果我以正确的方式进行操作,有人可以看看吗?

我现在得到的错误是:

带有错误代码:

我是否使用错误的变量调用函数?