问题标签 [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.
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。
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) 不准确时,常见的错误是什么?
python - solvePnP/solvePnPRansac 不能提供良好的相机位置估计
我正在尝试使用此代码通过在图片中定位平面图像来查找相机位置:
https://docs.opencv.org/3.3.1/d1/de0/tutorial_py_feature_homography.html
对于这张图片,它可以正常工作:
并找到模式。我使用 cv2.projectPoints 在背景图片上绘制图像:
但有时solvePnP会返回疯狂的结果,例如这张图片:
如果我重新投影模式,我会得到疯狂的图像位置:
对于这种情况,我已经验证了 SIFT 点,它们看起来正确并且匹配:
我尝试使用solvePnPRansac而不是solvePnP,但它没有帮助,估计位置仍然很糟糕。可能是什么原因,我该如何解决这个问题?
opencv - opencv Vec3d 到 Eigen::Quaternion,欧拉翻转结果
我正在使用 opencv::solvePnP 返回相机姿势。我运行 PnP,它返回 rvec 和 tvec 值。(旋转向量和位置)。
然后我运行此函数将值转换为相机姿势:
这是可行的,但在某些旋转角度,转换后的旋转值会在正值和负值之间随机翻转。然而,源rvecV
值没有。我认为这意味着我的转换出错了。如何从 PnP 返回的 cv::Vec3d 中获得稳定的四元数?
编辑:这似乎是四元数翻转,如此处所述:
基于此,我尝试添加:
但我看到同样的翻转。
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位置:
有人能帮我吗?
这个问题困扰了我很久,也没有找到相关的答案。
感谢您的时间!
opencv - 比较 openCv PnP 与 openGv PnP
我正在尝试构建一个测试项目以将 openCv solvePnP 实现与 openGv 实现进行比较。
opencv在这里详细介绍:
和这里的openGv:
https://laurentkneip.github.io/opengv/page_how_to_use.html
使用 opencv 示例代码,我在图像中找到一个棋盘,并构建匹配的 3d 点。我运行 cv pnp,然后设置 Gv 求解器。cv pnp 运行良好,并打印值:
我通过重新投影 3d 点进行测试,它看起来不错。
然而,Gv Pnp 为所有值打印 nan。我试图按照示例代码进行操作,但我一定在某处犯了错误。代码是:
我在设置 openGv Pnp 求解器时哪里出错了?
python - cv2.solvePnP 的返回值实际上在哪里保持相机的位置?
现实世界中有一个立方体和一个相机。每个点的坐标如下图所示。很明显,相机的坐标在[0,0,1]
。
我们可以计算出每个位置在屏幕上的显示坐标。
结果,我们得到
现在,我想计算相机的位置,我们定义为[0,0,1]
。
结果看起来像这样。
去哪儿了[0,0,1]
?
免责声明:我从本文中借用了数字和代码。
opencv - OpenCV:如何使用欧拉角确定相机方向
我有一个关于如何使用 EulerAngle 来确定相机方向的问题首先,我使用了 solvePnP 函数并得到了两个输出“rvec”和“tvec”,然后我使用 Rodrigues 将 rvec 转换为旋转矩阵“R”。之后,我使用以下函数计算了 EulerAngle:
{
我知道不同的旋转顺序会产生不同的结果。所以如果我想获得相机的方向,我应该选择什么样的旋转顺序?
c# - 相机旋转 SolvePnp
有人可以帮助我计算相机的 Y 旋转吗?我使用 SolvePnP 来获取 rvec。从这个 rvec 我想知道我的相机围绕它自己的 Y 轴旋转了多少。
我不确定如何继续,以便获得一个代表相机 Y 旋转的值。
编辑
我设法使用 DllImport 和@Tahera.T 的答案在 C# 中工作。现在我收到一个错误,我认为这与我为函数提供的变量有关。如果我以正确的方式进行操作,有人可以看看吗?
我现在得到的错误是:
带有错误代码:
我是否使用错误的变量调用函数?