问题标签 [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-solvepnp - 当目标点以 ecef 世界坐标表示时,tvec 的输出是什么?
我正在尝试获取飞机上相机的相机姿态估计。相机朝下,我将图像中的点与以 ECEF 表示的世界坐标相关联。
当我运行solvePNP时,我得到一个rvec和一个tvec。据我了解,rvec 是我的相机相对于世界参考系的旋转矢量,而 tvec 是从世界原点到我的相机的平移。所以我的主要问题是,这是否意味着 tvec 是我的相机在世界框架中的 XYZ 位置?如果我在 XYZ 开始 [0,0,0] 并移动到相机原点,那是我在 XYZ 坐标中的相机位置还是我误解了什么?
我问的主要原因是,为了在世界坐标中实际获得我的相机位置,我必须使用以下等式:
完整代码如下。
opencv - 如何结合 PnP、ICP 和直接法的非线性方法?
我目前正在研究一些视觉里程计算法,我发现在解决 PnP 和 ICP 等问题时有非线性和线性方法,而直接方法可以最大限度地减少两点之间的强度误差。上述非线性方法还可以最大限度地减少两点之间的重投影误差。
我可以用 Gauss-Newton 方法实现 PnP、ICP 和直接方法求解,因为它们的实现仅在雅可比矩阵和误差函数上有所不同,我想问有没有办法最小化三个误差函数并将它们组合在一起?例如,opencv库在“opencv_contrib/odometry.cpp”中结合了ICP和direct方法,我贴在下面,但是我不太明白“calcRgbdLsmMatrices”函数中的原理,有没有其他方法可以结合三个他们使用非线性方法?
感谢您提前提供任何帮助!
python - 如何估计带有标签的对象的姿势,并始终显示具有已知旋转和平移向量的整个对象?
我已经能够在这样的 apriltags 板上检测到多个 apriltags:
这是使用 AprilTag 库完成的:https ://github.com/swatbotics/apriltag 。我使用 OpenCV solvePnP() 和 projectPoints() 来获取旋转和平移向量,并将 3D 点投影到 2D 点上以显示这些 apriltags 的位姿。
请参见下面的代码:
这非常适合 apriltag 板。但是,现在我正在尝试检测附加了 apriltags 的对象(十二面体:Dodecapen)的姿势。这些已经校准并附带列出每个标签大小的 json 文件,以及对应于正确标签 ID 的旋转和平移向量。
使用该 json 文件中的旋转和平移向量,我需要将所有 apriltags(甚至是在框架中未检测到的那些)覆盖到 OpenCV 窗口上。为此,我将不得不使用对象点内的旋转和平移向量,而不仅仅是使用标签大小来使用来自 json 的向量获取对象点的位置,并将它们用作solvePnP中的3D点( )。我会将罗德里格斯应用于旋转矢量,然后将其应用于对象点,但我不确定如何将它们应用于对象点。
为了始终将所有 apriltags 显示在屏幕上,我在想,一旦我从 solvePnP() 获得旋转和平移,我可以将该旋转和平移应用于对象附带的预定义旋转和平移向量,然后使用 projectPoints() 投影这些点并绘制它,以显示覆盖?
因此,总而言之,在检测到帧中的 1 个或多个 apriltags 时,我试图估计整个对象(十二面体)的姿势,对于未检测到的 apriltags(例如对象后面的那些),我是使用现有的起始姿势(来自 .json 文件的旋转和平移向量)将它们显示在屏幕上。
因此,基于此,我的问题是:
我将如何去做,最好的方法是什么?
如何在对象点内使用为对象提供的旋转和平移向量来获得 3D 世界中的姿势并将它们投影到 2D 图像中,以便所有 apriltags 都显示在 openCV 窗口上,是我认为最好的方法是什么?
如果我要在 for 循环之外提供对象和图像点数组,如下所示:
这些数组被附加在第一个代码示例的循环中。在 for 循环中,solvePnP 会正常工作吗?
任何帮助将不胜感激!
python - 如何通过从solvePnP()获得的姿势(旋转矩阵和平移向量)获得姿势速度和加速度?
我目前正在通过 solvePnP() 获取 apriltag 对象的姿势并使用 projectPoints() 投影点
这在 videoStream 上调用,因此为了尝试优化solvePnP(),我试图获取前一个姿势(前一帧中对象的姿势),并将该姿势传递给当前帧的solvePnP()。
这是代码:
在视频流功能中:
我现在想获得姿势的速度和加速度,并将其传递给solvePnP()。
对于姿势速度,我知道我只需要从当前平移向量中减去先前的平移向量,但我不确定如何处理旋转矩阵(通过 Rodrigues() 获得,以及获得加速度.我在想,也许我必须得到两个旋转矩阵之间的角度,而差异会产生变化,从而产生角速度?或者就像从solvePnP()中找到旋转向量之间的差异一样简单?
我的问题是:
- 如何根据旋转矩阵获得姿势之间的速度,就获得平移速度而言,仅从当前平移向量中减去前一个平移向量的方法是否正确?
- 如何获得平移向量和旋转矩阵的加速度?
- 我用来获取先前姿势的方法是最好的方法吗?
- 对于加速度,既然只是速度的变化,那么只跟踪帧之间获得的速度并获取差异以获得加速度是否明智?
任何帮助将不胜感激!
opencv - 未知内在和外在参数内的 OpenCV 相机校准:组合算法 DLT 和 SolvePNP
我正在尝试估计未校准图像的绝对相机位置,即在单个图像上。我有 2 组关键点:在 3d 模型(对象坐标)和 2d 图像(uv 坐标)上。让我们假设关键点是准确的。然后我执行以下步骤:
- 我应用标准直接线性变换 (DLT) 来估计投影矩阵 P - 从 3d“世界”到 2d 图像变换 x = P*X;
- OpenCV DecomposeProjectionMatrix() 函数有助于将投影矩阵分解为外在矩阵和内在矩阵:P = K {R|t};
- 为了改进我对旋转和平移矩阵的第一次猜测,我将 SolvePnP(使用迭代方法,据我所知它为我提供了“最佳”解决方案)函数应用于关键点集和相机参数;
在几种情况下运行我的组合算法时,我注意到在大多数情况下 SolvePnP 返回非常接近基本事实的结果。其余结果不准确,旋转和平移与实际相差甚远。
问:是否可以针对我当前算法失败的这些情况进行改进:可能是基于 OpenCV CameraCalibrate() 优化内在参数,或应用其他 SolvePnP 算法?
python - 如何使用 QR/Aruco 代码(Python CV)将点云从相机框架转换为世界框架?
我想将来自多个深度相机的点云合并在一起。为了实现这一点,我试图将点云从每个相机帧转换为单个世界帧,由 aruco 代码(类似于 QR 代码)定义。
现在,我只是从一台相机开始。
假设我有
我目前执行以下操作:
然后,我在原点 (0,0,0) 处绘制轴的场景中显示新的点云。
我现在期望当我将相机对准 Aruco 代码时,这些点应该会发生变化,而且确实会发生变化。
但是我也希望点云现在应该保持静止,即使我旋转相机,因为这些点已经转换到世界框架中,并且世界相对于世界框架没有移动。这不会发生,当我移动相机时,这些点会继续移动(尽管以不同的方式)。
我相信旋转和平移是正确的,我使用它们将轴显示到 rgb_image 中的 aruco 代码上,并且它们位于正确的位置。
任何帮助将不胜感激!
opencv - 想从图像中的二维点找到平面透视世界中的旋转和位置
python - 关于旋转向量/矩阵的困惑
我solvePnP()
用来获取 3D 形状的旋转矩阵,根据某些来源,它是一个 3x3 矩阵。就我而言,我得到一个向量(3x1)。我做错了什么还是格式取决于我的相机矩阵,dist coeffs,等等?我正在使用这条线:
我在形状中使用 5 个 image_points 和 object_points((x,y)用于 2D 点,(x,y,z)用于 3D 点,z=0,因为表面是平坦的),相机矩阵是
并且 dist_coeffs 是
这是在对相机进行校准后确定的。旋转向量返回如下:
旋转矢量:
在用 Rodrigues() 转换后,我得到了
我的问题是,旋转矩阵的定义是围绕每个轴的旋转矩阵的乘积,所以根据定义,它应该是一个 3x3 矩阵。有人可以解释一下或告诉我我做错了什么吗?
opencv - 姿势估计后 3D 坐标轴错位
作为一个新手,我正在尝试使用 OpenCV 的solvePnP 计算平面对象的姿态。但是,我看到一个奇怪的输出。我绘制的轴总是在框架的角上绘制轴。要绘制我的轴,我使用:
drawFrameAxes(frame_copy, cameraMatrix, distanceCoeffisions, rvec, tvec, length); 我得到的输出如下:
Ps(X:红色,Y:绿色,Z:蓝色)
我没有任何深度信息我不确定这是否属实,但为了获得 3D 点,我使用内点并将 z 坐标定义为 0。
那么可能是什么问题,任何资源指针或建议都是我的客人。
解决了问题
解决方案:固定相机校准并解决问题。
谢谢!