问题标签 [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.
opencv - OpenCV solvePnP 方法仅适用于小区域
当我尝试使用solvePnP算法进行识别时,我收到的数据有助于计算仅在我放入solvePnP函数的点的边界附近的大小。其他尺寸不正确。为什么?是原因 - 错误的相机校准?
也就是说,假设点数组[A]
位于[Blob]
(约 15% 的图像)只有靠近点的点[Blob]
具有正确的结果,而其他点是错误的。但是,如果我对[A1]
位于的其他点数组执行相同操作,[Blob1]
我将得到仅在 附近有效的其他结果[Blob1]
。如果我使用数组总和,[A2] = [A] + [A1]
我会收到完全不正确的结果。为什么?
c++ - 使用透视查找矩形对象质量
我从相机获取图像(已校准且没有镜头失真),我需要检测一个矩形物体。标记是一个很好的例子。对于标记,我检查角数、最小尺寸、板对比度和凸度。在存在大量错误矩形的情况下,我对如何改进这一点有了一个想法。这是一个示例图像:
通常所有这些都是有效的,因为在不了解相机的情况下,我们无法确定透视是否允许这些形状。我知道现实生活中矩形的大小(或至少是比例)。所以我有一个想法,我应该能够通过重新投影它们并检查错误来忽略其中的许多形状。就像我使用 solvePnPRansac 一样,如果形状不可能,它将无法收敛。如果它不收敛,我只是无视它。可悲的是,没有一个 OpenCV 求解函数允许检查我是否有错误或收敛。我实际上需要一些比例或质量,因为某些矩形可能重叠。例如,我的对象查找器识别这些矩形:
这三个中的一个实际上是正确的,或者至少是“最好的”。但我需要一些方法来知道它是哪一个。由于相机的视角,我不能使用像线长这样的东西。所以我只是想我可以解决并看看哪个错误最小。
图像中没有镜头失真,但即使有solvePnP通常也允许将D传递给它。这甚至可能还是我错过了什么?我想我可以尝试破解solvePnPRansac只是为了返回收敛,但也许有更简单的方法?
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之外,我的任务可以通过其他方式解决吗?
谢谢。将不胜感激任何帮助!
camera - 姿态估计:判断旋转和变换矩阵是否正确
最近,我正在努力解决单个相机的姿势估计问题。我在图像上有一些 3D 点和相应的 2D 点。然后我使用solvePnP来获取旋转和平移向量。问题是,如何确定向量是否是正确的结果?
现在我使用一种间接的方式来做到这一点:
我使用旋转矩阵、平移向量和某个点的世界 3D 坐标来获得该点在 Camera 系统中的坐标。那么我所要做的就是确定坐标是否合理。我想我知道相机系统的 x、y 和 z 轴的方向。
- 相机中心是相机系统的起源吗?
- 现在考虑该点的 x 分量。x是否等于相机与世界空间中Camera x轴方向上的点的距离(符号可以通过该点放置在相机的哪一侧来确定)?
下图在世界空间中,而描绘的轴在相机系统中。
我的 rvec 和 tvec 结果似乎对与错。对于一个指定的点,z 值似乎是合理的,我的意思是,如果这个点在 z 方向上距离相机大约一米,那么 z 值大约是 1。但是对于 x 和 y,根据位置点我认为 x 和 y 应该是积极的,但他们是消极的。更重要的是,在原始图像中检测到的图案是这样的:
但是使用相机系统中计算的点坐标和相机内在参数,我得到这样的图像:
目标保持其模式。但它从右下角移动到左上角。我不明白为什么。
python - 使用 OpenCV 和 Python 匹配缩放和旋转图像中模板的给定坐标
这是从相机拍摄的图像, 我试图获取相机位置和相机的偏航、俯仰、滚动角度。但是我被困在图片中的变形物体上。
我的做法是——
1)使用 ORB 算法找到匹配的坐标,但我被卡住了,因为我找不到任何东西来获取坐标。2)然后必须使用坐标找到对象和图像矩阵。3)应用solvePnP
我需要帮助来找到模板的精确匹配坐标。就我而言,它是一个二维码。
我需要匹配图片中二维码的位置、方向,找到相机的位置和角度。
提前致谢
c++ - 如何从我的旋转和平移矩阵计算内点?
在使用cv::solvePnPRansac估计相机位姿时,输入是objectPoints和imagePoints。输出是旋转和平移矩阵,加上内 点数
我使用 GA “Gigantic algorithm” 来生成一个新的旋转和平移矩阵。我喜欢使用我的新旋转和平移来计算内点数。
如果我有点列表 std::vector objectPoints; std::vector imagePoints; 和 cameraMatrix 和distCoeffs 我有旋转和平移矩阵,如何计算内点?我知道 cv::solvePnPRansac 会从两点列表中计算内点、旋转和平移,但是我需要从旋转和平移中计算内点吗?
谢谢你的支持
opencv - 为什么直接线性变换 (DLT) 不能提供最佳的相机外在参数?
我正在阅读solvePnP()
OpenCV 中函数的源代码,当flags
参数使用默认值SOLVEPNP_ITERATIVE
时,它正在调用cvFindExtrinsicCameraParams2
,其中它首先使用DLT算法(如果我们有一组非平面的 3D 点)来初始化 6DOF 相机姿势,和 SECOND 用于CvLevMarq solver
最小化重投影误差。
我的问题是:DLT 将问题表述为线性最小二乘问题并用 SVD 分解来解决,这似乎是一个最优解,为什么我们之后仍然使用 Lev-Marq 迭代方法?
或者,DLT 算法劣势的问题/限制是什么?为什么封闭形式的解决方案会导致成本函数的LOCAL最小值?
python - OpenCV:SolvePnP 对相同的输入参数给出不同的结果
我正在尝试估计solvePnP
在 python 中使用的对象的 3D 姿势。但问题是,即使我将相机和对象都保持静止,solvePnP
(rvec
和tvec
) 的输出也会发生变化。世界坐标系以对象为中心并随之移动。我正在传递 4 个图像点和相应的 4 个对象点。
调用 SolvePnP:
输出 1:
输出 2:
物点和图像点是相同的,但solvePnP 仍然给出几个不同的结果。上述结果是一个接一个交替的帧。
我应该如何解决?
python - OpenCV 错误:undistort.cpp 中第 293 行的断言失败
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 函数,该函数给出错误。
如何解决这个问题?
c++ - OpenCV 求解PnPRansac
我在 Windows 上使用 OpenCV 3.1。
一段代码:
输出类似于:
因此,无论开始的假设如何,我都会得到完全相同的最终结果。
继续前进,我将迭代次数从 100 次
只有1 次迭代
结果相同:
进一步,将置信度参数从0.99
低至0.01
结果相同:
与内部阈值参数相同。似乎这些论点似乎没有任何区别。结果实际上看起来还不错,我只是想更好地理解它。
所以,我的结论是,solvePnPRansac()
不管论据如何,它都会做同样的事情。我究竟做错了什么?