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

opencv - OpenCV solvePnPRansac 总是返回 0

我一直在使用 ORB 功能来匹配两个视频帧,这两个视频帧预先假设有一些共同的特征。后来,solvePnPRansac 估计了一个转换,它在今天进行一些修改之前工作得相对较好。我今天将一个函数分成两部分(2 个独立函数),其中一个提取特征,另一个执行匹配。solvePnPRansac 可以毫无问题地返回转换结果,但经过这样的修改后它只给出零矩阵,我可以弄清楚这有什么问题。

在此处输入图像描述

这是我的代码

PNP_RESULT 被简单地定义为包含 rvec、tvec 和 inliers 的结构。此外,我还修改了该代码以使用 FLANN 匹配 SURF、SIFT 而不是 ORB,但没有任何改变。

0 投票
3 回答
5367 浏览

python - 来自solvePnP的相机姿势

目标

我需要检索相机的位置和姿态角(使用 OpenCV / Python)。

定义

姿态角定义为:

偏航是相机放置在水平面上时的大致方向:朝向北=0,朝向东=90°,南=180°,西=270°,等等。

俯仰是相机的“鼻子”方向:0° = 水平看地平线上的一点,-90° = 垂直向下看,+90° = 垂直向上看,45° = 以 45° 的角度向上看从地平线等

如果相机在您手中时向左或向右倾斜,则滚动(因此当该角度变化时,它总是看着地平线上的一个点):+45° = 当您抓住相机时顺时针旋转倾斜 45°,因此 +90°(和 -90°)将是例如肖像图片所需的角度等。

世界参考系:

我的世界参考系是这样定位的:

Toward east = +X
Toward north = +Y
Up toward the sky = +Z

我的世界对象点在该参考系中给出。

相机参考系:

根据文档,相机参考框架的方向如下: 相机参考系

要达到什么

现在,从cv2.solvepnp()一堆图像点及其对应的世界坐标中,我计算了rvectvec
但是,根据文档:http ://docs.opencv.org/trunk/d9/d0c/group__calib3d.html#ga549c2075fac14829ff4a58bc931c033d ,它们是:

rvec ; 输出旋转矢量(参见Rodrigues()),它与 一起tvec将点从模型坐标系带到相机坐标系。
tvec ; 输出平移向量。

这些向量被赋予到相机参考系。
我需要进行精确的逆运算,从而检索相机相对于世界坐标的位置和姿态。

摄像头位置:

所以我从rvecwith计算了旋转矩阵Rodrigues()

如果我在这里,在世界坐标系中表示的相机位置由下式给出:

