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

opencv - OpenCV solvePnP 方法仅适用于小区域

当我尝试使用solvePnP算法进行识别时,我收到的数据有助于计算仅在我放入solvePnP函数的点的边界附近的大小。其他尺寸不正确。为什么?是原因 - 错误的相机校准?

也就是说,假设点数组[A]位于[Blob](约 15% 的图像)只有靠近点的点[Blob]具有正确的结果,而其他点是错误的。但是,如果我对[A1]位于的其他点数组执行相同操作,[Blob1]我将得到仅在 附近有效的其他结果[Blob1]。如果我使用数组总和,[A2] = [A] + [A1]我会收到完全不正确的结果。为什么?

0 投票
1 回答
267 浏览

c++ - 使用透视查找矩形对象质量

我从相机获取图像(已校准且没有镜头失真),我需要检测一个矩形物体。标记是一个很好的例子。对于标记,我检查角数、最小尺寸、板对比度和凸度。在存在大量错误矩形的情况下,我对如何改进这一点有了一个想法。这是一个示例图像:

图片

通常所有这些都是有效的,因为在不了解相机的情况下,我们无法确定透视是否允许这些形状。我知道现实生活中矩形的大小(或至少是比例)。所以我有一个想法,我应该能够通过重新投影它们并检查错误来忽略其中的许多形状。就像我使用 solvePnPRansac 一样,如果形状不可能,它将无法收敛。如果它不收敛,我只是无视它。可悲的是,没有一个 OpenCV 求解函数允许检查我是否有错误或收敛。我实际上需要一些比例或质量,因为某些矩形可能重叠。例如,我的对象查找器识别这些矩形:

重叠图像

这三个中的一个实际上是正确的,或者至少是“最好的”。但我需要一些方法来知道它是哪一个。由于相机的视角,我不能使用像线长这样的东西。所以我只是想我可以解决并看看哪个错误最小。

图像中没有镜头失真,但即使有solvePnP通常也允许将D传递给它。这甚至可能还是我错过了什么?我想我可以尝试破解solvePnPRansac只是为了返回收敛,但也许有更简单的方法?

0 投票
1 回答
1213 浏览

c++ - 平面三角形的solvePNP

我有一个非常简单的任务:获取平面三角形的欧拉角。图案看起来像这样

所以,算法:

1)从网络摄像头获取图像——完成

2)转换为灰度、过滤器等——完成

3)获取所有连接组件的质心,并过滤它们——完成。看起来像这样。红色圆圈描述三角形顶点的质心。

代码很简单,但这里是:

4)然后我调用solvePNP来获取旋转和平移向量

m_origin被声明为std::vector<cv::Point3f> m_origin;并用值填充(以 mm 为单位)

m_imagePoints被声明为std::vector<cv::Point2f> m_imagePoints;并包含质心的像素坐标(第二个屏幕上的红色圆圈)。

我得到了很奇怪的结果:从这个那个

我尝试了什么但对我没有帮助:

1) 在 m_cameraMatrix、m_distMatrix、m_rvec、m_tvec 中使用了 double 和 float 类型

2) 重新排列 m_origin 中的点

3)用solvePnPRansac和它的输入参数玩

4) 使用 pnp 方法:迭代和 epnp

5) useExtrinsicGuess=true - 它有帮助,但有时解决方案会“卡住”并给出完全错误的值(旋转向量中的千度)

我有几个问题:

1)原点和图像点的顺序重要吗?正如这里提到的,有时确实如此,但那是一年前的事了。

2)除了使用solvePnP之外,我的任务可以通过其他方式解决吗?

谢谢。将不胜感激任何帮助!

0 投票
2 回答
1158 浏览

camera - 姿态估计:判断旋转和变换矩阵是否正确

最近,我正在努力解决单个相机的姿势估计问题。我在图像上有一些 3D 点和相应的 2D 点。然后我使用solvePnP来获取旋转和平移向量。问题是,如何确定向量是否是正确的结果?

现在我使用一种间接的方式来做到这一点:
我使用旋转矩阵、平移向量和某个点的世界 3D 坐标来获得该点在 Camera 系统中的坐标。那么我所要做的就是确定坐标是否合理。我想我知道相机系统的 x、y 和 z 轴的方向。

  • 相机中心是相机系统的起源吗?
  • 现在考虑该点的 x 分量。x是否等于相机与世界空间中Camera x轴方向上的点的距离(符号可以通过该点放置在相机的哪一侧来确定)?

下图在世界空间中,而描绘的轴在相机系统中。

图片在这里

我的 rvec 和 tvec 结果似乎对与错。对于一个指定的点,z 值似乎是合理的,我的意思是,如果这个点在 z 方向上距离相机大约一米,那么 z 值大约是 1。但是对于 x 和 y,根据位置点我认为 x 和 y 应该是积极的,但他们是消极的。更重要的是,在原始图像中检测到的图案是这样的:

使用从相机捕获的图像中进行特征检测的图案图像

