坐标变换

[原创] 骨骼运动变换的数学计算过程详解

我们两清 提交于 2020-02-03 22:56:30
1. 骨骼静止状态(参考姿势)下的节点坐标转换 以上图为例子,图中有三个彼此嵌套的坐标系:子骨骼坐标系、父骨骼坐标系和世界坐标系。首先,我们不考虑骨骼的运动,设 V c 为顶点 V 在子骨骼本地坐标系中的位置 ,那么在各骨骼静止的情况下: 从子骨骼坐标转换到父骨骼坐标: V p = V c * M L->P 从父骨骼坐标转换到世界坐标: V w =V p *M P->W 因此,从子骨骼坐标直接转换到世界坐标的过程为: V w =V c *M C->P *M P->W 其中, V c 可以表示为一个行向量: V c =(x c , y c , z c , 1 ) ;而 M C->P 、 M P->W 是两个平移阵,其中( dx p , dy p , dz p )、( dx c , dy c , dz c )分别为父、子骨骼各自的坐标系原点在世界坐标系中的位置: 注意!在上图的示例中, M C->P 、 M P->W 只是两个平移矩阵而已,这是最常见的一种简单情况。但在实际情况下,各骨骼的本地坐标轴完全没有必要跟世界坐标轴一致,因此, M C->P 、 M P->W 也可能包含了旋转、缩放等复杂变换,但其基本原理是相通的。 2. 骨骼运动积累变换的计算 接下来我们进一步来考虑骨骼运动的情况。描述一根骨骼运动的最典型的方法,是将其运动分解成为 相对于其自身本地坐标系的 旋转和平移

ROS探索总结-tf坐标变换

空扰寡人 提交于 2020-01-18 03:01:08
tf简介 TF(TransForm),就是坐标转换,包括了位置和姿态两个方面的变换。注意区分坐标转换和坐标系转换。 坐标转换是一个坐标在不同坐标系下的表示,而坐标系转换不同坐标系的相对位姿关系。 tf功能包 tf是一个让用户随时间跟踪多个参考系的功能包,它使用一种树型数据结构,根据时间缓冲并维护多个参考系之间的坐标变换关系,可以帮助用户在任意时间,将点、向量等数据的坐标,在两个参考系中完成坐标变换。 tf工具 坐标系统虽然是一个基础理论,但是由于涉及多个空间的变换,所以TF功能包提供了丰富的命令行工具来帮助用户调试和创建tf变换。 tf_monitor tf_monitor工具的功能是打印tf树中的所有坐标系的状态,或者通过参数来查看指定参考系之间的信息。 tf_monitor tf_monitor <source_frame> <target_target> 运行后效果: xx@xx:~ $rosrun tf tf_monitor #显示当前坐标变换树的信息,主要是名称和实时的时间延时 RESULTS: for all Frames Frames: Frame: base_footprint published by unknown_publisher Average Delay: 0.00555556 Max Delay: 0.01 Frame: base_link

第六章 基础纹理(2)

为君一笑 提交于 2020-01-17 15:36:05
目录 凹凸映射 1.1 高度纹理 1.2 法线纹理 1.3 使用模型空间存储法线的优点和使用切线空间的优点 2. 实践 2.1 在切线空间下计算 2.2 在世界空间下计算 3.Unity中的法线纹理类型 @ 凹凸映射 纹理另一种常见的应用就是凹凸映射(bump mapping)。凹凸映射的目的是使用一张纹理来修改模型表面的法线,以便为模型提供更多的细节。这种方法不会真的改变模型的顶点位置,只是让模型看起来好像是“凹凸不平”的,但可以从模型的轮廓处看出“破绽”。 有两种主要的方法可以用来进行凹凸映射:一种方法是使用一张高度纹理(height map)来模拟表面位移(displacement),然后得到一个修改后的法线值,这种方法也被称为高度映射(height mapping);另一种方法则是使用一张法线纹理(normal map)来直接存储表面法线,这种方法又被称为法线映射(normal mapping)。尽管我们常常将凹凸映射和法线映射当成是相同的技术,但读者需要知道它们之间的不同。 1.1 高度纹理 我们首先来看第一种技术,即使用一张高度图来实现凹凸映射。高度图中存储的是强度值(intensity),它用于表示模型表面局部的海拔高度。因此,颜色越浅表明该位置的表面越向外凸起,而颜色越深表明该位置越向里凹。这种方法的好处是非常直观,我们可以从高度图中明确的知道一个模型表面的凹凸情况

Android 变形矩阵——Matrix

