来自 cv::solvePnP 的世界坐标中的相机位置

     2023-02-16     98

关键词:

【中文标题】来自 cv::solvePnP 的世界坐标中的相机位置【英文标题】:Camera position in world coordinate from cv::solvePnP 【发布时间】:2013-09-09 08:33:47 【问题描述】:

我有一个校准过的相机(固有矩阵和失真系数),我想知道相机位置,知道图像中的一些 3d 点及其对应点(2d 点)。

我知道cv::solvePnP 可以帮助我,在阅读了this 和this 之后,我了解到solvePnP rvectvec 的输出是对象在相机坐标系中的旋转和平移.

所以我需要找出世界坐标系中的相机旋转/平移。

从上面的链接看来,代码很简单,在 python 中:

found,rvec,tvec = cv2.solvePnP(object_3d_points, object_2d_points, camera_matrix, dist_coefs)
rotM = cv2.Rodrigues(rvec)[0]
cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)

我不知道 python/numpy 的东西(我正在使用 C++),但这对我来说没有多大意义:

solvePnP 的 rvec、tvec 输出是 3x1 矩阵,3 个元素向量 cv2.Rodrigues(rvec) 是一个 3x3 矩阵 cv2.Rodrigues(rvec)[0] 是一个 3x1 矩阵,3 个元素向量 cameraPosition 是一个 3x1 * 1x3 矩阵乘法,它是一个.. 3x3 矩阵。如何通过简单的glTranslatefglRotate 调用在opengl 中使用它?

【问题讨论】:

【参考方案1】:

如果使用“世界坐标”是指“物体坐标”,则必须得到 pnp 算法给出的结果的逆变换。

有一个求逆转换矩阵的技巧,可以让您节省通常很昂贵的求逆操作,并且可以解释 Python 中的代码。给定一个变换[R|t],我们有inv([R|t]) = [R'|-R'*t],其中R'R 的转置。所以,你可以编码(未测试):

cv::Mat rvec, tvec;
solvePnP(..., rvec, tvec, ...);
// rvec is 3x1, tvec is 3x1

cv::Mat R;
cv::Rodrigues(rvec, R); // R is 3x3

R = R.t();  // rotation of inverse
tvec = -R * tvec; // translation of inverse

cv::Mat T = cv::Mat::eye(4, 4, R.type()); // T is 4x4
T( cv::Range(0,3), cv::Range(0,3) ) = R * 1; // copies R into T
T( cv::Range(0,3), cv::Range(3,4) ) = tvec * 1; // copies tvec into T

// T is a 4x4 matrix with the pose of the camera in the object frame

更新:稍后,要将 T 与 OpenGL 一起使用,您必须记住,OpenCV 和 OpenGL 之间的相机框架轴不同。

OpenCV 使用计算机视觉中常用的参考:X 指向右侧,Y 向下,Z 指向前面(如this image)。 OpenGL 中相机的帧是:X 指向右侧,Y 向上,Z 指向后面(如this image 的左侧)。因此,您需要围绕 X 轴旋转 180 度。这个旋转矩阵的公式在wikipedia。

// T is your 4x4 matrix in the OpenCV frame
cv::Mat RotX = ...; // 4x4 matrix with a 180 deg rotation around X
cv::Mat Tgl = T * RotX; // OpenGL camera in the object frame

这些转换总是令人困惑,我可能在某些步骤上错了,所以请谨慎对待。

最后,考虑到 OpenCV 中的矩阵以行优先顺序存储在内存中,而 OpenGL 矩阵则以列优先顺序存储。

【讨论】:

似乎工作,我得到glRotatef的角度,公式取自:euclideanspace.com/maths/geometry/rotations/conversions/…,然后从径向到度数的正常转换。但是,如果我在 opengl 中插入这些值,我仍然会得到错误的相机旋转(旋转 X 大约是 45° 错误)和稍微错误的平移.. 这可能是由于OpenCV和OpenGL中的相机帧不同。检查我的扩展答案。 是的,我知道opencv和opengl在内存中矩阵顺序的区别。而且我还必须翻转y和z轴(=>使用opencv y作为opengl z,并使用opencv z作为opengl y) 快到了!结果与几次试验一致。在我看来,X 轴上存在 45° 的误差(我不明白的 opencv 和 opengl 之间的框架可能存在一些差异)和 y 角度上的 10° 误差(我不知道如何解释) 你确定轴是你说的吗?我认为他们就像我的例子一样,但我可能错了。还要检查相机的投影参数在opencv和opengl中是否相同。【参考方案2】:

如果您想将其转换为指定相机位置的标准 4x4 姿势矩阵。使用 rotM 作为左上角的 3x3 正方形,tvec 作为右边的 3 个元素,0,0,0,1 作为底行

pose = [rotation   tvec(0)
        matrix     tvec(1)
        here       tvec(2)
        0  , 0, 0,  1]

然后反转它(得到相机的姿势而不是世界的姿势)

【讨论】:

世界坐标系相机坐标系图像坐标系之间的关系

...系(图像物理坐标系(x,y))、相机坐标系(xc,yc,zc)和世界坐标系(Xw,Yw,Zw)。我们通过假设一些参数,使上面四个坐标系之间的坐标联系起来,这样我们就可以把拍摄的图片上的一个点坐标反推导出世界坐 查看详情

