精华内容
下载资源
问答
  • 仿射变换和透视变换和图像坐标系、相机坐标系和世界坐标系定义开篇仿射变换透视变换图像坐标系、相机坐标系和世界坐标系三维的点投影在二维平面上坐标系和坐标变换公式合体Zhang方法 开篇 本文主要介绍计算机视觉...

    开篇

    本文主要介绍计算机视觉的位姿估计,相机标定原理,和zhang方法求解内外相机参数。

    仿射变换

    这个是一般的仿射变换的公式。

    为了能够更好的理解它,我们首先来看看下面几幅图:

    在这里插入图片描述
    上面的x和y分别代表像素的坐标,然后x0,y0代表的是平移量。然后生成了新的位置u和v。然后旋转也是一样的。首先这个旋转一定要在原点,所以一般opencv的第一步就是把这个图像的中心放到原点。最终在平移回去
    在这里插入图片描述

    上面这个是缩放的公式,都是大同小异,一样的到底。把x放大Sx倍,把y放大Sy倍。那么现在再来看看咱们上面的那仿射变换的公式。
    在这里插入图片描述
    其中A中的对角线决定 缩放,反对角线决定 旋转 或 错切。
    这就好比缩放的公式乘以了旋转的公式加上了平移的变化。
    这里有一点要注意的就是多边形的图片不能用仿射变换,因为会导致四边形的边消失,可以看看这个:https://www.zhihu.com/question/20666664/answer/15790507
    (个人认为是在Shear的过程中,多边形可能会在某个值重合成一条线,这里我也不太明白,有大牛可以告知一下)
    这里一般来说,opencv中的实现需要咱们提供至少6个点,其中三个点是输入,后三个是输出。

    透视变换

    先上一张图,其实我觉得透视变换就是仿射变换的升级版。
    在这里插入图片描述
    在这里插入图片描述
    透视变换就是从左图转换到了右图。相信也很容易理解。相当于换了个视角来看事物。如下图:
    在这里插入图片描述
    下面来看看公式:
    在这里插入图片描述
    opencv的实现和仿射变换差不多,不过这个是需要至少4个点集才能进行。就比如上面那个公路的图,首先自己要决定点在哪里,这个图的话肯定选择的是白线上的点,得到坐标之后,如果想变成一个类似于长方形的(就是右图)的图像的话,这里的点的坐标也是需要自己决定的,如果想要使刚刚左图中选择的点成为一些比如平行等关系,需要自己合理安排一下,然后套到公式里面进行暴力求解,求得这9个值。

    图像坐标系、相机坐标系和世界坐标系

    图像左边西和相机坐标系和时间坐标系都是可以用过线性变化来互相转化的。先看看这幅图:
    在这里插入图片描述
    图中壶的位置是图像坐标系,也可以说是物体坐标系,两个相机有两个不同的相机坐标系,然后相机和物体存在的这个房间或者什么地方可以被叫做世界坐标系。
    怎么样才能从一个坐标系变换到另外一个坐标系呢?
    首先来看看坐标系是如何旋转的。
    在这里插入图片描述
    同理,上图是绕Z轴旋转的示意图,当然也可以绕x或y轴旋转。
    在这里插入图片描述
    那么从一个坐标系可以通过各种旋转加平移变成另外一个坐标系。通过上面的等式,我们可以看到物体点P通过旋转位移便可以得到在相机坐标系的坐标

    三维的点投影在二维平面上

    这个说白了就是一个小孔成像模型,摄像机通过小孔,把成像映射在平面的点上。
    在这里插入图片描述
    对应的公式就是上面图右下角的公式,便可以得到对应的二维平面坐标

    坐标系和坐标变换

    在这里插入图片描述
    首先,图像坐标系和像素坐标系都是二维的。只不过他们的度量单位和原点不同而已。像素坐标系是以每个像素为基本单位,就好比说咱们一副3*3的图像一共有9个像素一个道理。但图像坐标系的单位是mm,dx,dy分别代表的是一个像素点的长和宽,单位是mm。

    公式合体

    在这里插入图片描述
    其中,在这里插入图片描述算是外参矩阵,后面的RT矩阵是内参矩阵。看下图
    在这里插入图片描述
    很明显我们最后有了12个未知数,然后每一个点可以为我们带来二个式子。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    所以现在就是解方程了,只要有6个点切非共面(如果不满足这个的话求出来的解不满足正交矩阵,咱们的R旋转矩阵一定是正交矩阵),变可以得出内参和外参。
    需要注意的是这里的求出来的解是内参加外参的一个矩阵。所以这里需要QR分解出来R。具体的求解方法可以看看opencv solvePnp函数。
    还有就是这个内参数:
    现以NiKon D700相机为例,焦距 f = 35mm 最高分辨率:4256×2832 传感器尺寸:36.0×23.9 mm
    根据以上定义可以有:
    u0= 4256/2 = 2128 v0= 2832/2 = 1416 dx = 36.0/4256 dy = 23.9/2832
    fx = f/dx = 4137.8 fy = f/dy = 4147.3
    分辨率可以从显示分辨率与图像分辨率两个方向来分类。
    [1]显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉点的数目。显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。
    [2]图像分辨率则是单位英寸中所包含的像素点数,其定义更趋近于分辨率本身的定义。

    Zhang方法

    在这里插入图片描述
    在这里插入图片描述
    需要小心的是,当我们使用真实的数据求解时,将计算得到的r向量放在一起(R=(r1,r2,r3)),我们并不能得到精确的旋转矩阵R,使得R为正交阵。

    为了解决这个问题,我们常使用强制的方法,即对R进行奇异值分解,R=UDVT,U,V为正交阵,D为对角阵,如果R是正交阵,那么奇异值分解后的对角阵D是单位阵,那么我们将单位阵I代替对角阵D,进而重构出满足正交条件的R.

    奇异值分解的含义: https://www.cnblogs.com/endlesscoding/p/10033527.html
    从上面的图片的压缩结果中可以看出来,奇异值可以被看作成一个矩阵的代表值,或者说,奇异值能够代表这个矩阵的信息。当奇异值越大时,它代表的信息越多。因此,我们取前面若干个最大的奇异值,就可以基本上还原出数据本身。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    我对这个的理解就是咱们一般用的照相机之类的拍照都会有一定的误差,而这个误差就出现在透镜的凸凹的状况。一般我们用一个相机拍摄一个三维的东西,咱们会有物体真实的角点,和图片上的角点,然后用这些先计算一遍,不考虑畸变的外参数和内参数。然后在通过一个叫做Brown的方法来计算畸变参数。然后我们就可以用这些参数去估计坐标系旋转。

    展开全文
  • 坐标系

    万次阅读 2020-03-11 11:06:23
    坐标系(coordinate system、CS) 由两个、三个甚至更多个...坐标轴不必相互垂直的仿射(affine)坐标系;用经纬度、高程来确定点位置的椭球面(ellipsoidal)坐标系等。 坐标参照系(coordinate reference system...

    微信搜索:“二十同学” 公众号,欢迎关注一条不一样的成长之路

     

    坐标系(coordinate systemCS

    由两个、三个甚至更多个坐标轴,单位标度等组成,使得可利用数学法则计算距离、角度或其他几何元素。如坐标轴相互垂直的笛卡尔(Cartesian)坐标系;坐标轴不必相互垂直的仿射(affine)坐标系;用经纬度、高程来确定点位置的椭球面(ellipsoidal)坐标系等。

    坐标参照系(coordinate reference systemCRS

    通过基准面(datum)与真实世界或者说地球相关联的坐标系即坐标参照系。基准面是椭球体用来逼近某地区用的,因此各个国家都有各自的基准面。我们常用的基准面有:BEIJING1954XIAN1980WGS1984等。尽管两者有所不同,

    地心坐标系(geocentric csGEOCCS

    以地球中心为原点,直接用X、Y、Z来进行位置的描述,无需模拟地球球面,常用在GPS中。

    地理坐标系(geographic csGEOGCS

    带Datum的椭球面坐标系,单位经度、纬度,高程用作第三维。参数:椭球体、基准面。

    投影坐标系(projected csPROJCS

    平面坐标系,单位米、英尺等,它用X(Easting)、Y(Northing)来描述地球上某个点的位置。它对应于某个地理坐标系,在UML中表示属于1对多的关系,1个地理坐标系经过不同的投影方式可产生多个投影坐标系。参数:地理坐标系、投影方式。

    地理变换

    在地理坐标系之间的进行数据转换的方法,基准可能不同,有三参数和七参数法。

    投影变换

    当系统所使用的数据来自不同的地图投影,则需要将一种投影的数据转换成另一种投影。

    1.地球椭球体:

    地球椭球体是长短半径为a和b的椭球绕短轴(地轴)PP’旋转而成。如图:

    相关概念:

    • 经线(子午线)

    过旋转轴(地轴) 的平面与椭球面的截线。

     
    • 首(零)子午线

    国际上公认通过英国格林尼治天文台的经线。 

    • 经度的计算

    过该点的子午圈截面与起始子午面之交角。 由首子午线起,向东为正,称东经。由0度到+180度。 由首子午线起,向西为负,称西经。由0度到-180度。

    • 赤道平面

    垂直于地轴并通过地心的平面。

    • 赤道

    赤道平面与椭球面相交的交线(大圆圈)。

    • 纬线(平行圈)

    过某一点与赤道面平行的平面,与椭球面的交线(截线)

    • 纬度的计算

    平行圈的法线与赤道面的交角。 从赤道起,向北为正,称“北纬”。纬度由0度到+90度; 从赤道起,向南为负,称“南纬”。纬度由0度到-90度。

    总结:地面上任意点M的地理位置可由经度和纬度来决定,其地理坐标记成M(纬度,经度)。

    地理坐标的获取方法

    经纬度的测定主要有两种方法:天文测量和大地测量。  

    • 天文测量

    以大地水准面和铅垂线为依据,用天文测量的方法,可获得地面点的天文经纬度。

    • 大地测量

    以旋转椭球体和法线为基准,用大地测量的方法,获得的大地经纬度称为大地坐标,它们构成的地理坐标系称为大地坐标系。

    54北京坐标系和80国家坐标系

    我国过去采用的大地坐标系,其原点在苏联西部的普尔科夫,采用克拉索夫斯基椭球元素,称1954年北京坐标系。

    1980年新测定位于陕西省的坐标原点,采用1975年国家椭球元素,取代“1954年北京坐标系”,称1980年国家坐标系。

    2.平面坐标系定义

    所谓平面坐标系就是指用某点至极点的距离和方向表示该点的位置。

    例如:

    平面直角坐标系

    平面直角坐标系是按直角坐标原理确定某点的平面位置。

    极坐标与平面直角坐标之间可建立一定的关系式,直角坐标系的X轴与极轴重合,二坐标系原点间距离OQ用q 表示。

    则有:

     

    展开全文
  • (经纬度坐标系,空间直角坐标系,天文坐标系,地理坐标系(大地坐标系),参心坐标系,地心坐标系,投影坐标系,一般读者多有困扰,上述坐标系各有侧重点以及不同的参照或者对照形式。应该说经纬度坐标系与空间直角...

    (经纬度坐标系,空间直角坐标系,天文坐标系,地理坐标系(大地坐标系),参心坐标系,地心坐标系,投影坐标系,一般读者多有困扰,上述坐标系各有侧重点以及不同的参照或者对照形式。应该说经纬度坐标系与空间直角坐标系更多层次上是从数学上建立两种不同坐标系;天文坐标系,地理坐标系更多从是否以地球为参照建立两种不同坐标系;而参心坐标系、地心坐标系则以坐标系原点是否在地球质心建立两种不同坐标系;如果经纬度坐标系和空间直角坐标系表现为三维的维度,那么经纬度坐标系、空间直角坐标系和投影坐标系更多是从三维到二维转换建立坐标系,倘若是三维新增加的维度,还有大地高、正高、正常高、球心到点的距离等区别,具体表现形式也需要以实际情况为准)。

    经线:

            经线也称子午线,是人类为度量方便而假设出来的辅助线,定义为地球表面连接南北两极的大圆线上的半圆弧。任两根经线的长度相等,相交于南北两极点。每一根经线都有其相对应的数值,称为经度。经线指示南北方向。

    本初子午线 :

           本初子午线又称“首子午线”或“零子午线”,是计算东西经度的起点,以经过英国伦敦东南格林尼治的经线为本初子午线,作为计算地理的起点和世界标准“时区”的起点。本初子午线以东为东经,以西为西经,全球经度测量均以本初子午线与赤道的交点E点作为经度原点。

     子午线命名的由来:

          某一天体视运动轨迹中,同一子午线上的各点该天体在上中天(午)与下中天(子)出现的时刻相同。

    纬线:

        纬线是人类为度量方便而假设出来的辅助线,定义为地球表面某点随地球自转所形成的轨迹。纬线平行于赤道,经线垂直于赤道,任何一根纬线都是圆形而且两两平行。纬线的长度是赤道的周长乘以纬线的纬度的余弦,所以赤道最长,离赤道越远的纬线,周长越短,到了两极就缩为0。纬线指示东西方向。

    北回归线(23°26' 22" N)

          太阳在北半球能够直射到的离赤道最远的位置,其纬度值为黄赤交角,是一条纬线,大约在北纬23度26分的地方。

    赤道(0°N)

         通过地球中心划一个与地轴成直角相交的平面,在地球表面相应出现一个和地球的极距离相等的假想圆圈。赤道的纬度是0°。是地球表面的点随地球自转产生的轨迹中周长最长的圆周线,赤道半径 6378.137Km ;两极半径 6359.752Km;平均半径 6371.012Km ;赤道周长 40075.7Km。如果把地球看做一个绝对的球体的话,赤道距离南北两极相等,是一个大圆。它把地球分为南北两半球,其以北是北半球,以南是南半球,是划分纬度的基线,是南北纬线的起点。

    南回归线(23° 26' 22" S)

           太对应于北回归线,阳在地球上的直射点在一年内到达的最南点所在的纬线。

    经度:

         是地球上一个地点离一根被称为本初子午线的南北方向走线以东或以西的度数。它是通过某地的经线面与本初子午面所成的二面角,在本初子午线以东的经度叫东经,在本初子午线以西的叫西经。东经用“E”表示,西经用“W”表示。比如:E116.33533°,W116.33533°.经度的每一度被分为60角分,每一分被分为60秒。也可以用小数点位表示。有时西经也被写成负数,如:-116.33533°。

    纬度

          是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间。位于赤道以北的点的纬度叫北纬,记为N;位于赤道以南的点的纬度称南纬,记为S。

    纬度数值在0至30度之间的地区称为低纬度地区;纬度数值在30至60度之间的地区称为中纬度地区;纬度数值在60至90度之间的地区称为高纬度地区。赤道是0°纬线,北纬度的最大值为90°,即北极点;南纬度的最大值为90°,即南极点。

    地面法线

         垂直于某地参考椭球体表面的线。

    经纬度(地理)坐标系       

    经纬度是经度与纬度的合称,组成一个经纬度坐标系统。如果特指地球,又称为地理坐标系统,它是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置。若以球心与地球质心重合的地球椭球面为基准面所建立的大地坐标系则为地心大地坐标系。

            一个经度、一个纬度、一个球心到点的距离,一起确定地球上一个地点的精确位置。一个完整的图面地理坐标系统由一个完整的参考椭球体系和一个完整的投影体系组成。

            在地理坐标系中,球体被分为多个均等的部分,通常称为度;在一些国家也使用百分度。一个圆是 360°或 400 百分度。每度可细分为 60 分,每分包含 60 秒。

            地理坐标系包含纬线和经线。各条经线朝南北方向延伸,用于测量本初子午线东西的度数。值的范围介于 -180 到 +180°之间。纬线朝东西方向延伸,用于测量赤道南北的度数。值的范围介于 +90°(北极点)到 -90°(南极点)之间。

            赤道位于 0 度纬线上。通常,北半球具有正的纬度测量值,而南半球具有负的纬度测量值。经度用于测量东西方向的角度。经度测量值通常基于本初子午线,它是一条从北极点通过英格兰格林尼治并一直延伸到南极点的假想线。此角度是 0 经度。本初子午线往西通常记为负经度,往东记为正经度。例如,加利福尼亚州洛杉矶的纬度约为“正 33 度,56 分”,经度约为“负 118 度,24 分。”

     空间直角坐标系

    空间任意选定一点O,过点O作三条互相垂直的数轴Ox,Oy,Oz,它们都以O为原点且具有相同的长度单位。这三条轴分别称作x轴(横轴),y轴(纵轴),z轴(竖轴),统称为坐标轴。它们的正方向符合右手规则,即以右手握住z轴,当右手的四个手指x轴的正向以  角度转向y轴正向时,大拇指的指向就是z轴的正向。这样就构成了一个空间直角坐标系,称为空间直角坐标系O-xyz。定点O称为该坐标系的原点。若使用地球质心作为坐标系的原点,则为地心空间直角坐标系。

    天文坐标系和大地坐标系

           由经线和纬线构成两组互相正交的曲线坐标网叫地理坐标网。由经纬度构成的地理坐标系统又叫地理坐标系。按照是否原点是否在地球上,坐标系可分为天文坐标和大地地理坐标。天文坐标是用天文测量方法确定的,大地地理坐标是用大地测量方法确定的。我们在地球椭球面上所用的地理坐标系属于大地地理坐标系,简称大地坐标系。大地坐标系的确立包括选择一个椭球,对椭球进行定位和确定大地起算数据。一个形状、大小和定位、定向都已确定的地球椭球叫参考椭球。参考椭球一旦确定,则标志着大地坐标系已经建立。

    参心坐标系

    参心坐标系是以参考椭球的几何中心为原点的大地坐标系。“参心”意指参考椭球的中心。54坐标系,80坐标系都有着自己的参考椭球,他们是参心坐标系。随之而来的,也便有参心大地坐标系和参心空间直角坐标系。

    地心坐标系

     地心坐标系以地球质心为原点建立的空间直角坐标系,或以球心与地球质心重合的地球椭球面为基准面所建立的大地坐标系。CGCS2000原点在地球质心,属于地心坐标系。

    当然,你原本就不知道原点与地球质心是不是重合,在你眼里,它是参心还是地心也就不重要了。

    经纬度网

           大地坐标系是以椭球面为基准面的坐标,地面点P的位置用大地经度L、大地纬度B和大地高H表示。当点在椭球面上时,仅用大地经度和大地纬度表示。虽然如此,但是,大地坐标系与经纬度网并不一致,大地坐标系以球面的形式描述了真实的地球坐标,而经纬度网有时在制图时,为满足平面作图的需要(即地图投影),参照一定的投影公式制作成平面地图,并在图上套上经纬线。

    投影坐标系

            在球面坐标上进行测量非常困难,所以地理数据通常都要投影到平面坐标上。投影坐标系统是定义在一个二维平面的坐标系统,与地理坐标系统不同的是,投影坐标系统在二维平面上有着恒定的长度、角度和面积,投影坐标系统总是基于地理坐标系统,而地理坐标系统又是基于球体或椭球体。在投影坐标系统中,以网格中心为原点,使用x,y坐标来定位,每个位置用两个值确定(水平方向和垂直方向)。

     

    常用作世界地图的投影有墨卡托投影、高尔投影、摩尔威特投影、等差分纬线多圆锥投影、格灵顿投影、桑森投影、乌尔马耶夫投影等。而横轴墨卡托投影即为高斯-克吕格投影,这是我国各省区常用的一种坐标体系。

     高斯-克吕格投影体系

           它是一种横轴、椭圆柱面、等角投影。其投影过程可简述如下:椭圆柱面与地球椭球在某一子午圈上相切,这条子午圈叫做投影的中央子午线,又称轴子午线,它也是高斯投影后的平面直角坐标系的纵轴(一般定义为x轴);地球的赤道面与椭圆柱面相交成一条直线,这条直线与中央子午线正交,它是平面直角坐标系的横轴(y轴);把椭圆柱面展开,就得出以(x,y)为坐标的平面直角坐标系。按一定经差将地球椭球面划分成若干投影带,这是高斯投影中限制长度变形的最有效方法。分带时既要控制长度变形使其不大于测图误差,又要使带数不致过多以减少换带计算工作,据此原则将地球椭球面沿子午线划分成经差相等的瓜瓣形地带,以便分带投影。通常按经差6度或3度分为六度带或三度带。六度带自0度子午线起每隔经差6度自西向东分带,带号依次编为第1、2…60带。三度带是在六度带的基础上分成的,它的中央子午线与六度带的中央子午线和分带子午线重合,即自1.5度子午线起每隔经差3度自西向东分带,带号依次编为三度带第 1、2…120带。我国的经度范围西起73°东至135°,可分成六度带十一个,各带中央经线依次为75°、81°、87°、……、117°、123°、129°、135°,或三度带二十二个。

     

    经纬度格式

    经纬度格式分为三种:度、度-分、度-份-秒

    1.   ddd.ddddd °【度 . 度 格式】的十进制小数部分(5位)

    2.   ddd°mm.mmm’ 【度 . 分 . 分 格式】的十进制小数部分(3位)

    3.  ddd°mm’ss’’ 【度 . 分 . 秒 格式】

    转换公式

    度分转换:
    将度分单位数据转换为度单位数据
    度=度+分/60
    例如:
    经度 = 116°20.12’
    纬度 = 39°12.34’
    经度 = 116 + 20.12 / 60 = 116.33533°
    纬度 = 39 + 12.34 / 60 = 39.20567°

    度分秒转换:
    将度分秒单位数据转换为度单位数据
    度 = 度 + 分 / 60 + 秒 / 60 / 60
    例如:
    经度 = 116°20’43”
    纬度 = 39°12’37”
    经度 = 116 + 20 / 60 + 43 / 60 / 60 = 116.34528°
    纬度 = 39 + 12 / 60 + 37 / 60 / 60 = 39.21028°

    在实际的处理中,计算相应像元点的地理坐标:

    GDAL数据集有两种模式描述栅格位置(用点/线坐标系)以及地理参考坐标系之间的关系:首要的也是最普遍的是使用仿射转换,另一种则是GCPs(多控制点定位方式)

     

    仿射变换

    1用GDAL获取四个角点的地理坐标

    GDALDataset::::GetGeoTransform()

    声明一个存储变量:

    double        geoTransform[6];

    geoTransform[0]是左上角像元的东坐标;

    geoTransform[3]是左上角像元的北坐标;

    geoTransform[1]是影像宽度上的分辨率;

    geoTransform[5]是影像高度上的分辨率;

    geoTransform[2]是旋转, 0表示上面为北方;

    geoTransform[4]是旋转, 0表示上面为北方;

    2相应的放射变换公式:

    Xp = geoTransform [0] +Xpixel*geoTransform [1]+Yline*geoTransform [2];

    Yp = geoTransform [3] + Xpixel*geoTransform [4] + YlineL*geoTransform [5];

    其中Xpixel、YlineL分别地物表示单纯地影像上图像遍历时(x,y)坐标表示,点/线坐标系是从左上角(0,0)点到右下角,也就是坐标轴从左到右增长,从上到下增长的坐标系。

    2 GCPs控制点坐标变换:

    int nGCPs=poDataset->GetGCPCount();   //获得控制点数目

    const GDAL_GCP* pGCPs = poDataset->GetGCPs(); //获得GCP控制点,是一个字段

    double  *geoTransform  ;//与前面的仿射变换的相似
    GDALGCPsToGeoTransform( nGCPs, pGCPs, geoTransform, TRUE ); //由GCPs获得仿射变换参数

    int x,y;//任意点影像行列数

    double xx,yy; //任意点影像对应的地理坐标

    double ex[nGCPs];//不同控制点算出的地理坐标X
    double ey[nGCPs];//不同控制点算出的地理坐标Y

    double pRadio[nGCPs]; //任意点相对与控制点的权值

    double total=0; //权值和

    double sx=0; //pRadio[i]*ex[i]
    double sy=0; //pRadio[i]*ey[i]

    for(int num=0;num<nGCPs;num++)
       {
            double gX,gY,tX,tY;
            tX=pGCPs[num].dfGCPPixel; //GCP位置X
            tY=pGCPs[num].dfGCPLine;  //GCP位置Y
            gX=pGCPs[num].dfGCPX;     //地理位置X
            gY=pGCPs[num].dfGCPY;     //地理位置Y

            pRadio[num]=1/(double)(sqrt((tX-x)*(tX-x)+(tY-y)*(tY-y)));
            total+=pRadio[num];

            ex[num]=gX+(x-tX)*geoTransform[1];
            ey[num]=gY+(y-tY)*geoTransform[5];

            sx+=pRadio[num]*ex[num];
            sy+=pRadio[num]*ey[num];
         }

    xx=sx/total;

    yy=sy/total;

     

    屏幕显示

    对于遥感图像而言,如果想显示在屏幕上,由于图像过大或者屏幕的关系,常常做成金字塔影像,或者拉伸图像数据,使图像产生变形以此来满足显示的需求。

    假如已经将经纬度转换成小数点位,即以度为单位,已知道屏幕的高(y)和宽(h),地理坐标区域的范围(maxLon,minLon,maxLat,minLat)..这里我们知道了这些已知的参数

    我们可以算出每像素所代表的经度和纬度(有人称这个为比例因子):
            公式:scaleX = h/((maxLon-minLon)*3600)  ----------X轴上每像素代表的经度秒数;
            公式:scaleY = y/((maxLat-minLat)*3600)  -----------Y轴上每像素代表的纬度秒数;

    算出该地理坐标区域中的任何一点(lon,lat)在屏幕上的坐标

    公式:screenX = lon*3600/scaleX;  ---------屏幕坐标X轴坐标
    公式:screenY = lat*3600/scaleY; ----------屏幕坐标Y轴坐标,  

    lon和lat为任意地点的地理坐标,前面的仿射变换已经算出

    假如需要占满整个屏幕:

     公式:minX = minLon*3600/scaleX;    区域左边置最左端
    公式:minY = minLat*3600/scaleY;     区域上面置最上端

    当地地理范围区域占满整个屏幕时,我们需要用到第三步计算出来的 screenX和screenY两个参数
    该区域中的任何一点的公式如下:   
     公式:X = screenX - minX = (lon - minLon)*3600/scaleX;     
    由于纬度的方向和屏幕Y轴是相反的, 
     公式:screenMaxLat = (maxLat - minLat)*3600/scaleY;
     公式:screenLat = (lat - minLat)*3600/scaleY;
    公式:Y = screenMaxLat - screenLat = (maxLat - lat)*3600/scaleY; 

    展开全文
  • WebGIS开发过程中会遇到这样一种情况:需要使用OpenLayers加载一个未校准的CAD导出的位图;并且还需要通过经纬度坐标...由于从CAD导出的位图并不带有定位信息,所以需要通过仿射变换将图上的像素坐标转换到地理坐标...

    WebGIS开发过程中会遇到这样一种情况:需要使用OpenLayers加载一个未校准的CAD导出的位图;并且还需要通过经纬度坐标数据在这个位图上做一些标记,还需要能通过在OpenLayers取得的图上要素的像素坐标获知实际的经纬度。

    总结起来就是两个需求:

    1. 加载位图
    2. 经纬度坐标与像素坐标互转

    分析:

    由于从CAD导出的位图并不带有定位信息,所以需要通过仿射变换将图上的像素坐标转换到地理坐标。

    即:(左边为某厂的卫星地图,右边为该厂的CAD导出位图,最终实现效果就是用OpenLayers加载位图,并实现坐标转换)

    关于求解仿射变换的过程请见这里。主要的算法思想如下:

    Arcgis中就带有了仿射变换的计算模块,OpenLayers没有仿射变换计算的能力,所以使用math.js这个数学库来进行实现。

    代码:

    算法在上面的截图已经有了,直接用相应的API实现就好:

            //定义仿射变换函数
            function affineTransform(point, from, to) {
                if (from.length != to.length) return;
                //根据参数构造仿射变换所需的矩阵            
                var X = [];
                var Y = [];
                var I = [];
                var U = [];
                var V = [];
                from.forEach((item, index) => {
                    X.push(item[0]);
                    Y.push(item[1]);
                    I.push(1);
                    U.push([to[index][0]])
                    V.push([to[index][1]])
                })
                //开始最小二乘法的计算过程
                var XYIt = [X, Y, I];
                var resultINV = math.inv(math.multiply(XYIt, math.transpose(XYIt)))
                var resultMulti = math.multiply(resultINV, XYIt);
                var vec1 = math.multiply(resultMulti, U)
                var vec2 = math.multiply(resultMulti, V)
                //使用vec1和vec2计算转换后的坐标
                return [vec1[0][0] * point[0] + point[1] * vec1[1][0] + vec1[2][0], vec2[0][0] * point[0] + point[1] * vec2[1][0] + vec2[2][0]]
            }

     CAD导出的位图直接使用ImageStatic加载,并自定义一个像素坐标系:

    
            //定义地图的像素坐标四至
            var extent = [0, 0, 4000, 2000];
    
            //定义地图的投影坐标系,像素坐标
            var projection = new ol.proj.Projection({
                code: 'factory-image',
                units: 'pixels',
                extent: extent
            });
    
            //初始化地图
            var map = new ol.Map({
                layers: [
                    new ol.layer.Image({
                        source: new ol.source.ImageStatic({
                            url: './data/10-9.png',
                            projection: projection,
                            imageExtent: extent
                        })
                    })
                ],
                target: 'map',
                view: new ol.View({
                    projection: projection,
                    center: ol.extent.getCenter(extent),
                    zoom: 2,
                    maxZoom: 8
                })
            });
    

    概略分别获取图上厂区四角的坐标,图片像素坐标是用potoshop量取的,经纬度坐标是在google地图上拾取的:

    
            var upperLeft = [119.071450, 39.309006];
            var lowerLeft = [119.074536, 39.305893];
            var upperRight = [119.075858, 39.311641];
            var lowerRight = [119.078934, 39.308527];
    
            var upperLeftPixel = [959, 1897];
            var lowerLeftPixel = [959, 112];
            var upperRightPixel = [2924, 1897];
            var lowerRightPixel = [2924, 112];
    

     包括使用旗杆坐标打点测试的完整代码:

    <!DOCTYPE html>
    <html>
    
    <head>
        <title>厂区地图计算</title>
        <link rel="stylesheet" href="https://openlayers.org/en/v3.20.1/css/ol.css" type="text/css">
        <script src="https://unpkg.com/mathjs@6.2.3/dist/math.js"></script>
        <script src="https://openlayers.org/en/v3.20.1/build/ol.js"></script>
    
    </head>
    <style>
    
    </style>
    
    <body>
        <div id="map" class="map"></div>
        <script>
    
            //定义仿射变换函数
            function affineTransform(point, from, to) {
                if (from.length != to.length) return;
                var X = [];
                var Y = [];
                var I = [];
                var U = [];
                var V = [];
                from.forEach((item, index) => {
                    X.push(item[0]);
                    Y.push(item[1]);
                    I.push(1);
                    U.push([to[index][0]])
                    V.push([to[index][1]])
                })
                var XYIt = [X, Y, I];
                var resultINV = math.inv(math.multiply(XYIt, math.transpose(XYIt)))
                var resultMulti = math.multiply(resultINV, XYIt);
                var vec1 = math.multiply(resultMulti, U)
                var vec2 = math.multiply(resultMulti, V)
                return [vec1[0][0] * point[0] + point[1] * vec1[1][0] + vec1[2][0], vec2[0][0] * point[0] + point[1] * vec2[1][0] + vec2[2][0]]
            }
    
            //Google坐标
    
            var upperLeft = [119.071450, 39.309006];
            var lowerLeft = [119.074536, 39.305893];
            var upperRight = [119.075858, 39.311641];
            var lowerRight = [119.078934, 39.308527];
    
            var upperLeftPixel = [959, 1897];
            var lowerLeftPixel = [959, 112];
            var upperRightPixel = [2924, 1897];
            var lowerRightPixel = [2924, 112];
    
    
    
            //定义地图的像素坐标四至
            var extent = [0, 0, 4000, 2000];
    
            //定义地图的投影坐标系,像素坐标
            var projection = new ol.proj.Projection({
                code: 'factory-image',
                units: 'pixels',
                extent: extent
            });
    
            //初始化地图
            var map = new ol.Map({
                layers: [
                    new ol.layer.Image({
                        source: new ol.source.ImageStatic({
                            url: './data/10-9.png',
                            projection: projection,
                            imageExtent: extent
                        })
                    })
                ],
                target: 'map',
                view: new ol.View({
                    projection: projection,
                    center: ol.extent.getCenter(extent),
                    zoom: 2,
                    maxZoom: 8
                })
            });
    
            //这里用旗杆的坐标演示坐标转换的使用
            var flagPole = [119.077710, 39.309195];
    
            var flagPolePixel = affineTransform(
                flagPole, 
            [upperLeft, lowerLeft, upperRight, lowerRight], 
            [upperLeftPixel, lowerLeftPixel, upperRightPixel, lowerRightPixel]
            )
    
            var p=affineTransform(
                flagPolePixel, [upperLeftPixel, lowerLeftPixel, upperRightPixel, lowerRightPixel],
            [upperLeft, lowerLeft, upperRight, lowerRight]
            
            )
            console.log(flagPole);
            console.log(p);
            var f = new ol.Feature(new ol.geom.Point(flagPolePixel));
    
            var vSource = new ol.source.Vector();
            var vLayer = new ol.layer.Vector({
                source: vSource
            })
    
            vSource.addFeature(f);
    
            f.setStyle(
                new ol.style.Style({
                    image: new ol.style.Icon({
                        src: './data/icon.png',
                        anchor: [0.5, 1],
                        scale: 0.3
    
                    }),
    
                })
            )
    
            map.addLayer(vLayer);
            map.getView().fit(extent, map.getSize())
            map.render()
    
    
        </script>
    </body>
    
    </html>

    这里使用旗杆的坐标进行了转换和逆转换,并在console里输出,结果如下:

    使用图上像素坐标转换的经纬度,在Google地图上标记旗杆的位置如下:

     经过多次计算和实地对比,精度差距大约在1米以内,比较符合实际需要。


    我在企鹅家的课堂和CSDN学院都开通了《OpenLayers实例详解》课程,欢迎报名学习。搜索关键字OpenLayers就能看到。

     

    展开全文
  • 几何变换——关于透视变换和仿射变换以及齐次坐标系的讨论 2019/10/26 FesianXu 前言 在本文首先介绍了引入齐次坐标系的必要性,随后介绍了在几何变换中常见的投射变换和仿射变换,这俩种变换在计算机视觉问题中...
  • 定义:像素中心坐标,HALCON标准子像素坐标系 原点位于左上角(-0.5,-0.5)像素中心;右下角(rows+0.5,cols+0.5) 用途: affine_trans_point_2d 以_2d结尾的函数还可以用于像素坐标系 area_center 2)像素坐标系:...
  • 左手坐标系和右手坐标系

    千次阅读 2019-02-20 15:41:56
    1.左手坐标系: 伸开我们的左手, 掌心向外, 大拇指与食指成90度, 中指、无名指和小指弯曲, 大拇指指向的方向就是X轴正方向, 食指指向的方向就是Y轴正方向, 中指、无名指和小指指向的方向就是Z轴正方向。 2.右手坐标系...
  • 坐标系简介

    2016-01-19 17:47:11
    1. OpenGL 坐标系  Cocos2D-x 以 OpenGL 和 OpenGL ES 为基础,所以自然支持 OpenGL 坐标系。该坐标系原点在屏幕左下角,x 轴向右,y 轴向上。  屏幕坐标系使用的是不同的坐标系统,原点在屏幕左上角,x 轴向右,...
  • 文章目录 前言 投影模型 1、世界坐标 PwP_wPw​ (路标点)通过外...Y′Y'Y′ = f∗YZf*\frac{Y}{Z}f∗ZY​ 假设 P′P'P′的像素坐标为: [u,v]T[u, v]^T[u,v]T 像素坐标系通常的定义方式是: 原点 o′o'o′位于图像的左上...
  • 仿射变换与齐次坐标

    千次阅读 2018-06-08 21:51:31
    仿射变换与齐次坐标October 12, 2011gcchengLeave a commentGo to comments仿射变换(Affine Transformation)和齐次坐标系(Homogeneous Coordinate)是计算机图形学中经常碰到的基本概念。这篇文章主要讲述什么是...
  • 目录1 引言2 坐标变换2.1 结论2.2 示例 ...(需要注意的是,本文说的旋转都是按照左手法则来定义方向的,如果使用的是右手坐标系,下面结论中的sinθ的符号会是相反的) 再比如Oxyz绕y轴旋转θ角后得到O’x’y’z’
  • Unity 中的坐标系

    万次阅读 多人点赞 2016-08-17 16:20:06
    坐标系定义是:对于一个n维系统,能够使每一个点和一组(n个)标量构成一一对应的系统。 在这篇博客中,我们讨论的特指欧几里德三维空间中的坐标系。对于这样的三维空间,最常见的坐标系就是笛卡尔坐标系,指定了...
  • 1.、空间直角坐标系  下面摘录一段百科的解析,这些都是数学基础。过空间定点O作三条互相垂直的数轴,它们都以O为原点,具有相同的单位长度.这三条数轴分别称为X轴(横轴).Y轴(纵轴).Z轴(竖轴),统称为坐标轴。  ...
  • 并且在不同的场景下使用的坐标系也可能不一样,比如:地理位置——经纬度,二次曲线分析——极坐标,而在此书中描述3D空间物体坐标使用的是笛卡尔坐标系。至于笛卡尔坐标系的详细介绍可以查看[笛卡尔坐标系Wiki]。 ...
  • OpenGL中的6种坐标系 1. Object or model coordinates 局部坐标系/模型坐标系 2. World coordinates 世界坐标系 3. Eye (or Camera) coordinates 眼坐标系/相机坐标系 4. Clip coordinates 剪裁坐标系 5. ...
  • GIS基本概念-坐标系

    千次阅读 2013-11-19 15:57:53
    涉足GIS开发已一年有余,作为非科班出生的程序员,长期被GIS相关的概念弄得晕头转向。...对于坐标系定义:  维基百科:对于一个n维系统,能够使每一个点和一组(n个)标量构成一一对应的系统 http://z
  • 齐次坐标系(Homogeneous Coordinate) 定义: 所谓线性变换是指两个线性空间的映射,一个变换是线性变换,必须满足两个条件,也就是我们经常说的线性条件: additivity homogeneity 理解: 在《3D数学基础:...
  • 矩阵与坐标系的映射关系

    千次阅读 2020-01-01 11:53:00
    下图展示了矩阵和二维坐标系的关系,二维坐标系可以看成图像,把这种关系应用到图像变换,就得到图像处理的方式变换,应用到三维空间坐标中,就得到三维空间坐标系变换关系。 仿射变换 仿射变换主要包括平移变换、...
  • 图像坐标系转世界坐标系的方法

    千次阅读 2017-05-06 10:03:31
     为了定量地描述光学成像过程,我们首先定义以下几种坐标系:世界坐标系、摄像机坐标系、象平面坐标系和计算机图像坐标系。   世界坐标系也称真实或现实世界坐标系,即XYZ坐标系,它是客观世界的绝对坐标。一般...
  • 我们知道转换空间坐标系需要不同的模型,模型的数学基础来源于仿射变换,在x、y方向上分别进行平移、缩放、旋转。通常需要6个参数(平移2个、缩放2个、旋转2个) 我们需要的数据是源坐标系和目标坐标系的控制点...
  • 聊聊GIS中那些坐标系 转载请声明到标题。 B站/博客园/CSDN/知乎:@秋意正寒 很开心能跃居百度关键词第一位,近期打算重写一下这篇博客,以更系统、更齐全的角度,更通俗易懂的语言讲授坐标系的初步认知。 从第...
  • arcgis地理配准再定义投影即可给它加上原图的坐标系。 2.假设有上千张图片,可用Python和GDAL给图片加坐标系。 -实现思路 使用GDAL需要知道待投影图片的地理坐标信息、仿射矩阵参数。 仿射矩阵参数是干什么的?见...
  • Apollo坐标系转换

    千次阅读 2019-09-18 11:49:37
    文章目录RFU和FLU的关系右-前-天坐标(RFU)前-左-天坐标(FLU)欧拉角Pitch、Yaw、Roll坐标系转换计算IMU转World示例代码IMU转FLU坐标系其他坐标转换rslidar-->FLUrslidar-->world参考文章矩阵旋转的讲解 RFU...
  • 3D图形学坐标系变换

    2016-01-06 11:25:09
     3D计算机图形学常用的有:物体坐标系,世界坐标系,相机坐标系,投影坐标系以及屏幕坐标系。我们主要讨论的就是这些坐标系间的转换。这些坐标系都是为了完成计算机3D图形学最最最基本的目标而出现。3D计算机图形学...
  • 齐次坐标系漫谈

    2018-06-12 16:36:23
    首先声明齐次坐标主要应用于图像处理,如果其它领域的可忽略本博客。...1 为什么使用齐次坐标系(homogeneouscoordinates) 表示投影空间的无穷远(infinity),主要包括无穷远点(也称消失点,vanishing poin...
  • 【目标】:学习OpenGL中的坐标系统。   【参考】: ...1、《计算机图形学(OpenGL版) (第三版)》 Francis著 (本文主要涉及第三章~第七章) ...在学习Cocos2D的过程中,对着《权威指南》上草草结束的坐标系介绍

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,274
精华内容 1,709
关键字:

仿射坐标系的定义