变换矩阵

Direct3D基础(顶点坐标变换)

我的梦境 提交于 2019-12-26 20:07:06
开始的话:顶点坐标变换时Direct3D学习中的入门基础,在这里将详述其原理: Direct3D中渲染三维对象的过程分为两个阶段:《1》T&L(Transforming and Lighting),即坐标变换和光照; 《2》光栅化处理阶段。 一,T&L流水线: 如下图: 1,世界变换和世界坐标系( 局部坐标变为世界坐标 ): 物体在三维空间中的变形和运动的过程称为世界变换(平移,旋转,缩放),这个三维空间就是世界空间,其坐标系就是三维坐标系 世界变换 事实上就是将物体顶点从模型空间转换到世界空间中,模型空间其实就是在三维设计软件(如3DSMAX)中为物体设定的坐标系,也称局部坐标系。而世界坐标则是所有物体都是用同一个世界坐标原点的坐标系,变换就是指对模型进行平移,旋转,缩放及它们的任意组合变换。 使用以下公式对点P1进行世界变换。 P2(X,Y,Z,1)= dot( P1(X,Y,Z,1), M ) M 为世界变幻矩阵,它实现物体的平移,旋转,缩放,dot为点乘,P2为变换后的坐标,p1为变换前的坐标。 以下为实现世界坐标矩阵变换的DirectX代码(C++): D3DXMATRIX matWorld; // 世界变换矩阵 D3DXMATRIX matTranlate,matRotation,matScale; // 变换矩阵,旋转矩阵,缩放矩阵 D3DX

[opencv] 图像几何变换:旋转,缩放,斜切

不问归期 提交于 2019-12-26 15:13:36
几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法是最近邻插值,就是令输出像素的灰度值等于映射最近的位置像素,该方法可能会产生锯齿。这种方法也叫零阶插值,相应比较复杂的还有一阶和高阶插值。 插值算法感觉只要了解就可以了,图像处理中比较需要理解的还是空间变换。 空间变换 空间变换对应矩阵的 仿射变换 。一个坐标通过函数变换的新的坐标位置: 所以在程序中我们可以使用一个2*3的数组结构来存储变换矩阵: 以最简单的平移变换为例,平移(b1,b2)坐标可以表示为: 因此,平移变换的变换矩阵及逆矩阵记为: 缩放变换:将图像横坐标放大(或缩小)sx倍,纵坐标放大(或缩小)sy倍,变换矩阵及逆矩阵为: 选择变换:图像绕原点逆时针旋转a角,其变换矩阵及逆矩阵(顺时针选择)为: OpenCV中的图像变换函数 基本的放射变换函数: void cvWarpAffine( const CvArr* src,//输入图像 CvArr* dst, //输出图像 const CvMat* map_matrix, //2*3的变换矩阵 int flags=CV_INTER_LINEAR

优雅的线性代数系列一

狂风中的少年 提交于 2019-12-26 09:47:51
 说道线性代数, 我们自然就想到矩阵, 那我们该如何理解矩阵呢? 矩阵与线性变换 若一个变换 \(L\) 满足以下两条性质 \[ \begin{align*} L(\vec v+ \vec w) &= L(\vec v) + L(\vec w) &(1) \text{"可加性"} \\ L(c\vec v) &= c L(\vec v) \quad\quad\ &(2) \text{"成比例"} \end{align*} \] 则称 \(L\) 是线性的. 值得注意的一点时, 线性变换中, 坐标系的原点不动, 即零向量的变换结果还是零向量. 我们来看看矩阵与线性变换的关系 \[ A(v+w) = Av + Aw \Leftrightarrow L(\vec v+ \vec w) = L(\vec v) + L(\vec w)\\ A(cv) = c(Av) \Leftrightarrow L(c\vec v) = c L(\vec v) \] 可以看出矩阵完全满足线性变换的要求, 所以现在你应该将矩阵看做线性变换, 这会给我们理解很多线性问题带来很大的好处. \(\bigstar\) 如果想知道线性变换对于一个输入向量空间有什么影响, 我们只需要知道该线性变换对该输入空间的基有什么影响, 我们就能知道所有信息. 假设 n 维输入空间 \(R^n\) 的基为 \(v1, v_2,

SVD分解技术详解

时光总嘲笑我的痴心妄想 提交于 2019-12-25 15:58:11
版权声明: 本文由LeftNotEasy发布于 http://leftnoteasy.cnblogs.com , 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系 wheeleast@gmail.com 前言: 上一次写了关于 PCA与LDA 的文章,PCA的实现一般有两种,一种是用特征值分解去实现的,一种是用奇异值分解去实现的。在上篇文章中便是基于特征值分解的一种解释。特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中。而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景。奇异值分解是一个有着很明显的物理意义的一种方法,它可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要的特性。就像是描述一个人一样,给别人描述说这个人长得浓眉大眼,方脸,络腮胡,而且带个黑框的眼镜,这样寥寥的几个特征,就让别人脑海里面就有一个较为清楚的认识,实际上,人脸上的特征是有着无数种的,之所以能这么描述,是因为人天生就有着非常好的抽取重要特征的能力,让机器学会抽取重要的特征,SVD是一个重要的方法。 在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做feature reduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层次检索的LSI(Latent Semantic

奇异值分解(SVD)原理及应用

若如初见. 提交于 2019-12-23 13:45:11
一、奇异值与特征值基础知识: 特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法。两者有着很紧密的关系,我在接下来会谈到,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。先谈谈特征值分解吧: 1)特征值: 如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式: 这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式: 其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。我这里引用了一些参考文献中的内容来说明一下。首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵: 它其实对应的线性变换是下面的形式: 因为这个矩阵M乘以一个向量(x,y)的结果是: 上面的矩阵是对称的,所以这个变换是一个对x,y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时,是拉长,当值<1时时缩短),当矩阵不是对称的时候,假如说矩阵是下面的样子: 它所描述的变换是下面的样子:   这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换

