世界坐标系

针孔相机模型和变形

北战南征 提交于 2020-01-13 05:46:10
http://wiki.opencv.org.cn/index.php/Cv%E7%85%A7%E7%9B%B8%E6%9C%BA%E5%AE%9A%E6%A0%87%E5%92%8C%E4%B8%89%E7%BB%B4%E9%87%8D%E5%BB%BA http://oliver.zheng.blog.163.com/blog/static/14241159520133601847831 针孔相机模型和变形 这一节里的函数都使用针孔相机模型,这就是说,一幅视图是通过透视变换将三维空间中的点投影到图像平面。投影公式如下: 或者 这里(X, Y, Z)是一个点的世界坐标,(u, v)是点投影在图像平面的坐标,以像素为单位。A被称作摄像机矩阵,或者内参数矩阵。(cx, cy)是基准点(通常在图像的中心),fx, fy是以像素为单位的焦距。所以如果因为某些因素对来自于摄像机的一幅图像升采样或者降采样,所有这些参数(fx, fy, cx和cy)都将被缩放(乘或者除)同样的尺度。内参数矩阵不依赖场景的视图,一旦计算出,可以被重复使用(只要焦距固定)。旋转-平移矩阵[R|t]被称作外参数矩阵,它用来描述相机相对于一个固定场景的运动,或者相反,物体围绕相机的的刚性运动。也就是[R|t]将点(X, Y, Z)的坐标变换到某个坐标系,这个坐标系相对于摄像机来说是固定不变的

屏幕坐标系 到世界坐标系

大城市里の小女人 提交于 2020-01-04 12:09:06
转自nehe的教程:Using gluUnProject http://nehe.gamedev.net/article/using_gluunproject/16013/ CVector3 GetOGLPos(int x, int y) { GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLfloat winX, winY, winZ; GLdouble posX, posY, posZ; glGetDoublev( GL_MODELVIEW_MATRIX, modelview ); glGetDoublev( GL_PROJECTION_MATRIX, projection ); glGetIntegerv( GL_VIEWPORT, viewport ); winX = (float)x; winY = (float)viewport[3] - (float)y; glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ ); //获取深度值 gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY,

【图像处理】像素坐标系、像平面坐标系、相机坐标系、世界坐标系、内参矩阵、外参矩阵

帅比萌擦擦* 提交于 2019-12-30 04:56:00
【图像处理】像素坐标系、像平面坐标系、相机坐标系、世界坐标系、内参矩阵、外参矩阵 像素坐标系 像平面坐标系 相机坐标系 世界坐标系 像素坐标系<==>像平面坐标系 相机坐标系<==>像平面坐标系 相机坐标系<==>世界坐标系 像素坐标系<==>世界坐标系 结语 像素坐标系 以图像左上角为原点建立以像素为单位的直接坐标系 u − v u-v u − v 。横轴为 u u u ,向右为正方向;纵轴为 v v v ,向下为正方向 u u u 和 v v v 代表像素的行数和列数,没有物理单位 像平面坐标系 像平面坐标系 o − x y o-xy o − x y 是以影像几何中心 o o o 为原点, x x x 、 y y y 轴方向分别为平行于影像画幅边缘线的二维坐标系 相机坐标系 相机坐标系 o c − x c y c z c o_c-x_cy_cz_c o c ​ − x c ​ y c ​ z c ​ 是以摄像机光心为原点(在针孔模型中也就是针孔为光心),z轴与光轴重合也就是z轴指向相机的前方(也就是与成像平面垂直),x轴与y轴的正方向与像平面坐标系平行的三维直角坐标系 世界坐标系 由于摄像机可安放在环境中的任意位置, 在环境中选择一个基准坐标系来描述摄像机的位置 ,并用它描述环境中任何物体的位置,该坐标系称为世界坐标系 o w − x w y w z w o_w-x_wy_wz

图形学的矩阵变换

