是否可以将 OpenCV 的 solvePNP 与 equirectangular图像一起使用?我有一个 equirectangular 图像,我在这个图像中有四个点(红点)和它们的像素坐标,然后我有 4 个对应的世界点,例如[(0, 0, 0), (2, 0, 0), (2, 10, 0), (0, 10, 0)]我如何估计相机姿势?
我尝试使用 OpenCV,solvePnp但是期望 Brown 相机模型的内在函数,所以没有用。这可以用于球形相机吗?
我solvePnP()在OpenCV中读取函数的源代码,当flagsparam使用默认值时SOLVEPNP_ITERATIVE,它调用cvFindExtrinsicCameraParams2,其中它首先使用DLT算法(如果我们有一组非平面的3D点)来初始化6DOF相机姿势,和SECOND用于CvLevMarq solver最小化重投影错误.
我的问题是:DLT将问题形成为线性最小二乘问题并用SVD分解解决它,它似乎是一个最优解,为什么我们之后仍然使用Lev-Marq迭代方法?
或者,DLT算法的问题/限制是什么?为什么封闭形式的解决方案导致成本函数的LOCAL最小值?
我想估计采用两种不同的方法相对位置:solvePNP 和recoverPose,和好像[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);
输出:
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: …opencv linear-algebra computer-vision pose-estimation opencv-solvepnp
我需要检索相机的位置和姿态角度(使用OpenCV/Python).
偏航是水平面上相机的大致方向:朝北= 0,朝东= 90°,南= 180°,西= 270°等.
俯仰是摄像机的"鼻子"方向:0°=水平地看地平线上的点,-90°=垂直向下看,+ 90°=垂直向上看,45°=向上看45°角从地平线等
如果相机在您手中向左或向右倾斜时会滚动(因此,当此角度变化时,它总是在地平线上观察点):+ 45°=当您抓住相机时,顺时针旋转倾斜45°,因此+ 90°(和-90°)将是肖像图片所需的角度,例如等.
我的世界参考框架是这样的:
向东= + X
向北= + Y
向天空= + Z.
我的世界对象点在该参考系中给出.
现在,从cv2.solvepnp()一堆图像点和它们相应的世界坐标,我已经计算了两个rvec和tvec.但是,根据以下文档:http://docs.opencv.org/trunk/d9/d0c/group__calib3d.html#ga549c2075fac14829ff4a58bc931c033d,它们是:
rvec ; 输出旋转矢量(请参阅
Rodrigues())tvec,它将点从模型坐标系带到摄像机坐标系.
tvec ; 输出翻译矢量.
这些载体被给予去到相机参考帧.
我需要进行精确的逆操作,从而检索相对于世界坐标的摄像机位置和姿态.
所以,我已经计算从旋转矩阵rvec有Rodrigues():
rmat = cv2.Rodrigues(rvec)[0]
如果我就在这里,在世界坐标系中表示的摄像机位置由下式给出:
camera_position = -np.matrix(rmat).T * np.matrix(tvec)    
(src:来自cv :: solvePnP的世界坐标中的相机位置)
这看起来相当不错.
我们正在开发一个 AR 应用程序,其中需要将对象的 3D 模型叠加到对象的视频流上。Unity 场景包含 3D 模型,并且相机正在拍摄 3D 对象。相机姿势最初未知。
\n\n\xe2\x96\xb6我们尝试过的
\n\n我们没有找到一个好的解决方案来直接在 Unity 中估计相机位姿。因此,我们使用了OpenCV,它提供了广泛的计算机视觉函数库。特别是,我们找到Aruco 标签,然后将其匹配的 3D-2D 坐标传递给solvePnp.
solvePnp返回与现实相符最多几厘米的相机位置。我们还验证了较低的重投影误差。
每个使用过的标签角都会被重新投影并在图像上显示为红点。如您所见,差异很小。
\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\n …opencv computer-vision unity-game-engine pose-estimation opencv-solvepnp
这些天我正在研究用于计算机视觉的 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. …我已经在互联网上搜索了几个小时,了解一些有关如何理解返回的欧拉角的文档cv2.decomposeProjectionMatrix。
我的问题看起来很简单,我有一张飞机的二维图像。 
 我希望能够从该图像中得出飞机相对于相机的方向。最终,我正在寻找外观和凹陷(即方位角和仰角)。我有与图像中选择的 2D 特征相对应的 3D 坐标 - 在我的代码中列出如下。
我希望能够从该图像中得出飞机相对于相机的方向。最终,我正在寻找外观和凹陷(即方位角和仰角)。我有与图像中选择的 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, …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)
我正在使用带有标志SOLVEPNP_P3P的solvePnP函数.它给出了断言错误.使用SOLVEPNP_ITERATIVE标志,相同的solvePnP代码可以正常工作.使用P3P标志,它在内部调用undistortPoints函数,该函数给出错误.
solvePnP代码ref:https://github.com/opencv/opencv/blob ...
怎么解决这个?
我无法理解透视点问题。几个问题:
是s为了什么?为什么我们需要图像点的比例因子?
是将同质世界点K[R|T]移动到 2D 图像平面的坐标空间中的“坐标变化矩阵” ?p_w
[R|T]代表了相机相对于相应的世界点的“旋转和平移” p_w,这就是我们正在努力解决的问题。这其中有什么特别困难的地方呢?我们就不能说吗[R|T] =inv(K)s(p_c)inv(p_w)?我只是用一些基本的矩阵代数做到了这一点。谢谢你的帮助!
graphics opencv linear-algebra computer-vision opencv-solvepnp
我看到OpenCV的solvePnP()函数假设你的相机参数来自针孔模型。但我使用cv.fisheye模块校准了相机,所以我想知道如何使用从鱼眼模块获得的参数来使用solvePnP。
如何使用我的鱼眼相机参数solvePnP()?