矩阵运算

亡梦爱人 提交于 2019-12-23 11:21:45
二、 矩阵运算 1. 什么是矩阵 矩阵就是由多组数据按方形排列的阵列,在 3D 运算中一般为方阵,即 M*N ,且 M=N ,使用矩阵可使计算坐标 3D 坐标变得很方便快捷。下面就是一个矩阵的实例: 看似没什么特殊的,可是后面你可以看到矩阵的魅力,为什么矩阵这么有效,我也不知道,这个由数学家去论述,我们只要可以用就是了。 2. 向量的点乘和叉乘 向量的点乘和叉乘与矩阵一样是数学定义,点乘在矩阵运算中起到很重要的作用,称为内积,叉乘称为外积,通过叉乘运算可以计算出一个向量,该向量垂直于由两个向量构成的平面,该向量也称为该平面的法线。这两个计算方法在 3D 运算中的作用就是向量计算工具。 l 点乘公式 其实就是两个向量的各分量相乘后形成新的向量 l 叉乘公式 Uc=U1* U2 两个向量进行叉乘的矩阵如下: 其中 x1 , y1 , z1 以及 x2 , y2 , z2 分别为向量 U1 和 U2 的分量,设 UC 为叉乘的向量积,其计算公式如下: 3. 三维几何变换矩阵 几何绘图中,常常需要将一个模型从一个位置移动到另一个位置,或者将模型进行缩放旋转,称为几何变换。每个模型都存在一个局部的坐标系,在制作模型的时候是不考虑模型在场景中的具体位置的,模型中的所有顶点的坐标值都相对于局部坐标系,而模型在应用中会发生很多变化,其中大部分情况都是由多种变化复合的结果,这些变化涉及很多复杂的运算

机器学习数学基础-线性代数

≡放荡痞女 提交于 2019-12-23 00:04:45
前言 AI(人工智能)现在火的一塌糊涂,其实在AI领域,机器学习已广泛应用在搜索引擎、自然语言处理、计算机视觉、生物特征识别、医学诊断、证券市场分析等领域,并且机器学习已经是各大互联网公司的基础设施,不再是一个新鲜的技术。但当你真的开始学习机器学习的时候,就会发现上手门槛其实还挺高的,这主要是因为机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。 本文主要介绍一下机器学习涉及到的一些最常用的的数学知识,方便大家在学习机器学习的时候,能扫除一些基础障碍。 标量(scalar) 标量是一个单独的数,一般用普通小写字母或希腊字母表示,如 等。 向量(vector)相关 向量的定义 把数排成一列就是向量,比如: 向量一般用粗体小写字母或粗体希腊字母表示,如 等(有时候也会用箭头来标识,如 ),其元素记作 。 向量默认为列向量,行向量需要用列向量的转置表示,例如 等。 物理专业视角:向量是空间中的箭头,决定一个向量的是它的长度和方向 计算机专业视角:向量是有序的数字列表 数学专业视角:向量可以是任何东西,只要保证两个向量相加以及数字与向量相乘是有意义的即可 运算规则 向量的加法和数量乘法定义: 加法 相同维数的向量之间的加法为: 数量乘法 任意的常数 和向量的乘法为: 在给定数 及向量 的情况下 张成空间 张成空间是向量 和