(src:来自 cv::solvePnP 的世界坐标中的相机位置
这看起来相当不错。


相机姿态(偏航、俯仰和滚动):

但是如何从相机的角度(就好像它基本上在你手中一样)检索相应的姿态角(如上所述的偏航、俯仰和滚动)?

我试过在一个函数中实现这个: http ://planning.cs.uiuc.edu/node102.html#eqn:yprmat:

但结果与我想要的不一致。例如,我的滚动角约为 -90°,但相机是水平的,所以它应该在 0 左右。

俯仰角在 0 左右,所以看起来是正确确定的,但我真的不明白为什么它在 0 左右,因为相机参考框架的 Z 轴是水平的,所以它已经从世界的垂直轴倾斜 90°参考范围。我预计这里的值为 -90° 或 +270°。反正。

偏航似乎很好。主要是。

问题

我错过了滚动角的东西吗?

0 投票
1 回答
714 浏览

python - Python:solvePnP() 没有足够的值来解压?

我在使用cv2.solvePnP从 OpenCV 调用的函数时遇到问题。该函数用于获取棋盘的姿态估计。在下面的代码之后,我得到一个错误:

错误说:

ret,rotationVectors,translationVectors,inliers = cv2.solvePnP(objp,corners2,matrix,distortion)ValueError:没有足够的值来解包(预期4,得到3)

0 投票
0 回答
958 浏览

android - 用于显示 AR 内容的 2D 图像的特征检测和跟踪

我正在开发一个 Android 应用程序,我想在其中跟踪 2D 图像/一张纸,分析用户在其上写/画的内容,并在其上正确显示不同的 3D 内容。

我正在研究跟踪和显示简单的 3D 内容部分,这实际上可以使用 Vuforia 和 Wikitude 等 SDK 来实现。但是,我不使用它们有几个原因。

  • 还需要对图像进行其他分析,例如图纸分析。
  • 图像可能没有那么丰富的特征,例如带有线条或一些图形的纸张。
  • 像 Vuforia 这样的 SDK 可能不会向开发人员公开一些底层功能,如特征检测等。

无论如何,现在我只想达到以下结果。

  1. 我有一张纸,上面可能有线条和数字。你可以把它想象成一种让孩子们练习写作或绘画的纸。示例:https ://i.pinimg.com/236x/89/3a/80/893a80336adab4120ff197010cd7f6a1--dr-seuss-crafts-notebook-paper.jpg
  2. 在捕捉视频帧时,我将手机(相机)对准纸张。
  3. 我想注册纸张,跟踪它并在上面显示一个简单的线框立方体。

我一直在使用 OpenCV,并尝试了以下方法。

使用单应性:

  1. 检测 2D 图像中的特征(ORB、FAST 等)。
  2. 描述特征(ORB)。
  3. 在每个视频帧中执行相同的操作。
  4. 匹配特征并找到好的匹配。
  5. 找到单应性,使用单应性并成功在视频帧中的图像周围绘制一个矩形。
  6. 不知道如何使用单应性分解(旋转、平移和法线)来显示像立方体一样的 3D 对象。

使用solvePnP:

1~4与上述相同。

  1. 通过假设图像位于世界的 xy 平面上,将图像中的所有 2D 良好匹配点转换为 3D,因此所有匹配点的 z = 0。
  2. 对当前帧中的那些 3D 点和 2D 点使用 solvePnP 来检索旋转和平移向量,并使用 OpenCV 中的 Rodrigues() 进一步将其转换为投影矩阵。
  3. 构建立方体的 3D 点。
  4. 使用投影和相机矩阵将它们投影到 2D 图像中。
  5. 问题是立方体跳来跳去,我认为这是由于特征检测和映射不稳定和准确,从而影响solvePnP。

使用轮廓或角:

我只是对相机框架进行灰度化,对其进行高斯平滑,扩大或侵蚀它并尝试找到最大的 4 边缘轮廓,以便我可以使用solvePnP 等跟踪它。不出所料,这并没有给出好的结果,或者我'我只是做错了。

所以我的问题是:

  • 如何解决上面提到的两个大胆的问题。
  • 更一般地说,给定我要跟踪的图像目标的类型,跟踪它的最佳算法/解决方案/技术是什么?
  • 在解决问题的方式中,我可以改进/改变哪些事情?

非常感谢。

0 投票
1 回答
4490 浏览

opencv - 了解solvePnP算法

我无法理解Perspective-n-Point问题。几个问题:

  1. s为了什么?为什么我们需要图像点的比例因子?

  2. 是一个将同质世界点移动到二维图像平面的坐标空间中的K[R|T]“坐标变化矩阵”吗?p_w

  3. 我知道这[R|T]代表了相机对于相应世界点的“旋转和平移”,p_w这就是我们要解决的问题。这有什么特别困难的?我们不能说[R|T] =inv(K)s(p_c)inv(p_w)吗?我只是用一些基本的矩阵代数做到了这一点。
  4. 我不明白为什么 PnP 有多种解决方案……这些多种解决方案到底是什么?

谢谢你的帮助!

0 投票
1 回答
3824 浏览

opencv - 来自solvePnP的rvec/tvec与来自calibrateCamera的rvec/tvec

我已经阅读了这个答案,但我仍然不明白rvec/tvec返回的对calibrateCamerarvec/tvec返回的对solvePnP

我了解这里给出的solvePnP解决方案。[R|T]

在此处输入图像描述

这很清楚——这是从世界点到图像平面的仿射变换。以及相机矩阵K[R|T]投影K[R|T]矩阵。

但是,我似乎无法找到rvec/tvec返回的目的calibrateCamera是什么。

0 投票
1 回答
709 浏览

c++ - OpenCV solvePnP获取图案原点相对于相机的位置

我目前正在尝试通过获取两个摄像机都可以看到的跟踪模式的位置来获取两个 Kinect v2 的相对位置。不幸的是,我似乎无法获得模式原点的正确位置。

这是我当前获取图案相对于相机位置的代码:

不幸的是,当我比较originPosition点云中与屏幕空间中的原点相对应的点(保存在centers.at(0)上面)时,我得到了一个非常不同的结果。下面的屏幕截图显示了来自 kinect 的点云,其中红色圆圈中图案原点的屏幕空间位置的点为红色,originPosition浅蓝色圆圈中的点为浅蓝色。屏幕截图是从图案的正前方截取的。originPosition也更靠前一些 。在屏幕空间中找到的图案原点为红色圆圈中的红点,solvePnP 3D 位置为浅蓝色圆圈中的浅蓝色点

如您所见,红点完美地位于图案的第一个圆圈中,而对应的蓝点originPosition甚至没有靠近。特别是它绝对不仅仅是从相机到原点的矢量缩放问题。此外,findCirclesGrid在注册的彩色图像上完成,并且从相机本身获取内在参数,以确保图像和点云计算之间没有差异。

0 投票
0 回答
1356 浏览

opencv - OpenCV 到 WebGL

我正在尝试将OpenCVWebGL一起使用。

OpenCV中,我正在寻找使用 SolvePnp 获得的投影(相机的先验投影矩阵)。当我使用“projectPoints”函数显示在 OpenCV 中获得的投影时,一切都完全停止了。

在此处输入图像描述

SolvePnp函数返回 3值用于旋转和 3 个值用于平移。我还使用值fx、fy、cx、cy(参见:https ://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#solvepnp)得到了cameraMatrix(矩阵3x3 )。

一旦所有这些值都恢复了,我尝试将它们与WebGL一起使用。但目前它不起作用。


在 WebGL 中,我以两种不同的方式计算projectionMatrix :

m4.perspective (28 / 180.0 * Math.PI, aspect, 0.1, 1000);

或通过以下示例(https://blog.noctua-software.com/opencv-opengl-projection-matrix.html

openCVToProjectionMatrix (fx, fy, cx, cy, 0.1, 1000, wSource, hSource);

然后我创建了cameraMatrix并将从 OpenCV 恢复的值应用于它。
我通过执行inverseMatrix来计算ViewMatrix。 然后我通过将projectionMatrix乘以viewMatrix来计算viewProjectionMatrix。 我通过简单的 viewProjectionMatrix 计算ModelMatrix。 我在我的计划(2个三角形)上应用了以下值:


var size = 1.0 x: -size * 0.5 y: -size * 0.5 width: size height: size

然后我补充说:

gl.uniformMatrix4fv (matrixLocation, false, matrixModel)

不幸的是,它不起作用。


我的问题

我是否正确应用了这些矩阵,或者在这个级别上是否有任何错误?
还有其他参数需要考虑吗?
我必须在相机上应用翻译吗?
矩阵计算是否有顺序(从比例开始,然后是旋转,最后是平移)?
最后,有人可以帮助我吗?


代码示例

结果

在此处输入图像描述


谢谢你的帮助 !!!!

0 投票
0 回答
398 浏览

ios - 如何大规模处理opencv的相机校准

我正在使用 openCV solvePNP 算法从使用 openCV 的 AR Marker 检测和测量设备的姿势。我的最终目标是获得非常精确的真实测量结果。我的应用程序很可能在各种 iOS 和 Android 设备上运行。

我知道我需要通过相机校准才能使姿势估计准确工作。我可以打印出棋盘格并在我自己的开发设备上测量这些值,但是处理更广泛分布到大量用户/设备的应用程序的校准的最佳方法是什么?

我可以查找各种设备的相机校准表吗?

0 投票
1 回答
300 浏览

c++ - OpenCV 解释solvenpn

谁能给我更多关于opencv函数的解释solvepnp()?opencv 文档说

我想知道objectPoints,imagePointscameraMatrix是什么。我曾经校准过我的相机并从中获得了一个参数 xml 文件,我可以使用它吗?