喜夏-厌秋 提交于 2019-12-27 17:52:32
确定一个四棱锥的一块空间,两个断面之间的空间就是需要投影的空间 gluLookAt的函数的作用,它封装了世界坐标系到观察坐标系的转换,从“从一个点去看另一个点的方法(ps:包括方向)” 世界坐标系是最大的坐标系,最小的是模型坐标系;最后显示的结果是观察坐标系; 可以建立一个巨大的虚拟世界,这个世界里面包含了很多的对象; 但是这个世界是没有“观察”的;等有了“观察”之后,就需要观察的位置和产生的结果的地方(gluLookAt);并且需要哪些东西可以在观察的位置出现,这个就是gluPerspective 模型矩阵描述了一系列变换的信息。我们首先计算物体的模型矩阵,然后将物体每个顶点的坐标(在局部的物体坐标系下)都左乘该模型矩阵,得到这一帧该物体每个顶点的坐标。 三大变换: 模型视图变换 (自身) 投影变换  (观察) 视口变换(显示) 在模型矩阵中,我们关心物体在变换后处在世界坐标系下的位置。事实上,我们更加关心物体相对于观察者的位置。最简单的方案是将观察者置于原点处,面向z轴正半轴,那么空间中的点在世界坐标系下的位置就是其相对于观察者的位置。观察者的位置和方向变化时(用一个变换来描述),就好像整个世界的位置和方向进行了相反的变换。所以,在所有物体的模型矩阵的左侧再乘以一个表示整个世界变换的模型矩阵,就可以了。这个表示整个世界变换的矩阵又称为“视图矩阵”,因为他们经常一起工作

[3D基础]Pick原理

杀马特。学长 韩版系。学妹 提交于 2019-12-18 01:23:29
在游戏及编辑器中经常用到pick拾取世界坐标系中的几何物体,今天周末有空整理下推导公式。 第一步:获取Picking Ray 给出窗口坐标W(x,y)、width、Height、Camera设置,返回射线原点及方向。 推导过程:窗口坐标->屏幕(视口)坐标->视平面坐标->世界坐标系中的射线原点及方向 1. 窗口坐标系到屏幕坐标系的转换公式: sx = wx / width sy = 1 – wy / height 2. 因为视口不一定是整个窗口区域,所以视口坐标: px = (sx – port.left) / (port.right – port.left) py = (sy – port.bottom) / (port.top – port.bottom ) 3. 视口坐标系到视平面坐标系的转换公式: fx = frustum.left + px * (frustum.right – frustum.left ) fy = frustum.bottom + py * (frustum.top – frustum.bottom ) frustum可以根据水平垂直fov视野及视平面d获得。 可以知道 frustum.left <=fx <= frustum.right; frustum.bottom <=fy <= frustum.top。 4.

飞控IMU姿态估计流程

♀尐吖头ヾ 提交于 2019-12-13 07:52:46
飞控中使用加速度计,陀螺仪,磁罗盘进行姿态估计算法流程。 step1: 获取陀螺仪,加速度计,磁罗盘的原始数值。 step2: 陀螺仪,加速度计减去固定的偏移后得到校准数值,磁罗盘通过偏移和缩放后得到校准数值。(都是在载体坐标系下的测量值)。 step3: 首先根据上次的飞控姿态四元数计算出载体坐标系在世界坐标系中的旋转矩阵。 公式:从四元数 q ( w , x , y , z ) q(w,x,y,z) q ( w , x , y , z ) 到旋转矩阵 [ 1 − 2 y 2 − 2 z 2 2 x y + 2 w z 2 x z − 2 w y 2 x y − 2 w z 1 − 2 x 2 − 2 z 2 2 y z + 2 w x 2 x z + 2 w y 2 y z − 2 w x 1 − 2 x 2 − 2 y 2 ] \begin{bmatrix} {1 - 2{y^2} - 2{z^2}} & {2xy + 2wz} & {2xz - 2wy} \\ {2xy - 2wz} & {1 - 2{x^2} - 2{z^2}} & {2yz + 2wx} \\ {2xz + 2wy} & {2yz - 2wx} & {1 - 2{x^2} - 2{y^2}} \\ \end{bmatrix} ⎣ ⎡ ​ 1 − 2 y 2 − 2 z 2 2 x y − 2 w z 2

世界坐标系和相机坐标系之间的转换

北慕城南 提交于 2019-12-10 03:53:02
博客转载自: https://www.cnblogs.com/-Mr-y/p/7737990.html 机器人一号和二号,分别在世界坐标系中。 一号的位姿 q 1 = [ 0.35 , 0.2 , 0.3 , 0.1 ], t 1 = [ 0.3 , 0.1 , 0.1 ] T。 二号的位姿 q 2 = [ − 0.5 , 0.4 , − 0.1 , 0.2 ], t 2 = [ − 0.1 , 0.5 , 0.3 ] T。 q的第一项是实部,且还未归一化。 q和t表达的是T cw 也就是世界坐标系到相机坐标系的变换关系。 已知一号机器人看到某个点,在他的坐标系下是 p = [ 0.5 , 0 , 0.2 ] T, 求在二号机器人坐标系下该点的位置。 #include <iostream> #include <cmath> // Eigen 部分 #include <Eigen/Core> // 稠密矩阵的代数运算(逆,特征值等) #include <Eigen/Dense> //Eigen 几何模块 #include <Eigen/Geometry> using namespace std; int main(int argc, char **argv) { Eigen::Quaterniond q1(0.35, 0.2, 0.3, 0.1); Eigen:

针孔成像模型

左心房为你撑大大i 提交于 2019-12-04 06:36:14
相机模型 数码相机图像拍摄的过程实际上是一个光学成像的过程。相机的成像过程涉及到四个坐标系: 世界坐标系、相机坐标系、图像坐标系、像素坐标系 以及这四个坐标系的转换。 一、理想透视模型——针孔成像模型 相机模型是光学成像模型的简化,目前有线性模型和非线性模型两种。实际的成像系统是透镜成像的非线性模型。最基本的透镜成像原理如图所示: 其中 u 为物距, f 为焦距,v 为相距。三者满足关系式: 相机的镜头是一组透镜,当平行于主光轴的光线穿过透镜时,会聚到一点上,这个点叫做 焦点 ,焦点到透镜中心的距离叫做 焦距 f 。数码相机的镜头相当于一个凸透镜,感光元件就处在这个凸透镜的焦点附近,将焦距近似为凸透镜中心到感光元件的距离时就成为小孔成像模型。小孔成像模型如图所示。                 小孔成像模型 为了简化分析,我们将成像平面放在小孔前面,并且成的像也是正立的。 小孔成像模型是相机成像采用最多的模型。在此模型下,物体的空间坐标和图像坐标之间是线性的关系,因而对相机参数的求解就归结到求解线性方程组上。四个坐标系的关系图如下图所示,其中 M 为三维空间点,m 为 M 在图像平面投影成的像点。 ① 世界坐标系 :是客观三维世界的绝对坐标系,也称客观坐标系。因为数码相机安放在三维空间中,我们需要世界坐标系这个基准坐标系来描述数码相机的位置

问题记录-(2019/11/5)

北城余情 提交于 2019-12-03 14:37:55
坐标变换-旋转(我们把点云原坐标系称为世界坐标系,把以本身正方向得到的坐标系称为 基坐标系) 让点云cloud 旋转到与坐标轴重回,且质心位于世界坐标系原点; 1。由cloud 本身参数求得质心,获得协方差矩阵,由协方差矩阵solver 得到 vectors 和 values, 使得vectors 正交化,得到点云主方向极坐标,也是由cloud世界坐标到基坐标的旋转矩阵, 2.点云旋转至世界坐轴系重回即为基坐标向世界坐标系旋转。求仿射变换矩阵。 Eigen::Matrix4f transfroms_residual = Eigen::Matrix4f::Identity(); Eigen::Matrix4f transfroms_residual_inv = Eigen::Matrix4f::Identity(); transfroms_residual.block<3, 3>(0, 0) = eigenVectorsPCA_residual.transpose(); transfroms_residual.block<3, 1>(0, 3) = -1.0f*(eigenVectorsPCA_residual.transpose())*(pcaCentroid_residual.head<3>()); //-R*t transfroms_residual_inv =

Opencv 3.4 中的EPnp位姿估计算法

匿名 (未验证) 提交于 2019-12-03 00:37:01
这里只介绍opencv3.4 中Epnp算法的头文件,具体内容可以参考论文《EPnP: An Accurate O(n) Solution to the PnP Problem》+opencv3.4 源代码。 源代码+参考文论+部分ppt已经传到csdn。 #ifndef epnp_h #define epnp_h #include "precomp.hpp" #include "opencv2/core/core_c.h" namespace cv { class epnp { public: /* max 注释 * 函数功能:ePnP算法的初始化构造函数,ePnP求解最少需要4对点,而且是相机内参已知 * * 参数: * [in] cameraMatrix 相机内参 * [in] opoints 参考点在世界坐标系中的点,至少4个点-------float or double * [in] ipoints 参考点在相机图像上的投影点坐标,至少4个点-------float or double * 返回值: * */ epnp(const cv::Mat& cameraMatrix, const cv::Mat& opoints, const cv::Mat& ipoints); ~epnp(); // 此函数没有实现---没有使用 void add_correspondence