但是使用相机系统中计算的点坐标和相机内在参数,我得到这样的图像:

恢复图像

目标保持其模式。但它从右下角移动到左上角。我不明白为什么。

0 投票
0 回答
237 浏览

python - 使用 OpenCV 和 Python 匹配缩放和旋转图像中模板的给定坐标

这是从相机拍摄的图像, 我试图获取相机位置和相机的偏航、俯仰、滚动角度。但是我被困在图片中的变形物体上。

我的做法是——

1)使用 ORB 算法找到匹配的坐标,但我被卡住了,因为我找不到任何东西来获取坐标。2)然后必须使用坐标找到对象和图像矩阵。3)应用solvePnP

我需要帮助来找到模板的精确匹配坐标。就我而言,它是一个二维码。

我需要匹配图片中二维码的位置、方向,找到相机的位置和角度。

提前致谢

0 投票
1 回答
163 浏览

c++ - 如何从我的旋转和平移矩阵计算内点?

在使用cv::solvePnPRansac估计相机位姿时,输入是objectPointsimagePoints。输出是旋转和平移矩阵,加上内 点数

我使用 GA “Gigantic algorithm” 来生成一个新的旋转和平移矩阵。我喜欢使用我的新旋转和平移来计算内点数。

如果我有点列表 std::vector objectPoints; std::vector imagePoints; 和 cameraMatrix 和distCoeffs 我有旋转和平移矩阵,如何计算内点?我知道 cv::solvePnPRansac 会从两点列表中计算内点、旋转和平移,但是我需要从旋转和平移中计算内点吗?

谢谢你的支持

0 投票
1 回答
5529 浏览

opencv - 为什么直接线性变换 (DLT) 不能提供最佳的相机外在参数?

我正在阅读solvePnP()OpenCV 中函数的源代码,当flags参数使用默认值SOLVEPNP_ITERATIVE时,它正在调用cvFindExtrinsicCameraParams2,其中它首先使用DLT算法(如果我们有一组非平面的 3D 点)来初始化 6DOF 相机姿势,和 SECOND 用于CvLevMarq solver最小化重投影误差。

我的问题是:DLT 将问题表述为线性最小二乘问题并用 SVD 分解来解决,这似乎是一个最优解,为什么我们之后仍然使用 Lev-Marq 迭代方法?

或者,DLT 算法劣势的问题/限制是什么?为什么封闭形式的解决方案会导致成本函数的LOCAL最小值?

0 投票
1 回答
1799 浏览

python - OpenCV:SolvePnP 对相同的输入参数给出不同的结果

我正在尝试估计solvePnP在 python 中使用的对象的 3D 姿势。但问题是,即使我将相机和对象都保持静止,solvePnP(rvectvec) 的输出也会发生变化。世界坐标系以对象为中心并随之移动。我正在传递 4 个图像点和相应的 4 个对象点。

调用 SolvePnP:

输出 1:

输出 2:

物点和图像点是相同的,但solvePnP 仍然给出几个不同的结果。上述结果是一个接一个交替的帧。

我应该如何解决?

0 投票
1 回答
2881 浏览

python - OpenCV 错误:undistort.cpp 中第 293 行的断言失败

在https://github.com/opencv/opencv/issues/4943找到解决方案

OpenCV 错误:

断言失败 (CV_IS_MAT(_src) && CV_IS_MAT(_dst) && (_src->rows == 1 || _src->cols == 1) && (_dst->rows == 1 || _dst->cols == 1) && _src->cols + _src->rows - 1 == _dst->rows + _dst->cols - 1 && (CV_MAT_TYPE(_src->type) == CV_32FC2 || CV_MAT_TYPE(_src->type) == CV_64FC2) && (CV_MAT_TYPE(_dst->type) == CV_32FC2 || CV_MAT_TYPE(_dst->type) == CV_64FC2)) 在 cvUndistortPoints,文件 /home/javvaji/opencv-3.2.0/modules/imgproc/src/undistort.cpp ,第 293 行

我正在使用带有 SOLVEPNP_P3P 标志的 solvePnP 函数。它给出了断言错误。相同的solvePnP 代码与SOLVEPNP_ITERATIVE 标志一起工作正常。使用 P3P 标志,它在内部调用 undistortPoints 函数,该函数给出错误。

解决即插即用代码参考

如何解决这个问题?

0 投票
1 回答
5007 浏览

c++ - OpenCV 求解PnPRansac

我在 Windows 上使用 OpenCV 3.1。

一段代码:

输出类似于:

因此,无论开始的假设如何,我都会得到完全相同的最终结果。

继续前进,我将迭代次数从 100 次

只有1 次迭代

结果相同:

进一步,将置信度参数从0.99

低至0.01

结果相同:

与内部阈值参数相同。似乎这些论点似乎没有任何区别。结果实际上看起来还不错,我只是想更好地理解它。

所以,我的结论是,solvePnPRansac()不管论据如何,它都会做同样的事情。我究竟做错了什么?