关键词:
【中文标题】来自 cv::solvePnP 的世界坐标中的相机位置【英文标题】:Camera position in world coordinate from cv::solvePnP 【发布时间】:2013-09-09 08:33:47 【问题描述】:我有一个校准过的相机(固有矩阵和失真系数),我想知道相机位置,知道图像中的一些 3d 点及其对应点(2d 点)。
我知道cv::solvePnP
可以帮助我,在阅读了this 和this 之后,我了解到solvePnP rvec
和tvec
的输出是对象在相机坐标系中的旋转和平移.
所以我需要找出世界坐标系中的相机旋转/平移。
从上面的链接看来,代码很简单,在 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 矩阵。如何通过简单的glTranslatef
和glRotate
调用在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【问题描述】:我想计算我的相机在世界坐标中的位置。这应该相当容易,但我没有得到我期望的结果。我相信我... 查看详情