OSG 两个相机

独自空忆成欢 提交于 2019-12-20 21:09:58
在场景中创建两个视口。其中一个用于从坦克驾驶员的视角观察场景。该视口将被渲染于屏幕的上半部分。第二个视口由缺省的osgViewer::Viewer类接口(轨迹球,飞行等控制器)控制。它将被渲染于屏幕的中下部分。 概述: OSG向开发人员提供了各种的抽象层次接口。前面的教程讨论的主要是一些较高层级的接口应用:例如使用Viewer类来控制视点,场景,交互设备和 窗口系统。OSG的优势之一,就是可以允许开发者在使用高层次的接口的同时,访问较低层次的抽象接口。本章将使用一些低抽象层级的功能,对视点进行控制, 并使用相应的类渲染场景。 代码: 为了创建两个视口,我们需要提供两个独立可控的摄像机。与OSG 1.2版本中所述不同的是,本例中将不再使用Prodecer::CameraConfig类,而是将多个不同的视口添加到组合视口 CompositeViewer类当中。下面的函数即用于实现添加视口并设置其中的摄像机位置。 void createView (osgViewer::CompositeViewer *viewer,//查看器,一个相框 osg::ref_ptr<osg::Group> scene,//场景 osg::ref_ptr<osg::GraphicsContext> gc,//显示设置定义相框的大小,View和Viewr在屏幕上的大小,位置 osgGA:

矩阵与行列式的几何意义

旧街凉风 提交于 2019-12-20 02:29:05
作者:童哲 链接:https://www.zhihu.com/question/36966326/answer/70687817 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 行列式这个“怪物”定义初看很奇怪,一堆逆序数什么的让人不免觉得恐惧,但其实它是有实际得不能更实际的物理意义的, 理解只需要三步 。这酸爽~ 1,行列式 是针对一个 的矩阵 而言的。 表示一个 维空间到 维空间的线性变换。那么什么是线性变换呢?无非是一个压缩或拉伸啊。假想原来空间中有一个 维的立方体(随便什么形状),其中立方体内的每一个点都经过这个线性变换,变成 维空间中的一个新立方体。 2,原来立方体有一个体积 ,新的立方体也有一个体积 。 3,行列式 是一个数对不对?这个数其实就是 ,结束了。 就这么简单?没错,就这么简单。 所以说:行列式的本质就是一句话: 行列式就是线性变换的放大率! 理解了行列式的物理意义,很多性质你根本就瞬间理解到忘不了!!!比如这个重要的行列式乘法性质: 道理很简单,因为放大率是相乘的啊~! 你先进行一个 变换,再进行一个 变换,放大两次的放大率,就是式子左边。 你把“先进行 变换,再进行 变换”定义作一个新的变换,叫做“ ”,新变换的放大律就是式子右边。 然后你要问等式两边是否一定相等,我可以明确告诉你:too simple 必须相等。因为其实只是简单的把事实陈述出来了

线性代数学习笔记二

﹥>﹥吖頭↗ 提交于 2019-12-20 02:28:06
线性代数学习笔记二 /*--> */ /*--> */ */ /*--> */ */ /*--> */ 线性代数学习笔记二 目录 1. 线性方程组 1.1. 行化简与阶梯型矩阵 1.1.1. 主元位置 1.1.2. 线性方程组的解 1.2. 向量方程 1.3. 矩阵方程 1.4. 线性方程组的解集 1 线性方程组 矩阵记号是为解方程组带来方便。 解方程组,消元法。 三种基本变换对应于增广矩阵的下列变换: 行初等变换 (倍加变换 replacement) 把某一行换成它本身与另一行的倍数的和 (对换变换 interchange) 把两行对换 (倍乘变换 scaling) 把某一行的所有元素乘以同一个非零数 行变换可应用于任何矩阵.如果一个矩阵可以经过一系列行初等变换变成另一个矩阵,则称这两个矩阵是行等价的。 行变换是可逆的。 线性方程组的两个基本问题: 方程组是否相容,即它是否至少有一个解? 若它有解,是否只有一个解,即解是否唯一? 1.1 行化简与阶梯型矩阵 非零行或列指矩阵中至少包含一个非零元素的行或列,非零行的先导元素是指该行中最左边的非零元素。 一个矩阵称为阶梯型,则有以下三个性值: 1 每一非零行在每一零行之上 2 某一行的先导元素所在的列位于前一行先导元素的右面 3 某一先导元素所在列下方元素都是零。若一个阶梯型矩阵还满足以下性质,则称它为简化阶梯形: 4