当前位置: 首页 > 知识库问答 >
问题:

CV::SolvePnp中世界坐标中的摄像机位置

李昱
2023-03-14

我有一个校准的摄像机(固有矩阵和失真系数),我想知道摄像机的位置知道一些3D点和他们在图像中的对应点(2D点)。

我知道cv::solvePnP可以帮助我,读完这个和这个之后,我明白了solvePnPrvectvec的输出是物体在相机坐标系中的旋转和平移。

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

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个元素向量
  • 摄像是一个3x1*1x3矩阵乘法,它是一个。3x3矩阵。如何在opengl中使用简单的gltranslateFglrotot调用

共有1个答案

裘嘉木
2023-03-14

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

有一个反演变换矩阵的技巧,它允许您节省反演操作,这通常是昂贵的,这解释了Python中的代码。给定一个变换[Rt],我们有inv([Rt])=[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

更新:稍后,要在OpenGL中使用t,您必须记住,相机框架的轴在OpenCV和OpenGL之间是不同的。

OpenCV使用了计算机视觉中通常使用的引用:X指向右侧,Y向下,Z指向前方(如这张图像)。相机在OpenGL中的框架是:X指向右边,Y向上,Z指向后面(就像在这张图像的左手边)。因此,您需要应用一个旋转的X轴180度。这个旋转矩阵的公式在维基百科里。

// 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中的矩阵是按列-主顺序存储的。

 类似资料:
  • 通过前两节课的学习,想必你已经对Threejs的层级模型有了一定认识,那么本节课就在层级模型概念的基础上,继续给家讲解两个新的概念,即本地坐标系和世界坐标系。 如果你对本地坐标系和世界坐标系已经有了一定概念,那么可以直接访问模型的位置属性.position获得模型在本地坐标系或者说模型坐标系下的三维坐标,通过模型的.getWorldPosition()方法获得该模型在世界坐标下的三维坐标。 .ge

  • 我正在进行一个处理项目,需要能够确定鼠标是否在圆内。因此,我需要获得圆的位置和鼠标的位置。但是,圆的位置已使用矩阵函数进行了修改,如和。例如: 在处理中有什么方法可以做到这一点吗?我在看留档,但似乎找不到任何功能。如果没有,我如何实现我的目标? 谢谢。

  • 我正在为我的计算机科学学位的顶点项目工作,我很难弄清楚如何做到标题所说的那样。只要假设摄像机在原点向下看--在gl坐标中的z(或在世界坐标中的正z),我的投影矩阵是基于16x9的纵横比和40度垂直视场。zfar为1000,znear为1。 我从两个不同的角度探讨了这个问题。我试着通过矩阵数学和三角法来计算它。然而,到目前为止,这两种方法都不适合我。 我的第一个本能,是取我的投影矩阵,求矩阵的逆,而

  • 本文向大家介绍Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系,包括了Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系的使用技巧和注意事项,需要的朋友参考一下  cocos2d-x的坐标系很重要,想要学好该引擎,深入理解它的坐标体系很重要。注释写的很清楚了,对照上运行结果一块来看代码吧!

  • 创建摄像机图层并更改摄像机设置 您可以使用摄像机图层从任何角度和距离查看 3D 图层。就像在现实世界中,在场景之中和周围移动摄像机比移动和旋转场景本身容易一样,通过设置摄像机图层并在合成中来回移动它来获得合成的不同视图通常最容易。 您可以通过修改摄像机设置并为其制作动画来配置摄像机,使其与用于记录要与其合成的素材的真实摄像机和设置匹配。您还可以使用摄像机设置将类似摄像机的行为(包括景深模糊以及平移

  • 接口说明 更新相机位置(坐标) 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/viewpoint/1.0.0/update 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 id string form 是 视角ID dId string form 是 场景ID directionx number f