标签: opencv-solvepnp

您可以将 OpenCV solvePNP 与等距柱状图一起使用吗?

是否可以将 OpenCV 的 solvePNP 与 equirectangular图像一起使用?我有一个 equirectangular 图像,我在这个图像中有四个点(红点)和它们的像素坐标,然后我有 4 个对应的世界点,例如[(0, 0, 0), (2, 0, 0), (2, 10, 0), (0, 10, 0)]我如何估计相机姿势?

在此处输入图片说明

我尝试使用 OpenCV,solvePnp但是期望 Brown 相机模型的内在函数,所以没有用。这可以用于球形相机吗?

python opencv pose-estimation opencv-solvepnp

24
推荐指数
1
解决办法
531
查看次数

为什么直接线性变换(DLT)不能提供最佳的相机外部效应?

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

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

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

opencv least-squares extrinsic-parameters opencv-solvepnp

7
推荐指数
1
解决办法
2748
查看次数

solvePNP vs recoverPose by rotation composition:为什么翻译不一样?


第1部分:更新前


我想估计采用两种不同的方法相对位置:solvePNPrecoverPose,和好像[R矩阵是看起来不错相对于一定的误差,但翻译载体是完全不同的.我究竟做错了什么?通常,我需要使用两种方法找到从第1帧到第2帧的相对位置.

    cv::solvePnP(constants::calibration::rig.rig3DPoints, corners1,
                 cameraMatrix, distortion, rvecPNP1, tvecPNP1);
    cv::solvePnP(constants::calibration::rig.rig3DPoints, corners2,
                 cameraMatrix, distortion, rvecPNP2, tvecPNP2);

    Mat rodriguesRPNP1, rodriguesRPNP2;
    cv::Rodrigues(rvecPNP1, rodriguesRPNP1);
    cv::Rodrigues(rvecPNP2, rodriguesRPNP2);

    rvecPNP = rodriguesRPNP1.inv() * rodriguesRPNP2;
    tvecPNP = rodriguesRPNP1.inv() * (tvecPNP2 - tvecPNP1);

    Mat E = findEssentialMat(corners1, corners2, cameraMatrix);

    recoverPose(E, corners1, corners2, cameraMatrix, rvecRecover, tvecRecover);
Run Code Online (Sandbox Code Playgroud)

输出:

solvePnP: R: 
[0.99998963, 0.0020884471, 0.0040569459;
-0.0020977913, 0.99999511, 0.0023003994;
-0.0040521105, -0.0023088832, 0.99998915]

solvePnP: t:  
[0.0014444492; 0.00018377086; -0.00045027508]

recoverPose: R: 
[0.9999900052294586, 0.0001464890570028249, 0.004468554816042664;
-0.0001480011106435358, 0.9999999319097322, 0.0003380476328946509;
-0.004468504991498534, -0.0003387056052618761, 0.9999899588204144]

recoverPose: …
Run Code Online (Sandbox Code Playgroud)

opencv linear-algebra computer-vision pose-estimation opencv-solvepnp

7
推荐指数
1
解决办法
955
查看次数

来自solvePnP的相机姿势

目标:

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

定义:

姿态角定义如下:

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

俯仰是摄像机的"鼻子"方向:0°=水平地看地平线上的点,-90°=垂直向下看,+ 90°=垂直向上看,45°=向上看45°角从地平线等

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

世界参考框架:

我的世界参考框架是这样的:

向东= + X
向北= + Y
向天空= + Z.

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

相机参考框架:

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

要做的事:

现在,从cv2.solvepnp()一堆图像点和它们相应的世界坐标,我已经计算了两个rvectvec.但是,根据以下文档:http://docs.opencv.org/trunk/d9/d0c/group__calib3d.html#ga549c2075fac14829ff4a58bc931c033d,它们是:

rvec ; 输出旋转矢量(请参阅Rodrigues())tvec,它将点从模型坐标系带到摄像机坐标系.
tvec ; 输出翻译矢量.

这些载体被给予去相机参考帧.
我需要进行精确的逆操作,从而检索相对于世界坐标的摄像机位置和姿态.

相机位置:

所以,我已经计算从旋转矩阵rvecRodrigues():

rmat = cv2.Rodrigues(rvec)[0]
Run Code Online (Sandbox Code Playgroud)

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

camera_position = -np.matrix(rmat).T * np.matrix(tvec)    
Run Code Online (Sandbox Code Playgroud)

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


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

python opencv-solvepnp

6
推荐指数
1
解决办法
1780
查看次数

OpenCV 投影点与 Unity 相机视图之间不匹配

我们正在开发一个 AR 应用程序,其中需要将对象的 3D 模型叠加到对象的视频流上。Unity 场景包含 3D 模型,并且相机正在拍摄 3D 对象。相机姿势最初未知。

\n\n

\xe2\x96\xb6我们尝试过的

\n\n

我们没有找到一个好的解决方案来直接在 Unity 中估计相机位姿。因此,我们使用了OpenCV,它提供了广泛的计算机视觉函数库。特别是,我们找到Aruco 标签,然后将其匹配的 3D-2D 坐标传递给solvePnp.

\n\n

solvePnp返回与现实相符最多几厘米的相机位置。我们还验证了较低的重投影误差。

\n\n

Aruco 标签的重投影

\n\n

每个使用过的标签角都会被重新投影并在图像上显示为红点。如您所见,差异很小。

\n\n

这些结果看起来不错,应该足以满足我们的用例。\n因此,我们根据现实和 OpenCV 验证相机姿势。

\n\n

\xe2\x96\xb6问题

\n\n

然而,当将相机放置在 Unity 场景中的估计姿势时,3D 对象无法很好地对齐。

\n\n

标记和视频流的统一视图

\n\n

在此 Unity 屏幕截图中,您可以看到虚拟(Unity 对象)绿色标签的视图与视频源中的真实标签不匹配。

\n\n

\xe2\x96\xb6可能的根本原因

\n\n

我们确定了可以解释 Unity 和 OpenCV 之间不匹配的不同可能根本原因:

\n\n
    \n
  • 相机内在参数的差异:我们尝试了不同的参数组,但没有一个绝对成功。我们首先使用 OpenCV 校准相机并尝试反向移植参数到 Unity。我们还查看了制造商数据,但没有提供更好的结果。最后,我们手动测量了视场 (FoV),并将其与已知的相机传感器尺寸相结合。这些测试的结果没有太大差异。
  • \n
  • Unity 和 OpenCV 之间相机模型的差异:OpenCV 使用针孔相机模型,但我无法找到关于 Unity 模拟哪个模型的结论性答案。
  • \n
\n\n …

opencv computer-vision unity-game-engine pose-estimation opencv-solvepnp

6
推荐指数
0
解决办法
1403
查看次数

OpenCV Python solvePnP 的 EPnP 实现与官方 MATLAB EPnP 实现产生的输出不同

这些天我正在研究用于计算机视觉的 solvePnP 算法。我在这里找到了 MATLAB 中的官方 EPnP 算法https://github.com/cvlab-epfl/EPnP

我正在通过 Python API 将官方实现的结果与 OpenCV 版本进行比较。

用这两种方法运行一个简单的例子,给我不同的 R 矩阵和 t 向量。t 向量不同,并且 R 的上面两行的符号被翻转(参见下面代码示例下的输出)。我在这里缺少什么?

谢谢!

示例 Python 代码:

import numpy as np
import cv2

cam_in = [[2445.72, 0.0, 819.29],
          [0.0, 2442.39, 660.13],
          [0.0, 0.0, 1.0]]
          
# 3p model from opencv
objPts = [[  0. ,   0. ,   0. ],
          [ 82.5,   0. ,   0. ],
          [165. ,   0. ,   0. ],
          [247.5,   0. ,   0. ],
          [ 55. ,  27.5,   0. …
Run Code Online (Sandbox Code Playgroud)

python opencv computer-vision opencv-solvepnp

5
推荐指数
0
解决办法
257
查看次数

如何从cv2.decomposeProjectionMatrix理解欧拉角?

我已经在互联网上搜索了几个小时,了解一些有关如何理解返回的欧拉角的文档cv2.decomposeProjectionMatrix

我的问题看起来很简单,我有一张飞机的二维图像。 在此输入图像描述 我希望能够从该图像中得出飞机相对于相机的方向。最终,我正在寻找外观凹陷(即方位角和仰角)。我有与图像中选择的 2D 特征相对应的 3D 坐标 - 在我的代码中列出如下。

# --- Imports ---
import os
import cv2
import numpy as np

# --- Main ---
if __name__ == "__main__":

    # Load image and resize
    THIS_DIR = os.path.abspath(os.path.dirname(__file__))
    im = cv2.imread(os.path.abspath(os.path.join(THIS_DIR, "raptor.jpg")))
    im = cv2.resize(im, (im.shape[1]//2, im.shape[0]//2))
    size = im.shape

    # 2D image points
    image_points = np.array([
                    (230, 410),     # Nose
                    (55, 215),      # right forward wingtip
                    (227, 170),     # right aft outboard horizontal
                    (257, …
Run Code Online (Sandbox Code Playgroud)

python euler-angles opencv-solvepnp

5
推荐指数
0
解决办法
1408
查看次数

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

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行

retval, rvec, tvec = cv2.solvePnP(cam.object_points, cam.image_points, cam.camera_matrix, cam.dist_coefficients, None, None, False, cv2.SOLVEPNP_P3P)
Run Code Online (Sandbox Code Playgroud)

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

solvePnP代码ref:https://github.com/opencv/opencv/blob ...

怎么解决这个?

python opencv numpy opencv3.0 opencv-solvepnp

4
推荐指数
1
解决办法
1714
查看次数

了解solvePnP算法

我无法理解透视点问题。几个问题:

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

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

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

谢谢你的帮助!

graphics opencv linear-algebra computer-vision opencv-solvepnp

3
推荐指数
1
解决办法
5853
查看次数

如何使用鱼眼相机参数解决 PnP 问题?

我看到OpenCV的solvePnP()函数假设你的相机参数来自针孔模型。但我使用cv.fisheye模块校准了相机,所以我想知道如何使用从鱼眼模块获得的参数来使用solvePnP。

如何使用我的鱼眼相机参数solvePnP()

opencv camera-calibration pose-estimation opencv-solvepnp

3
推荐指数
1
解决办法
3157
查看次数