荒凉一梦 提交于 2020-01-17 06:49:19
对于图像的色彩处理,Android系统提供了ColorMatrix颜色矩阵来帮助我们进行图像处理。而对于图像的图形变化,Android系统也是通过来进行处理的,每个像素点都表达了其坐标的X、Y信息。Android的图形变换矩阵是一个3x3的矩阵,如图(1)所示。 当使用变换矩阵去处理每一个像素点的时候,与颜色矩阵的矩阵乘法一样,计算公式如下所示。 X1 = a * X + b * Y + c Y1 = d * X + e * Y + f l = g * X + h * Y + i 通常情况下,会让g=h=0,i=1,这是使 l = g * x + h *y + i恒成立。因此,只需要关注上面几个参数就可以了。 与色彩变换矩阵的初始矩阵一样,图像变换矩阵也有一个初始矩阵。很明显,就是对直角元素a、e、i我1,其他元素我0的矩阵,如图(2)所示。 图像的变化处理通常包含以下四类基本变化 ● Translate——平移变换 ● Rotate——选择变换 ● Scale——缩放变换 ● Skew——错切变换 ▶ 平移变换 平移变换的坐标值变换过程如图(3)所示,即将每个像素点都进行平移变换。 当从p(X0,Y0)平移到p(X,Y),坐标值发送了如下所示的变换 X = X0 + △X Y = Y0 + △Y 如果写成矩阵形式就是如图(4)所示。 通过技计算可发现如下等式。 X = X0 +

OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)

Deadly 提交于 2020-01-17 06:41:35
本文转载自: https://www.cnblogs.com/wangguchangqing/p/4045150.html 作者:wangguchangqing 转载请注明该声明。 在 OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1) 主要介绍了图像变换中的向前映射、向后映射、处理变换过程中浮点坐标像素值的插值算法,并且基于 OpenCV2 实现了两个简单的几何变换:平移和镜像变换。本文主要稍微复杂点的两个几何变换:缩放和旋转。 1.图像缩放 图像的缩放主要用于改变图像的大小,缩放后图像的图像的宽度和高度会发生变化。水平缩放系数,控制图像宽度的缩放,其值为1,则图像的宽度不变;垂直缩放系数控制图像高度的缩放,其值为1,则图像的高度不变。如果水平缩放系数和垂直缩放系数不相等,那么缩放后图像的宽度和高度的比例会发生变化,会使图像变形。要保持图像宽度和高度的比例不发生变化,就需要水平缩放系数和垂直缩放系数相等。 左边的图像水平缩放系数和垂直缩放系数都是0.5;右边的图像的水平缩放系数为1,垂直缩放系数为0.5,缩放后图像宽度和高度比例发生变化,图像变形。 1.1 缩放原理 设水平缩放系数为sx,垂直缩放系数为sy,(x0,y0)为缩放前坐标,(x,y)为缩放后坐标,其缩放的坐标映射关系: 矩阵表示的形式为: 这是向前映射,在缩放的过程改变了图像的大小

STN-Spatial Transformer Networks-论文笔记

痴心易碎 提交于 2020-01-07 19:58:43
原文链接: https://arleyzhang.github.io/articles/7c7952f0/ 论文地址: https://arxiv.org/abs/1506.02025 1 简介 1.2 问题提出 CNN在图像分类中取得了显著的成效,主要是得益于 CNN 的深层结构具有 空间不变性(spatially invariance)(平移不变性,旋转不变性),所以图像上的目标物体就算是做了平移或者旋转,CNN仍然能够准确的识别出来,这对于CNN的泛化能力是有益的。 空间不变性主要是由于 Pooling 层 和 步长不为1的卷积层 的存在带来的。实际上主要是池化层的作用,因为大部分的卷积层的步长都是大于1而又小于卷积核大小的,也就是滑动时是有重叠的,而池化层一般不是重叠的。也就是说这些层越多,越深,池化核或卷积核越大,空间不变性也越强;但是随之而来的问题是局部信息丢失,所以这些层越多准确率肯定是下降的,所以主流的CNN分类网络一般都很深,但是池化核都比较小,比如2×2。 比如ResNet,GoogLeNet,VGG,FCN,这些网络的总降采样比例一般是 16或32,基本没有见过 64倍,128倍或者更高倍数的降采样(会损失局部信息降低准确率),也很少见到 2倍或者4倍的降采样比例(空间不变性太弱,泛化能力不好)。不过这个是跟数据集中的图像大小有关的

STN-Spatial Transformer Networks-论文笔记