双目相机同目标追踪

...维坐标7.齐次坐标变换⭐⭐8.关于相机内参中的焦距fx和fy世界坐标系、相机坐标系、图像坐标系和像素坐标系的转换:9.相机标定讲解⭐⭐10.相机标定(Cameracalibration)原理、步骤11.计算机视觉之相机成像几何模型࿰... 查看详情

相机模型(cameramodel)

...Model都是简单但是应用广泛的模型,描述了将物体从3D世界坐标系转换(WorldCoordinate)到2D图像坐标系(ImageCoordinate)的数学映射过程。PerspectiveCameraModel包含了:3D世界坐标系——>3D相机坐标系(CameraC... 查看详情

万字长文概述单目3d目标检测算法(代码片段)

...像平面,小孔位于成像平面和真实的三维场景之间,任何来自真实世界的光只有通过小孔才能到达成像平面。因此,在成像平面和通过小孔看到的真实三维场景存在着一种对应关系,也就是图像中的二维像素点和真实三维世界的... 查看详情

unity3d之笛卡尔坐标系转换——屏幕坐标转换世界坐标,世界坐标转换相机坐标工具(代码片段)

...能,所以就要用到坐标的转换,就总结了一下屏幕坐标、世界坐标、相机坐标之间的转换。首先说明的是Unity3D遵从Direct3D标准的左手笛卡尔坐标系变换规则。也就是说:世界坐标系就是左手笛卡尔坐标系(x,y,z),相机也是左手笛... 查看详情

使用单个校准相机从 2D 图像中获取世界坐标

】使用单个校准相机从2D图像中获取世界坐标【英文标题】:Gettingworldcoordinatesfrom2Dimageusingsinglecalibratedcamera【发布时间】:2014-11-1713:42:38【问题描述】:我正在尝试从没有棋盘的单个图像校准我的相机。为此,我使用了以下应用... 查看详情

slam学习笔记-世界坐标系到相机坐标系的变换

参考自:http://blog.csdn.net/yangdashi888/article/details/51356385http://blog.csdn.net/li_007/article/details/5976261 其中,Zc表示单目相机的尺度不确定性(单目相机无法确定尺度,所以ORB-SLAM等最后都对单目做了sim3优化)等号右边第一、二个矩阵... 查看详情

slam学习笔记

5.相机与图像 相机将三维世界中的坐标点(单位米)映射到二维图像平面(单位为像素)的过程中能够用一个几何模型进行描述。单目相机(Mono)的成像过程:1、世界坐标系下有个固定的点P,世界坐标为2... 查看详情

61相机投影原理

0引言世界坐标系下的点如何投影到CCD镜头上,通过成像的方式得到点在二维图像上的像素坐标值,这是摄影测量中的一个基础而核心的问题。这个问题中核心的东西有两个:1、坐标系的定义及其空间转换矩阵 2、成像中的误... 查看详情

unity怎样正确获取2d世界坐标

...(0,0)点,右上角为(Screen.width,ScrZ的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。ViewPortSpac... 查看详情

2021-08-16slam十四讲第5讲——从相机坐标到像素坐标

...像进行处理,首先要得到图像,本讲就再描述如何从现实世界,通过相机,得到一张二维世界的图像,这张图像一般我们用像素表示,也就意味着,我们要去了解现实三维坐标到像素坐标的表示。首先我们把世界坐标到相机坐标... 查看详情

深度图向点云图的转换(代码片段)

...关系(对于小孔成像的相机原理的相机)上述的公式是从世界坐标得到图像中像素坐标,同理也可从从图像的像素坐标转换到世界坐标下。根据这个公式可以对点云进行构建。如果相机发生了位移和旋转,那么只需要对这些点进... 查看详情

2d到3d外参矩阵估计

...图【已经自带水印就偷懒省下引用】: 首先3D物体在世界坐标系,也就是我们现实世界,物体是现实中的绝对尺寸,以m为单位。现实世界的物体认为成刚体,那么这个刚体和相机之间会有一个相对位置。对于物体来说,是以... 查看详情

2.相机成像原理和数学模型

相机模型中的坐标系:Ow-xyx:世界坐标系,物体位置,单位:mOc-xyz:相机坐标系,光心为原点,单位:mOi-xy:图像坐标系,光心为图像中心,单位:mmOp-xy:像素坐标系,原点为图像右上角,单位:pixel其中:1)Fx和Fy为水平和竖... 查看详情

立体视觉入门指南:坐标系与相机参数

亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间。而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机... 查看详情

立体视觉入门指南:坐标系与相机参数

亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间。而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机... 查看详情

计算机视觉——相机参数标定

...标定。一般来说,标定的过程分为两个部分:第一步:从世界坐标系转换为相机坐标系,这一步是三维点到三维点的转换,包括R,t(相机外参)等参数;第二步:从相机坐标系转为图像坐标系,这一步是三维点到二维点的转换... 查看详情

使用 OpenCV Python 计算相机世界位置

】使用OpenCVPython计算相机世界位置【英文标题】:CalculatecameraworldpositionwithOpenCVPython【发布时间】:2013-01-0420:23:36【问题描述】:我想计算我的相机在世界坐标中的位置。这应该相当容易,但我没有得到我期望的结果。我相信我... 查看详情