寵の児 提交于 2020-01-06 07:47:41
原文链接: https://arleyzhang.github.io/articles/7c7952f0/ 论文地址: https://arxiv.org/abs/1506.02025 1 简介 1.2 问题提出 CNN在图像分类中取得了显著的成效,主要是得益于 CNN 的深层结构具有 空间不变性(spatially invariance)(平移不变性,旋转不变性),所以图像上的目标物体就算是做了平移或者旋转,CNN仍然能够准确的识别出来,这对于CNN的泛化能力是有益的。 空间不变性主要是由于 Pooling 层 和 步长不为1的卷积层 的存在带来的。实际上主要是池化层的作用,因为大部分的卷积层的步长都是大于1而又小于卷积核大小的,也就是滑动时是有重叠的,而池化层一般不是重叠的。也就是说这些层越多,越深,池化核或卷积核越大,空间不变性也越强;但是随之而来的问题是局部信息丢失,所以这些层越多准确率肯定是下降的,所以主流的CNN分类网络一般都很深,但是池化核都比较小,比如2×2。 比如ResNet,GoogLeNet,VGG,FCN,这些网络的总降采样比例一般是 16或32,基本没有见过 64倍,128倍或者更高倍数的降采样(会损失局部信息降低准确率),也很少见到 2倍或者4倍的降采样比例(空间不变性太弱,泛化能力不好)。不过这个是跟数据集中的图像大小有关的

透视投影(Perspective Projection)变换推导

﹥>﹥吖頭↗ 提交于 2020-01-06 04:32:41
透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。在算法中它是通过透视矩阵乘法和透视除法两步完成的。 透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。 没错,主流的3D APIs如OpenGL、D3D的确把具体的透视投影细节封装起来,比如gluPerspective(„) 就可以根据输入生成一个透视投影矩阵。而且在大多数情况下不需要了解具体的内幕算法也可以完成任务。但是你不觉得,如果想要成为一个职业的图形程序员或游 戏开发者,就应该真正降伏透视投影这个家伙么?我们先从必需的基础知识着手,一步一步深入下去(这些知识在很多地方可以单独找到,但我从来没有在同一个地 方全部找到,但是你现在找到了)。 我们首先介绍两个必须掌握的知识。有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考 可以找到一组坐标(v1,v2,v3),使得 v = v1 a + v2 b + v3 c (1) 而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得 p –

opengl学习笔记

不羁的心 提交于 2020-01-03 08:38:56
准备: 1、准备资源: 从 GLEW1.13.0 下载GLEW,并且解压出glew-1.13.0目录。 从FreeGLUT官网下载3.0.0版本。直接从这里下的 编译后的FreeGLUT ,选for MSVC,下载后解压。 2、将所有的x64(64位)版本的.h和.lib拷贝到vs2015安装目录下的vc文件夹里的include和lib里 将所有.dll文件拷贝到C:\Windows\SysWOW64这个目录下 如果是32位系统就不一样了 3、打开ivs2015,创建新的控制台应用程序 #include <glut.h> #include <glew.h> 包括上边的两个头文件 1 void myDisplay(void) 2 { 3 glClear(GL_COLOR_BUFFER_BIT); 4 glColor3f(0.0f, 1.0f, 0.0f); 5 glRectf(-0.5f, -0.5f, 0.5f, 0.5f); 6 glFlush(); 7 } 8 9 int main(int argc, char *argv[]) 10 { 11 glutInit(&argc, argv); 12 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 13 glutInitWindowPosition(100, 100); 14

投影矩阵推导(翻译)

我们两清 提交于 2020-01-01 21:57:24
投影矩阵推导(翻译) 原网址: http://www.codeguru.com/cpp/misc/misc/graphics/article.php/c10123/Deriving-Projection-Matrices.htm 3D矩阵变换中,投影矩阵是最复杂的。位移和缩放变换一目了然,旋转变换只要基本的三角函数就能想象出来,投影矩阵则很难凭借直觉想象出来。 总述:什么是投影 计算机显示屏是二维平面,所以如果你想显示三维物体,需要找到把三维物体渲染成二维图像的方法。这正是投影要做的。最简单的做法:直接丢掉三维物体各顶点的Z坐标。对于一个立方体,看起来像图1: 图1 通过丢掉Z坐标方法投影到XY平面 这种投影简单且不实用。所以,一开始就不应该投影到“面”(plane)上,而应该投影到一个“体”(volume)内,即所谓的“规范视域体”(canonical view volume)。规范视域体的顶点坐标在不同的API(DirectX/OpenGL)中有所不同。这里就用D3D的标准,从 (-1,-1,0)到(1,1,1)。当所有的顶点映射到规范视域体中后,XY坐标用来再映射到屏幕上。Z坐标看起来无用,不过通常用来表示深度信息。这也是为什么会投影到一个“体”,而不是“面”的原因。 下面将讲述两种常见变换:正交变换、透视变换。 正交变换 “正交”的由来是投影线与显示平面垂直