精华内容
下载资源
问答
  • 几个坐标系: 世界坐标系(world coordinate system): 用户定义的三维世界的坐标系,为了描述目标物在真实世界里的位置而被引入。单位为m。 相机坐标系(camera coordinate system):在相机上建立的坐标系,为了...

    坐标系变换

    1. 几个坐标系:

    • 世界坐标系(world coordinate system):
      用户定义的三维世界的坐标系,为了描述目标物在真实世界里的位置而被引入。单位为m。
    • 相机坐标系(camera coordinate system):在相机上建立的坐标系,为了从相机的角度描述物体位置而定义,作为沟通世界坐标系和图像/像素坐标系的中间一环。单位为m。
    • 图像坐标系(image coordinate system):为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标。 单位为m。
    • 像素坐标系(pixel coordinate system):为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系。单位为个(像素数目)。

    2.相机参数

    16个单目相机的参数:

    • 4个内部参数(只与相机有关):
      f x , f y , u 0 , v 0 , ( 1 / d x 、 1 / d y 、 γ 、 u 0 、 v 0 、 f ) fx,fy,u0,v0,(1/dx、1/dy、\gamma 、u0、v0、f ) fx,fy,u0,v0,(1/dx1/dyγu0v0f)
      实际其 f x = F ∗ S x fx = F*S_x fx=FSx,其中的 F F F就是焦距(上面的 f f f).Sx是像素/每毫米(即上面的 1 / d x 1/dx 1/dx),其是最后面图里的后两个矩阵进行先相乘,得出的,则把它看成整体,就相当于4个内参。把 γ \gamma γ 等于零,实际上也是六个.

    • 5个畸变参数D:
      k 1 , k 2 , k 3 k1,k2,k3 k1,k2,k3 径向畸变系数;
      p 1 , p 2 p1,p2 p1,p2 是切向畸变系数;
      径向畸变:产生原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲,径向畸变主要包含桶形畸变和枕形畸变两种。
      切向畸变:产生的原因透镜不完全平行于图像平面,这种现象发生于成像仪被粘贴在摄像机的时候。

    • 6个外部参数(取决于相机在世界中的位置):
      3个旋转参数 R R R;
      3个平移参数 T T T

    3. 坐标系之间的转换

    3.1 整体公式

    Z c [ u v 1 ] = [ 1 d x γ c x 0 1 d y c y 0 0 1 ] [ f 0 0 0 f 0 0 0 1 ] [ R t 0 T 1 ] [ X w Y w Z w 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ R t 0 T 1 ] [ X w Y w Z w 1 ] Z_c\left[\begin{array}{c}{u } \\ {v} \\ {1}\end{array}\right] =\left[\begin{array}{ccc}{\frac{1}{dx}} & {\gamma} & {c_x} \\ {0} & {\frac{1}{dy}} & {c_y} \\ {0} & {0} & {1}\end{array}\right] \left[\begin{array}{ccc}{f} & {0} & {0} \\ {0} & {f} & {0} \\ {0} & {0} & {1}\end{array}\right] \left[\begin{array}{cc}{\boldsymbol{R}} & {\boldsymbol{t}} \\ {\boldsymbol{0}^{T}} & {1}\end{array}\right] \left[\begin{array}{c}{X_w } \\ {Y_w} \\ {Z_w} \\{1}\end{array}\right]=\left[\begin{array}{ccc}{f_x} & {0} & {c_x} \\ {0} & {f_y} & {c_y} \\ {0} & {0} & {1}\end{array}\right] \left[\begin{array}{cc}{\boldsymbol{R}} & {\boldsymbol{t}} \\ {\boldsymbol{0}^{T}} & {1}\end{array}\right] \left[\begin{array}{c}{X_w } \\ {Y_w} \\ {Z_w} \\{1}\end{array}\right] Zcuv1=dx100γdy10cxcy1f000f0001[R0Tt1]XwYwZw1=fx000fy0cxcy1[R0Tt1]XwYwZw1

    3.2 世界坐标系->相机坐标系:

    刚体变换(regidbody motion):
    三维空间中,当物体不发生形变时,对一个几何物体作旋转 R R R, 平移 T T T 的运动,称之为刚体变换。世界坐标系到相机坐标系的变化就是刚体变换,又因为 R R R T T T与相机无关,所有又称其为相机外参。
    首先考虑旋转。我们设某个单位正交基 ( e 1 ; e 2 ; e 3 ) (e_1; e_2; e_3) (e1;e2;e3)经过一次旋转,变成了 ( e 1 ′ ; e 2 ′ ; e 3 ′ ) (e_1′ ; e_2′ ; e_3′ ) (e1;e2;e3)。那么,对于同一个向量 a(注意该向量并没有随着坐标系的旋转而发生运动),它在两个坐标系下的坐标为 [ a 1 ; a 2 ; a 3 ] T [a_1; a_2; a_3]^T [a1;a2;a3]T [ a 1 ′ ; a 2 ′ ; a 3 ′ ] T [a_1′ ; a_2′ ; a_3′ ]^T [a1;a2;a3]T

    根据坐标的定义,有

    [ e 1 , e 2 , e 3 ] [ a 1 a 2 a 3 ] = [ e 1 ′ , e 2 ′ , e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] \left[e_{1}, e_{2}, e_{3}\right]\left[\begin{array}{l}{a_{1}} \\ {a_{2}} \\ {a_{3}}\end{array}\right]=\left[e_{1}^{\prime}, e_{2}^{\prime}, e_{3}^{\prime}\right]\left[\begin{array}{c}{a_{1}^{\prime}} \\ {a_{2}^{\prime}} \\ {a_{3}^{\prime}}\end{array}\right] [e1,e2,e3]a1a2a3=[e1,e2,e3]a1a2a3
    左右同事乘

    [ e 1 T e 2 T e 3 T ] \left[\begin{array}{c}{e_{1}^{T}} \\ {e_{2}^{T}} \\ {e_{3}^{T}}\end{array}\right] e1Te2Te3T
    ,得到

    [ a 1 a 2 a 3 ] = [ e 1 T e 1 ′ e 1 T e 2 ′ e 1 T e 3 ′ e 2 T e 1 ′ e 2 T e 2 ′ e 2 T e 3 ′ e 3 T e 1 ′ e 3 T e 2 ′ e 3 T e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] ≜ R a ′ \left[\begin{array}{l}{a_{1}} \\ {a_{2}} \\ {a_{3}}\end{array}\right]=\left[\begin{array}{lll}{e_{1}^{T} e_{1}^{\prime}} & {e_{1}^{T} e_{2}^{\prime}} & {e_{1}^{T} e_{3}^{\prime}} \\ {e_{2}^{T} e_{1}^{\prime}} & {e_{2}^{T} e_{2}^{\prime}} & {e_{2}^{T} e_{3}^{\prime}} \\ {e_{3}^{T} e_{1}^{\prime}} & {e_{3}^{T} e_{2}^{\prime}} & {e_{3}^{T} e_{3}^{\prime}}\end{array}\right]\left[\begin{array}{c}{a_{1}^{\prime}} \\ {a_{2}^{\prime}} \\ {a_{3}^{\prime}}\end{array}\right] \triangleq R a^{\prime} a1a2a3=e1Te1e2Te1e3Te1e1Te2e2Te2e3Te2e1Te3e2Te3e3Te3a1a2a3Ra
    中间的矩阵 R R R 由两组基之间的内积组成,刻画了旋转前后同一个向量的坐标变换关系。只要旋转是一样的,那么这个矩阵也是一样的。可以说,矩阵 R R R 描述了旋转本身。因此它又称为旋转矩阵。
    旋转矩阵有一些特别的性质:是一个行列式为 1 的正交矩阵
    可以把旋转矩阵的集合定义如下:

    S O ( n ) = { R ∈ R n × n ∣ R R T = I , det ⁡ ( R ) = 1 } SO(n)=\left\{\boldsymbol{R} \in \mathbb{R}^{n \times n} | \boldsymbol{R} \boldsymbol{R}^{T}=\boldsymbol{I}, \operatorname{det}(\boldsymbol{R})=1\right\} SO(n)={RRn×nRRT=I,det(R)=1}
    n n n 代表坐标轴个数,比如 S O ( 3 ) SO(3) SO(3) 就代表包含 x , y , z x,y,z xyz 三个坐标轴的坐标系。
    在欧氏变换中,除了旋转之外还有一个平移。考虑世界坐标系中的向量 $ a $,经过一次
    旋转 R R R和一次平移 t t t 后,得到了 a ′ a′ a,那么把旋转和平移合到一起,有:

    a ′ = R a + t \boldsymbol{a}^{\prime}=\boldsymbol{R} \boldsymbol{a}+\boldsymbol{t} a=Ra+t
    其实表示为坐标就是

    [ X c Y c Z c ] = [ r 00 r 01 r 02 r 10 r 11 r 12 r 20 r 21 r 22 ] [ X Y Z ] + [ T x T y T z ] \left[\begin{array}{c}{X_{\mathrm{c}}} \\ {Y_{\mathrm{c}}} \\ {Z_{\mathrm{c}}}\end{array}\right]=\left[\begin{array}{ccc}{r_{00}} & {r_{01}} & {r_{02}} \\ {r_{10}} & {r_{11}} & {r_{12}} \\ {r_{20}} & {r_{21}} & {r_{22}}\end{array}\right]\left[\begin{array}{c}{X} \\ {Y} \\ {Z}\end{array}\right]+\left[\begin{array}{c}{T_{x}} \\ {T_{y}} \\ {T_{z}}\end{array}\right] XcYcZc=r00r10r20r01r11r21r02r12r22XYZ+TxTyTz
    上面变换关系不是一个线性关系。假设我们进行了两次变换: R 1 ; t 1 R1; t1 R1;t1 R 2 ; t 2 R2; t2 R2;t2,满足:
    b = R 1 a + t 1 , c = R 2 b + t 2 \boldsymbol{b}=\boldsymbol{R}_{1} \boldsymbol{a}+\boldsymbol{t}_{1}, \quad \boldsymbol{c}=\boldsymbol{R}_{2} \boldsymbol{b}+\boldsymbol{t}_{2} b=R1a+t1,c=R2b+t2 合并为 c = R 2 ( R 1 a + t 1 ) + t 2 c=R_{2}\left(R_{1} a+t_{1}\right)+t_{2} c=R2(R1a+t1)+t2,这样当变化次数特别多的时候很复杂。
    所以一般在三维向量的末尾添加一个1,表示为齐次坐标的形式

    [ a ′ 1 ] = [ R t 0 T 1 ] [ a 1 ] ≜ T [ a 1 ] \left[\begin{array}{c}{a^{\prime}} \\ {1}\end{array}\right]=\left[\begin{array}{cc}{\boldsymbol{R}} & {\boldsymbol{t}} \\ {\boldsymbol{0}^{T}} & {1}\end{array}\right]\left[\begin{array}{l}{\boldsymbol{a}} \\ {1}\end{array}\right] \triangleq \boldsymbol{T}\left[\begin{array}{l}{\boldsymbol{a}} \\ {1}\end{array}\right] [a1]=[R0Tt1][a1]T[a1]
    对于这个四维向量,我们可以把旋转和平移写在一个矩阵里面,使得整个关系变成了线性关系。该式中,矩阵 T T T 称为变换矩阵(Transform Matrix) 。
    相机坐标系和世界坐标系的坐标原点之间的距离,受 x , y , z x,y,z x,y,z 三个方向上的分量共同控制,所以具有三个自由度。 R R R 其实是分别绕 X , Y , Z X, Y, Z X,Y,Z三轴旋转的效果之和.

    [外链图片转存失败(img-ktlM5CJz-1568880519327)(_v_images/20190919121501112_27305.png)]

    绕z轴旋转如右图 (_v_images/20190919121427976_12125.png)]

    绕 z 旋 转 矩 阵 : [ X c Y c Z c ] = [ 1 0 0 0 cos ⁡ θ sin ⁡ θ 0 − sin ⁡ θ cos ⁡ θ ] [ X Y Z ] 绕z旋转矩阵: \left[\begin{array}{l}{X_{c}} \\ {Y_{c}} \\ {Z_{c}}\end{array}\right]=\left[\begin{array}{ccc}{1} & {0} & {0} \\ {0} & {\cos \theta} & {\sin \theta} \\ {0} & {-\sin \theta} & {\cos \theta}\end{array}\right]\left[\begin{array}{l}{X} \\ {Y} \\ {Z}\end{array}\right] zXcYcZc=1000cosθsinθ0sinθcosθXYZ
    绕 x 旋 转 矩 阵 : [ X c Y c Z c ] = [ cos ⁡ θ 0 − sin ⁡ θ 0 1 + 1 1 0 sin ⁡ θ 0 cos ⁡ θ ] [ X Y Z ] 绕x旋转矩阵: \left[\begin{array}{c}{X_{c}} \\ {Y_{c}} \\ {Z_{c}}\end{array}\right]=\left[\begin{array}{ccc}{\cos \theta} & {0} & {-\sin \theta} \\ {0_{1}+1} & {1} & {0} \\ {\sin \theta} & {0} & {\cos \theta}\end{array}\right]\left[\begin{array}{c}{X} \\ {Y} \\ {Z}\end{array}\right] xXcYcZc=cosθ01+1sinθ010sinθ0cosθXYZ
    绕 y 旋 转 矩 阵 : [ X c Y c Z c ] = [ cos ⁡ θ sin ⁡ θ 0 − sin ⁡ θ cos ⁡ θ 0 0 0 1 ] [ X Y Z ] 绕y旋转矩阵: \left[\begin{array}{l}{X_{\mathrm{c}}} \\ {Y_{\mathrm{c}}} \\ {Z_{\mathrm{c}}}\end{array}\right]=\left[\begin{array}{ccc}{\cos \theta} & {\sin \theta} & {0} \\ {-\sin \theta} & {\cos \theta} & {0} \\ {0} & {0} & {1}\end{array}\right]\left[\begin{array}{c}{X} \\ {Y} \\ {Z}\end{array}\right] yXcYcZc=cosθsinθ0sinθcosθ0001XYZ
    以上分别为绕 x , y , z x, y, z x,y,z轴旋转的矩阵,所以旋转矩阵为 R = R x ∗ R y ∗ R z R=R_x*R_y * R_z R=RxRyRz

    [外链图片转存失败(img-yQNxwTZ2-1568880519328)(_v_images/20190919121209841_4249.png )]
    O − x − y − z O-x-y-z Oxyz为相机坐标系, z z z 轴指向相机前方, O O O为摄像机的光心,也是针孔模型中的针孔。

    3.3 相机坐标系->图像坐标系:

    现实世界的空间点 P P P,经过小孔 O O O 投影之后,落在物理成像平面 O ′ − x ′ − y ′ O′-x′-y′ Oxy 上,成像点为 P ′ P′ P。设 P P P的坐标为 [ X ; Y ; Z ] T [X; Y; Z]^T [X;Y;Z]T P ′ P′ P [ X ′ ; Y ′ ; Z ′ ] T [X′; Y ′; Z′]^T [X;Y;Z]T,并且设物理成像平面到小孔的距离为 f f f(焦距)。

    [外链图片转存失败(img-S3MYt252-1568880519328)(_v_images/20190919121038400_31504.png)]

    我们平时处理一般会用归一化成像平面,把成像位置转换到与它对称的红色位置,这样比较容易描述各个坐标系之间关系。

    根据三角形相似关系,有 Z f = − X X ′ = − Y Y ′ \frac{Z}{f}=- \frac{X}{X'}=- \frac{Y}{Y'} fZ=XX=YY为了方便,一般去掉负号。
    整理后:

    X ′ = f X Z X′ = \frac{fX}{Z} X=ZfX
    Y ′ = f Y Z Y′ = \frac{fY}{Z} Y=ZfY

    3.4 图像坐标系->像素坐标系:

    因为相机最后得到的是像素,所以在成像平面上对像进行采样和量化,把图像坐标系的点转化到一个像素平面 o − u − v o-u-v ouv。像素坐标系与图像坐标系处于同一平面,像素坐标系原点为左上角,图像坐标系原点为中心。
    [外链图片转存失败(img-4EWshJzB-1568880519328)(_v_images/20190919135550715_21104.png)]

    像素坐标系‹通常的定义方式是:原点 o ′ o′ o 位于图像的左上角, u u u轴向右与 x x x轴平行, v v v
    轴向下与 y y y轴平行。像素坐标系与成像平面之间,相差了一个缩放和一个原点的平移。
    设像素坐标在 u u u轴上缩放了 α α α倍,在 v 上 缩 放 了 上缩放了 β$ 倍。同时,原点平移了 [ c x ; c y ] T [cx;cy]^T [cx;cy]T。那么, P ′ P′ P的坐标与像素坐标 [ u ; v ] T [u;v]^T [u;v]T的关系为:
    { u = α X ′ + c x = 1 d x X ′ + c x v = β X ′ + c y = 1 d y Y ′ + c y \begin{cases} u = α X' + c_x = \frac{1}{dx} X' + c_x \\ v = βX' + c_y = \frac{1}{dy} Y' + c_y \end{cases} {u=αX+cx=dx1X+cxv=βX+cy=dy1Y+cy

    1 d x \frac{1}{dx} dx1, 1 d y \frac{1}{dy} dy1分别为在 x x x, y y y方向上每个像素的物理尺寸,把 α f αf αf 合并为 f x f_x fx β f βf βf 合并为 f y f_y fy 得到:
    { u = f x X Z + c x v = f y Y Z + c y \begin{cases} u = f_x\frac{X}{Z}+ c_x \\ v = f_y\frac{Y}{Z} + c_y \end{cases} {u=fxZX+cxv=fyZY+cy
    $f $ 的单位为米, α ; β α; β α;β 的单位为像素每米,所以 f x ; f y f_x; f_y fx;fy的单位为像 素。

    把该式写成矩阵形式,会更加简洁,不过左侧需要用到齐次坐标, γ \gamma γ x , y x, y x,y不垂直时的扭曲系数,一般为0:

    [ u v 1 ] = 1 Z [ f x γ c x 0 f y c y 0 0 1 ] [ X Y Z ] = 1 Z K P \left[\begin{array}{c}{u } \\ {v} \\ {1}\end{array}\right] = \frac{1}{Z} \left[\begin{array}{ccc}{f_x} & {\gamma} & {c_x} \\ {0} & {f_y} & {c_y} \\ {0} & {0} & {1}\end{array}\right] \left[\begin{array}{c}{X } \\ {Y} \\ {Z}\end{array}\right] = \frac{1}{Z} KP uv1=Z1fx00γfy0cxcy1XYZ=Z1KP
    习惯把Z移动到左面:

    Z [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y Z ] = K P Z\left[\begin{array}{c}{u } \\ {v} \\ {1}\end{array}\right] =\left[\begin{array}{ccc}{f_x} & {0} & {c_x} \\ {0} & {f_y} & {c_y} \\ {0} & {0} & {1}\end{array}\right] \left[\begin{array}{c}{X } \\ {Y} \\ {Z}\end{array}\right] =KP Zuv1=fx000fy0cxcy1XYZ=KP

    把中间的量组成的矩阵称为相机的内参数矩阵(Camera Intrinsics) K K K

    除了内参之外,自然还有相对的外参。考虑到上式中,我们使用的是 P P P在相机坐标系下的坐标。由于相机在运动,所以 $P $的相机坐标应该是它的世界坐标(记为 P w P_w Pw),根据相机的当前位姿,变换到相机坐标系下的结果。相机的位姿由它的旋转矩阵 R R R 和平移向量 t t t来描述。那么有:
    Z P u v = Z [ u v 1 ] = K ( R P W + t ) = K T P w ZP_{uv} = Z \left[\begin{array}{c} u \\v \\1\end{array}\right] = K (RP_W +t) = KTP_w ZPuv=Zuv1=K(RPW+t)=KTPw
    相机的位姿 R ; t R; t R;t又称为相机的外参数(Camera Extrinsics) 。相比于不变的内参,外参会随着相机运动发生改变,同时也是 SLAM中待估计的目标,代表着机器人的轨迹.

    3.5 畸变:

    • 畸变形成的原因:
      为了获得好的成像效果,相机的前方一般都加了透镜。对成像时光线的传播会产生新的影响: 一是透镜自身的形状对光线传播的影响,二是在机械组装过程中,透镜和成像平面不可能完全平行,光线穿过透镜投影到成像面时的位置发生变化。

    由透镜形状引起的畸变称之为径向畸变。在针孔模型中,一条直线投影到像素平面上还是一条直线。可是,在实际拍摄的照片中,摄像机的透镜往往使得真实环境中的一条直线在图片中变成了曲线‹。越靠近图像的边缘,这种现象越明显。由于实际加工制作的透镜往往是中心对称的,这使得不规则的畸变通常径向对称。它们主要分为两大类, 桶形畸变和枕形畸变。

    [外链图片转存失败(img-pAsLGZD4-1568880519329)(./_v_images/20190919115102127_30070.png)]

    桶形畸变是由于图像放大率随着离光轴的距离增加而减小,而枕形畸变却恰好相反。
    在这两种畸变中,穿过图像中心和光轴有交点的直线还能保持形状不变。

    除了透镜的形状会引入径向畸变外,在相机的组装过程中由于不能使得透镜和成像面严格平行也会引入切向畸变。

    平面上的任意一点 p p p可以用笛卡尔坐标表示为 [ x , y ] T [x, y]^{T} [x,y]T , 也可以把它写成极坐标的形式
    [ r ; θ ] T [r; θ]^T [r;θ]T,其中 r r r 表示点 p p p 离坐标系原点的距离, θ θ θ 表示和水平轴的夹角。径向畸变可看成坐标点沿着长度方向发生了变化 δ r δr δr, 也就是其距离原点的长度发生了变化。切向畸变可以
    看成坐标点沿着切线方向发生了变化,也就是水平夹角发生了变化 δ θ δθ δθ

    对于径向畸变,无论是桶形畸变还是枕形畸变,由于它们都是随着离中心的距离增加
    而增加。我们可以用一个多项式函数来描述畸变前后的坐标变化:这类畸变可以用和距中
    心距离有关的二次及高次多项式函数进行纠正:

    x corrected = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y corrected = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) \begin{array}{l}{x_{\text {corrected}}=x\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right)} \\ {y_{\text {corrected}}=y\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right)}\end{array} xcorrected=x(1+k1r2+k2r4+k3r6)ycorrected=y(1+k1r2+k2r4+k3r6)

    其中 [ x , y ] T [x, y]^{T} [x,y]T 是未纠正的点的坐标, [ x c o r r e c t e d ; y c o r r e c t e d ] T [xcorrected; ycorrected]^T [xcorrected;ycorrected]T 是纠正后的点的坐标,注意它们都是归一化平面上的点,而不是像素平面上的点。在上式中,对于畸变较小的图像中心区域,畸变纠正主要是 k 1 k1 k1 起作用。而对于畸变较大的边缘区域主要是 k 2 k2 k2 起作用。普通摄像头用这两个系数就能很好的纠正径向畸变。对畸变很大的摄像头,比如鱼眼镜头,可以加入 k 3 k3 k3 畸变项对畸变进行纠正。

    另一方面,对于切向畸变,可以使用另外的两个参数 p 1 , p 2 p1, p2 p1,p2来进行纠正:

    x corrected = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y corrected = y + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y \begin{array}{l}{x_{\text {corrected}}=x+2 p_{1} x y+p_{2}\left(r^{2}+2 x^{2}\right)} \\ {y_{\text {corrected}}=y+p_{1}\left(r^{2}+2 y^{2}\right)+2 p_{2} x y}\end{array} xcorrected=x+2p1xy+p2(r2+2x2)ycorrected=y+p1(r2+2y2)+2p2xy

    对于相机坐标系中的一点 P ( X ; Y ; Z ) P(X; Y; Z) P(X;Y;Z),我们能够通过五个畸变系数找到这个点在像素平面上的正确位置:

    1. 将三维空间点投影到归一化图像平面。设它的归一化坐标为 [x; y]T。
    2. 对归一化平面上的点进行径向畸变和切向畸变纠正。
    3. 将纠正后的点通过内参数矩阵投影到像素平面,得到该点在图像上的正确位置。
    1. 首先,世界坐标系下有一个固定的点 P_w;
    2. 由于相机在运动,它的运动由 R; t 或变换矩阵描述。 P 的相机坐标为:
    P_c= R * P_w + t。
    3. 这时的 P_c 仍有 X; Y; Z 三个量,把它们投影到归一化平面 Z = 1 上,得到 P 的归
    一化相机坐标: Pc = [X/Z; Y /Z; 1]T 。
    4. 最后, P 的归一化坐标经过内参后,对应到它的像素坐标: P_uv = K * P_c。
    

    双目坐标

    1.理想情况的双目相机模型

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UpKMuU5Y-1587459835185)(_v_images/20191014114115998_17892.png)]

    z − f z = b − u l + u r b \frac{z-f}{z}=\frac{b-u_l+u_r}{b} zzf=bbul+ur, 因为 d = u l − u r d=u_l-u_r d=ulur,
    所以最后 z = f ∗ b d z=\frac{f*b}{d} z=dfb

    2. 真实的双目相机模型

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UQovAz3a-1587459835188)(_v_images/20191014125744602_10932.png)]

    真实场景的双目摄像机其实不是严格平行向前。所以需要双目标定得到两个相机之间的平移和旋转矩阵
    参考:《视觉slam十四讲》

    展开全文
  • 坐标系

    千次阅读 2018-09-11 13:59:51
    从第一次上地图学的课开始,对GIS最基本的地图...想必多多少少都会听说过几个名词,也许悠远,也许模糊。高斯克吕格,北京54,西安80,WGS84,投影坐标系统,etc. 今天就从头说起,讲讲那些坐标系统的事情。 惯...

    从第一次上地图学的课开始,对GIS最基本的地图坐标系统就很迷。也难怪,我那时候并不是GIS专业的学生,仅仅是一门开卷考试的专业选修课,就没怎么在意。

    等我真正接触到了各种空间数据产品,我才知道万里长征第一步就是:处理坐标系统。

    想必多多少少都会听说过几个名词,也许悠远,也许模糊。高斯克吕格,北京54,西安80,WGS84,投影坐标系统,etc.

    今天就从头说起,讲讲那些坐标系统的事情。

    惯例,给个目录:

    1. 经纬度与GCS(Geographic Coordinate System, 地理坐标系统)

    2. 方里网与PCS(Projection Coordinate System, 投影坐标系统)

    3. GCS和PCS的转化问题(三参数与七参数问题)

    4. 火星坐标问题

    1. 在第一部分,我介绍一下以经纬度为准的地理坐标系统,也顺带提及一下我国的高程坐标系。主要涉及的内容有:大地水准面问题,椭球问题,常见的GCS(如北京54,西安80,CGCS2000,WGS84等),让大家看到GIS数据中的GCS马上就能知道这是什么东西。
    2. 在第二部分,我介绍一下以平面直角坐标系为量度的投影坐标系统。主要涉及的内容有:PCS与GCS的关系,我国常见的PCS(高斯克吕格、兰伯特/Lambert、阿尔伯斯Albers、墨卡托Mercator、通用横轴墨卡托UTM、网络墨卡托Web Mercator)。
    3. 在第三部分,是实际操作过程中遇到的种种问题,如投影不对会出现什么情况、如何转换GCS、如何切换PCS(重投影问题)等问题,涉及一些数学转换的思维,需要有一定的空间想象能力。
    4. 在第四部分,我简单介绍一下所谓的火星坐标。

    那么我们开始吧!

    1. 经纬度与GCS

    天气预报也好,火箭发射也罢,地震、火山等事故发生时,电视台总会说东经XX度,北纬YY度。这个经纬度中学地理就学过了,我就不细说了。

    我从如何描述地球说起。

    1.1 凹凸不平的地球

    谁都知道地球表面不平坦,它甚至大概形状都不是一个正球体,是一个南北两极稍扁赤道略胖的胖子,胖度大概是20km,在外太空几乎看不出来的,这也可能和星球长期受到潮汐引力、太阳引力以及自身旋转的向心力有关。这里不是地球科学,就不再深究了。

    为了能让地球出现在数学家的公式里,我们曾经走过了2个阶段:用平静的海面描述地球——用虚拟的旋转椭球面描述地球表面。

    这里也不是地图学,再深入下去其实还有似大地水准面等概念。就挑重点讲。

    “假设地球表面都是水,当海平面风平浪静没有波澜起伏时,这个面就是大地水准面。”大家应该知道,在太空失重的环境下,水相对静止状态是个正球体,那么肯定很多人就认为,大地水准面就是个正球面。不是的,还需要考虑一个问题:地球各处的引力不同。引力不同,就会那儿高一些,这儿低一些,尽管这些微小的差距肉眼难以观测出来,可能隔了好几千米才会相差几厘米。所以,在局部可能看起来是个球面,但是整体却不是。显然,用大地水准面来进行数学计算,显然是不合适的,至少在数学家眼中,认为这不可靠。

    所以找到一个旋转椭球面就成了地理学家和数学家的问题。(注意区分椭球面和旋转椭球面这两个数学概念,在GCS中都是旋转椭球面)

    给出旋转椭球面的标准方程:

    (x2+y2)/a2+z2/b2=1

    其中x和y的参数相同,均为a,这就代表一个绕z轴旋转的椭圆形成的椭球体。不妨设z轴是地球自转轴,那么这个方程就如下图是一个椭球体,其中赤道是个圆。

    这样,有了标准的数学表达式,把数据代入公式计算也就不是什么难事了。

    由此我们可以下定义,GIS坐标系中的椭球,如果加上高程系,在其内涵上就是GCS(地理坐标系统)。其度量单位就是度分秒。

    描述一个旋转椭球面所需的参数是方程中的a和b,a即赤道半径,b即极半径,f=(a-b)/a称为扁率。

    与之对应的还有一个问题:就是坐标中心的问题。(地球的中心在哪里?)

    【注】十九世纪发现赤道也是一个椭圆,故地球实际应以普通椭球面表示,但是由于各种原因以及可以忽略的精度内,一直沿用旋转椭球体作为GCS。

    1.2 参心坐标系、地心坐标系

    上过中学物理的人知道,物体均有其质心,处处密度相等的物体的质心在其几何中心。所以,地球只有一个质心,只是测不测的精确的问题而已。由地球的唯一性和客观存在,以地球质心为旋转椭球面的中心的坐标系,叫地心坐标系,且唯一。当然,由于a、b两个值的不同,就有多种表达方式,例如,CGCS2000系,WGS84系等,这些后面再谈。

    【注】地心坐标系又名协议地球坐标系,与GPS中的瞬时地球坐标系要对应起来。

    但是又有一个问题——政治问题,地图是给一个国家服务的,那么这地图就要尽可能描述准确这个国家的地形地貌,尽量减小误差,至于别国就无所谓。

    所以,就可以人为的把地球的质心“移走”,将局部的表面“贴到”该国的国土,使之高程误差尽量减小到最小。

    这个时候,就出现了所谓的“参心坐标系”。即椭球中心不在地球质心的坐标系。如下图:

    绿色的球就是为了贴合赤道某个地方而产生了平移的参心系(这里只是个例子,而且画的有点夸张)。

    我国常用的参心系及对应椭球:

    • 北京54坐标系:克拉索夫斯基椭球体
    • 西安80坐标系:IAG75椭球体

    我国常用的地心系及对应椭球:

    • WGS84坐标系:WGS84椭球体(GPS星历的坐标系,全球统一使用,最新版于2002年修正)
    • CGCS2000坐标系:CGCS2000椭球体(事实上,CGCS2000椭球和WGS84椭球极为相似,偏差仅有0.11mm,完全可以兼容使用)

    为什么CGCS2000和WGS84要略微有些偏差?这是因为WGS84系是GPS的坐标系,而我国北斗定位则是需要自己的坐标系,就搞了一波CGCS2000。

    这几个坐标系的介绍放在下一节,而这些椭球体的转换将在第三部分介绍(主要就是数学中,空间直角坐标系旋转的问题)。

    1.3 我国常见GCS

    借助以下4个常见坐标系及椭球体,就可以推及到世界各地不同的GCS及椭球体,完成数据的转化问题。

    1.3.1 北京54坐标系(参心)

    新中国成立以后,我国大地测量进入了全面发展时期,再全国范围内开展了正规的,全面的大地测量和测图工作,迫切需要建立一个参心大地坐标系。由于当时的“一边倒”政治趋向,故我国采用了前苏联的克拉索夫斯基椭球参数,并与前苏联1942年坐标系进行联测,通过计算建立了我国大地坐标系,定名为1954年北京坐标系。因此,1954年北京坐标系可以认为是前苏联1942年坐标系的延伸。它的原点不在北京而是在前苏联的普尔科沃。

    • 椭球体:Krasovsky椭球
    • 极半径b=6 356 863.0187730473 m
    • 赤道半径a=6 378 245m
    • 扁率=1/298.3
    • 高程系:56黄海系

    1.3.2 西安80坐标系(参心)

    改革开放啦,国家商量要搞一个更符合国用的坐标系——西安80坐标系,该坐标系的大地原点设在我国中部的陕西省泾阳县永乐镇,位于西安市西北方向约60公里。

    • 椭球体:IAG椭球(全名是啥还得去翻翻课本。。。)
    • 极半径b=6 356 755m
    • 赤道半径a=6 378 140m
    • 扁率=1/298.25722101
    • 高程系:85黄海系

    1.3.3 WGS84坐标系(地心)

    全称World Geodetic System - 1984,是为了解决GPS定位而产生的全球统一的一个坐标系。

    • 椭球体:WGS84椭球
    • 极半径b=6 356 752.314 245 179 5m
    • 赤道半径a=6 378 137 m
    • 扁率=1/298.257223563
    • 高程系:?根据国家需求定?

    1.3.4 CGCS2000坐标系(地心)

    2000国家大地坐标系是全球地心坐标系在我国的具体体现,其全称为China Geodetic Coordinate System 2000,其原点为包括海洋和大气的整个地球的质量中心。

    • 椭球体:CGCS2000坐标系
    • 极半径b=6 356 752.314 140 355 8m
    • 赤道半径a=6 378 137m
    • 扁率=1/298.257222101
    • 高程系:85黄海系

    【注】CGCS2000的定义与WGS84实质一样。采用的参考椭球非常接近。扁率差异引起椭球面上的纬度和高度变化最大达0.1mm。当前测量精度范围内,可以忽略这点差异。可以说两者相容至cm级水平

    最后一张表总结一下:

    有趣的是,在ArcGIS的GCS文件夹下,找到了一个“新北京54坐标系”,这是为了使54和80之间方便转化而产生的一个过渡坐标系。

    2. 方里网与PCS

    说完了以经纬度为计量单位的GCS,那么我再来说说以平面(空间)直角坐标系为度量衡的投影坐标系(PCS,Projection Coordinate System)。

    说一个具体的问题以解释为什么要用PCS。

    如何用经纬度表达一块地的面积?

    这没办法吧?经纬度本身不带单位,度分秒仅仅是一个进制。

    而且同样是1度经度,在不同的纬度时代表的弧段长是不一样的。

    这就给一些地理问题带来了困惑:如何建立一个新的坐标系使得地图分析、空间分析得以定量计算?

    PCS——投影坐标系就诞生了。

    我要着重介绍一下我国的6种常用投影方式:

    • 高斯克吕格(Gauss Kruger)投影=横轴墨卡托(Transverse Mercator)投影
    • 墨卡托(Mercator)投影
    • 通用横轴墨卡托(UTM)投影
    • Lambert投影
    • Albers投影
    • Web Mercator(网络墨卡托)投影

    很多课本、博客都写的很详细了,我想从3D的图形来描述一下他们是怎么个投影的。

    2.1 从投影说起

    如上图。光线打到物体上,使得物体产生的阴影形状,就叫它的投影。这个不难理解。

    这里我想问一个问题:既然投影物体,是不变的,那么我把投影的平面改为曲面呢?

    这就产生了不同的投影,比如投射到一个圆锥面上,一个圆柱面上,一个平面上...等等。

    不同的投影方式有不同的用途,也有了不同的投影名称。

    但是,PCS是基于存在的GCS的,这个直接规定。没有GCS,就无从谈PCS,PCS是GCS上的地物投射到具体投影面的一种结果。

    即:

    PCS=GCS+投影方式

    2.2 我国常见投影

    2.2.1 高斯克吕格投影/横轴墨卡托投影

    英文名Gauss Kruger。在一些奇奇怪怪的原因中,又名横轴墨卡托投影,英文名Transverse Mercator。

    它的投影面是椭圆柱面,假设椭圆柱躺着,和地轴垂直,而且投影面与之相切,就是横轴墨卡托了。

    中央那条黑线就是投影中心线,与椭圆柱面相切。这条线逢360°的因数就可以取,一般多用3度带、6度带。

    就是说,这个投影椭圆柱面可以继续绕着地轴继续转,图中还有一条经线,两条相差6度。

    椭圆柱面旋转6度,继续投影,直到360/6=60个投影带投影完毕。

    注意3度带和6度带的起算经线不同,以及Y方向(赤道方向)前需要加投影带号。

    高斯克吕格已经广为熟知了,我就不作具体介绍,大家可以找比我解释的更好的,我只是摆个图希望大家看的更仔细。

    这个投影的特点是,等角/横/切椭圆柱/投影。

    • 投影后的地图,角度不变,面积有变。离中央经线越远的地区,面积变化越大。此投影合适用于导航。
    • 投影椭圆柱面是横着的;
    • 投影椭圆柱面与椭球体相切。

    适用比例尺:1:2.5万~1:100万等使用6度分带法;1:5000~1:10000使用3度分带法。

    【注】在ArcGIS中,不同的GCS的PCS是不同的,以CGCS2000、西安80和北京54为例:

    CGCS2000_3_Degree_GK_CM_111E:CGCS2000的GCS下,使用高斯克吕格3度分带法,以中央经线为东经111度的投影带的投影坐标系

    CGCS2000_3_Degree_GK_Zone_30:CGCS2000的GCS下,使用高斯克吕格3度分带法,第30个投影带的投影坐标系

    Beijing_1954_3_Degree_GK_CM_111E:北京54的GCS下,使用高斯克吕格3度分带法,以中央经线为东经111度的投影带的投影坐标系

    Beijing_1954_3_Degree_GK_Zone_35:北京54的GCS下,使用高斯克吕格3度分带法,第35个投影带的投影坐标系

    Xian_1980_3_Degree_GK_CM_111E:西安80的GCS下,使用高斯克吕格3度分带法,以中央经线为东经111度的投影带的投影坐标系

    Xian_1980_3_Degree_GK_Zone_34:西安80的GCS下,使用高斯克吕格3度分带法,第34个投影带的投影坐标系

    不难发现,都是以GCS起头的命名法。

    2.2.2 墨卡托投影

    英文名Mercator投影。

    数学上,投影面是一个椭圆柱面,并且与地轴(地球自转轴)方向一致,故名:“正轴等角切/割圆柱投影”。

    既可以切圆柱,也可以割圆柱。

    其实就是高斯克吕格的圆柱面竖起来。

    2.2.3 通用横轴墨卡托投影(UTM投影)

    英文全称Universal Transverse Mercator。是一种“横轴等角割圆柱投影”

    和高斯克吕格类似,高斯克吕格的投影面是与椭球面相切的,这货与椭球面相割。

    实质上

    • UTM投影=0.9996高斯投影

    其余性质都和高斯克吕格投影一样。

    割于纬度80°S和84°N。中央经线投影后,是原长度的0.9996倍。

    不过,起算投影带是180°经线,174°W则是第二个投影带的起算经线。

    由于有以上优点,UTM投影被许多国家和地区采用,作为大地测量和地形测量的投影基础。

    【注】UTM投影是我国各种遥感影像的常用投影。

    【注2】UTM投影在ArcGIS中的定义

    例如:

    WGS_1984_UTM_Zone_50N,就代表WGS1984的GCS下,进行UTM投影,投影带是50N.

    WGS_1984_Complex_UTM_Zone_25N,就代表WGS1984的GCS下,进行3度分带UTM投影,投影带是25N.

    2.2.4 Lambert投影

    中文名兰伯特投影、兰博特投影。

    我国地形图常用投影,比如1:400万基础数据:

    (GCS是北京54)可以看到授权是自定义,说明这个投影是自定义的,没有被官方收录。等到第三部分再说怎么自定义投影。

    我国的基本比例尺地形图(1:5千,1:1万,1:2.5万,1:5万,1:10万,1:25万,1:50万,1:100万)中,1:100万地形图、大部分省区图以及大多数这一比例尺的地图多采用Lambert投影。

    兰伯特投影是一种“等角圆锥投影”。

    ArcGIS中的投影系一般带有Lambert_Conformal_Conic等字样,国际上用此投影编制1∶100万地形图和航空图。

    它就像是一个漏斗罩在乒乓球上:

    更标准的画法,见下图,有切和割两种。

    它没有角度变形。

    这个漏斗的倾斜程度,就有三种:正轴、横轴、斜轴。就是圆锥的方向和地轴的方向的问题。

    2.2.5 Albers投影

    中文名阿伯斯投影。又名“正轴等积割圆锥投影”,常用于我国各省市的投影。

    和上一个兰伯特图形类似,就是一个圆锥与椭球面切割,进行等积投影。

    给了官方WKID:102025.

    与Lambert投影的区别大概就在一个等角,一个等积投影了。

    2.2.6 Web墨卡托(WebMercator投影)

    这是一个由Google提出的、为了自家GoogleMap而专门定义的一种投影,是墨卡托投影的一种变种。

    主要是将地球椭球面当作正球面来投影,这就会导致一定的误差。

    直接看看ArcGIS中的定义:

    给了WKID:3857,名字是WGS_1984_Web_Mercator_Auxiliary_Sphere,意思就是在WGS84的GCS下进行web墨卡托投影。

    现在,经常被百度地图等网络地图采用,估计是Web程序员想省事吧。

    3. GCS与PCS的转换问题(ArcGIS实现)

    3.1 GCS转GCS

    这就是属于空间解析几何里的空间直角坐标系的移动、转换问题,还有个更高级的说法——仿射变换。

    我们知道,空间直角坐标系发生旋转移动缩放,在线性代数里再常见不过了。在摄影测量学中,旋转矩阵就是连接像空间辅助坐标系与像空间坐标系的转换参数(好像不是这俩坐标系,忘了)

    欲将一个空间直角坐标系仿射到另一个坐标系的转换,需要进行平移、旋转、缩放三步,可以无序进行。

    而平移、旋转又有三个方向上的量,即平移向量=(dx,dy,dz)和旋转角度(A,B,C),加上缩放比例s,完成一个不同的坐标系转换,就需要7参数。

    我们知道,地心坐标系是唯一的,即原点唯一,就说明平移向量是0向量,如果缩放比例是1,那么旋转角度(A,B,C)就是唯一的仿射参数,即3参数。

    上图左图为坐标系平移,右图为坐标系旋转。缩放可以在任意阶段进行。

    ——————以上为理论预备——————

    说了这么多理论,如何进行GCS转换呢?假设一个数据源已经有了GCS,我们需要做的操作只有一个:

    打开如下工具:数据管理工具/投影和变换/投影,设置界面如下(以WGS1984转西安80为例):

    别选错了,这里输入输出都是GCS。然后出现以下警告:

    这就告诉你,需要参数转换。在这里,WGS84转西安80,是属于7参数转换(地心转参心),但是缺少7参数,就需要自己去测绘局买或者自己粗略算。

    那么如何定义一个地理坐标变换呢?

    使用投影的旁边的工具:

    即可。见下图:

    使用Position_Vector方法(即7参数法)即可输入7参数。我就不输入了,各位有数据的可以继续做。

    关于3参数和7参数,在ArcGIS帮助文档里都写有的,目录如下:

    3.2 GCS进行投影

    这个就更简单了。

    随便挑个GCS,喜欢什么用什么,如西安80投影到UTM投影,都可以的。

    仍然是上节提及的“投影工具”:

    这样就可以了,这里是以WGS84的GCS投影到UTM的第50分度带上。

    如果是进行栅格数据的投影,就用“栅格”文件夹下的“投影栅格”工具。

    如果所需投影系没有自己需要的GCS,就自定义一个:

    这个窗口在Catalog浮动窗或者Catalog软件里打开某个数据的属性,找到XY坐标系的选项卡,就可以新建。

    【注】如果在数据的属性页的XY坐标系选项卡,或者图层数据框的XY坐标系选项卡中修改GCS,这仅仅是改个名,坐标值还是原来的坐标系上的,这代表老坐标值并没有转换到新坐标系上。形象的说,就是换汤不换药,这是不对的。我这里说的用投影的方法,才是真正的坐标仿射变换到新的坐标系,使之更改数值,形成在新的坐标系下的新坐标值。

    3.3 PCS转PCS(重投影)

    最常见的就是下载了谷歌影像图,是Web墨卡托的投影,但是实际又需要高斯投影,那么基于WGS84这个GCS,就可以进行重投影。

    在这里,我就以UTM投影转Web墨卡托投影为例:

    这次是用“栅格”文件夹下的“投影栅格”工具:

    一般选好红框的三个参数即可。

    如果仍然提示需要地理坐标变换的警告,说明不是一个GCS的数据,需要3参数或者7参数转换。

    栅格数据类似,使用“投影工具”。

    工具定位。

    3.4 定义投影

    这不是定义一个投影坐标系,而是给有坐标值的矢量或者栅格数据添加一个投影坐标系而已。

    使用“定义投影”工具即可,既可以定义GCS,也可以定义PCS(这软件的中文翻译有点毛病)。

    3.5 地理配准与空间校正

    这个就不多说了,地理配准就是使屏幕坐标系的扫描地图仿射、二次三次变换到真正投影坐标系的过程,自动加上目标数据的PCS。有了PCS后就会自动加上GCS。

    地理配准主要是针对栅格数据。

    空间校正则是针对矢量数据进行仿射、二次、三次变换。

    3.6 可能出现的错误

    3.6.1 显示几十万位数字的“经纬度”

    如上图。

    这是有了PCS后,在Catalog的数据属性页的XY坐标系选项卡里,选中GCS,然后应用的结果。

    原本是方里网的数字,变成了GCS才有的度分秒。

    解决方法:Catalog属性页将GCS改回原来的PCS即可。

    3.6.2 显示三位数、两位数的“米”

    这个暂时没找到案例,曾经见过。

    3.6.3 显示一个几乎是0,一个又很大很大位数的数字

    如上图。

    这个属于数据本身有GCS,但是在Catalog的XY坐标系选项卡里给它添加PCS然后应用后,可能会出现的错误。

    解决方法:在Catalog属性页的XY坐标系选项卡里,选中原来的GCS然后应用即可。

    如果数据本身没有PCS,应该做的是投影操作。

    3.6.4 大范围的数据给了小范围的投影

    例如,整个中国地图理应跨越好几个投影带,却给了某一个投影带的投影坐标系,这就会出现负值。如下图,红框箭头是鼠标的位置。

    这个按理说应该用兰伯特投影,但是却给了一个UTM第49区的PCS,所以在中央经线靠左很多的位置会出现负值。

    解决方法:这个直接做重投影即可。

     

    以上四种错误比较常见,但是手头没有案例,以后遇到再发上来吧。

    总结一下:

    4. 火星坐标

    火星坐标这个东西很常见,出现在互联网地图上。例如百度、腾讯、谷歌等地图。

    出于保密等政治因素,地图的GCS坐标值,会被一种特殊的数学函数加密一次,会偏离真实坐标数百米的距离,但是反馈到用户端的却是正确的位置信息(也就是说你拿到GCS坐标也没用,拿GPS到实地跑跟拿着地图定位,可能会偏出几十米甚至一百米的距离)。

    火星坐标系原名国测局坐标系(GCJ-02),有篇文章比我写的透彻多了,甚至给出了还原代码,我放到参考资料了,有兴趣的可以看看。

     

    参考资料

    你所不知的有趣投影方法

    ArcGIS将WGS84坐标转北京54或西安80

    百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系互转

    &ArcGIS 帮助文档

    展开全文
  • WINDOWS 坐标系

    千次阅读 2010-05-04 14:39:00
    WINDOWS 坐标系 收藏 在窗口中绘图 在窗口中绘图图形设备接口(GDI)与设备描述表(DC)图形设备接口(GDI)许多MS-DOS程序都直接往视频存储区或打印机端口输送数据, 这种做法的不利之处在于需要对每种显示卡或...

    WINDOWS 几种坐标系 收藏
     

    在窗口中绘图                                     
    在窗口中绘图

    图形设备接口(GDI)与设备描述表(DC)

    图形设备接口(GDI)
    许多MS-DOS程序都直接往视频存储区或打印机端口输送数据, 
    这种做法的不利之处在于需要对每种显示卡或打印机类型提供相应的驱动程序。
    Windows则提供了一抽象的接口,称之为图形设备接口(GDI)。
    Windows己经提供了各种显示卡及打印机的驱动程序,
    这样我们的程序就可以不必关心与系统相连的显示卡及打印机的类型。
    我们的程序可以通过调用GDI函数和硬件打交道,
    而各种GDI函数会自动参考被称为设备环境(CDC)的数据结构。
    Windows会自动将设备环境结构映射到相应的物理设备,并且会提供正确的输入输出指令。

    设备描述表(DC)

    在Windows环境中,各程序的输出必须限制在自己的窗口中。
    GDI使用一种简单的机制保证在窗口中画图的各程序遵循这个规则。
    这种机制即为设备描述表(DC);

    当Windows程序在屏幕、打印机或其它设备上画图时,
    它并不是将像素直接输出到设备上,而是将图绘制到由设备描述表表示的逻辑意义上的"显示平面"上去。

    设备描述表是深寓于Windows中的一种数据结构,
    它包含GDI需要的所有关于显示平面情况的描述字段,包括相连的物理设备和各种各样的状态信息。

    设备描述表对象
    在使用MFC编制Windows程序时,设备描述表具有更加突出的作用。
    除了可作为通往各种设备的桥梁之外,设备描述表对象还封装了程序用来产生输出的GDI函数。
    在MFC中,你不用捕获设备描述表句柄和调用GDI输出函数,至少不必直接捕获和调用,
    而是通过创建一设备描述表对象并调用它的成员函数来画图。

    设备描述表句柄
    在平面上画图之前,Windows程序从GDI获取设备描述表句柄,
    并在每次调用完GDI输出函数时将句柄返回给GDI。
    在MFC应用程序中获取设备描述表的一种方法是调用CWnd::GetDC,
    它返回指向表示Windows设备描述表的CDC对象的指针。
    在画图完毕,要用CWnd::ReleaseDC释放指针(注:在OnPaint处理程序中,不用显示调用这两个函数)

    CDC派生类
    为了避免获取和释放设备描述表所带来的麻烦,
    MFC提供了一些CDC派生类,如CPaintDC,CClientDC,CWindowDC这些类被设计为可直接进行实例化。
    各个类的构造函数和析构函数调用相应的函数捕获和释放设备描述表,
    从而便得设备描述表的使用非常方便简捷。

    例如:
    CPaintDC dc(this);
    //Do some drawing
    传送给类构造函数的指针确定了设备描述表所属的窗口。

    设备描述表属性
    当使用CDC输出函数在屏幕上画图时,
    输出的某些特性并没有在函数调用过程中规定(采用系统默认的属性画图),
    但我们可以通过设备描述表自身获得或得新设置属性。
    MFC提供了获得和设置这些属性的函数,我们可以用这些函数方便地改变画图时的默认属性。
    例如:
    CDC::SetTextColor//设置文本颜色
    CDC::GetTextColor//获得文本颜色
    CDC::SetBkColor//设置背景颜色
    CDC::SetBkMode//设置背景模式
    CDC::SetMapMode//设置映射模式
    CDC::CDC::SetROP2//设置绘图模式
    CDC::MoveTo//当前位置
    CDCL::SelectObject//当前画笔,当前画刷,当前字体

    (如果想忽略背景色,可将背景设置为"Transparent",dc.SetBkMode(TRANSPARENT);)

    SelectObject函数
    最常用来定义设备描述表属性的CDC函数是SelectObject。
    例如:
    CPen pen(PS_SOLID,2,RGB(0,192,0));
    CPen* pOldPen = dc->SelectObject(&pen);//把新的CDC对象选入设备描述表,同时保存旧的CDC对象
    dc->Ellipse(0,0,100,100);
    dc.SelectObject(pOldPen);//

    绘图模式与SetROP2
    GDI将像素点输出到逻辑平面上时,它不只是简单地输出像素点颜色。
    相反,它能过一系列的布尔运算将输出像素点的颜色和目标位置上像素点的颜色合成一起。
    它所使用的逻辑关系由设备描述表当前的绘图模式确定。
    使用CDC::SetROP2(Set Raster Operation To)可更改绘图模式。
    默认绘图模式为R2_COPYPEN,它将将像素点复制到显示平面上。

    映射模式

    默认映射模式
    固定比例映射模式
    可编程映射模式

    简单地说,映射模式是设备描述表的属性,用于确定从逻辑坐标值到设备坐标值的转换方式。

    默认的映射模式

    默认的映射模式使MM_TEXT,它使以象素为单位的。X轴向左为正,Y轴向下为正。默认的坐标原点在左上角。

    固定比例映射模式

    固定比例的映射模式有MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH、MM_TWIPS种。
    它们默认的坐标原点都使在左上角。其区别在于每一个逻辑单位对应的物理大小不一样。
    所对用的逻辑单位分别为0.1毫米,0.01毫米,0.01英寸,0.001英寸,1/1440英寸(0.0007英寸)。

    可变比例映射模式(可编程映射模式)

    对于可变比例的映射模式用户可以自己定义一个逻辑单位代表的大小,其大小可以任意。
    也可以让这个大小随环境改变而改变。有MM_ISOTROPIC,MM_ANISOTROPIC这两种映射模式。
    其逻辑单位的大小等于视口范围和窗口范围的比值。
    两者的不同在于前者要求X轴和Y轴的度量单位必须相同,而后者没有这样的限制。

    可编程映射模式
    MM_ISOTROPIC和MM_ANISOTROPIC是由用户决定从逻辑坐标值转换成设备坐标值的方式,
    即是由用户决定一个逻辑单位等于多少个设备单位(cm,mm,m等),而不是由Windows决定。
    所以被称之为可编程映射模式;
    MM_ISOTROPIC和MM_ANISOTROPIC映射模式最常用于根据窗口尺寸按比例自动调节画图的输出大小的场合。

    MM_ISOTROPIC和MM_ANISOTROPIC映射模式的区别
    前者中X方向和Y方向具有同一个缩放比例因子,而后者两个方向可以单独缩放;

    例子:
    CRect rect;
    GetClientRect(&rect);
    dc.SetMapMode(MM_ISOTROPIC);
    dc.SetWindowExt(500,500);//设置窗口范围,将窗口的逻辑尺寸高为500单位×500单位
    dc.SetViewportExt(rect.Width(),rect.Height());//设置视口范围
    dc.Ellipse(0,0,500,500);

    注:窗口的尺寸以逻辑单位计算,视口的尺寸以设备单位或像素计算。
    特别说明
    MM_TEXT为默认映射模式,其原点在窗口的左上角,X轴的正向向右,Y轴的正向向下,
    并且一个逻辑单位对应于设备坐标下的一个象素

    其它映射模式则原点不变,只是Y轴会翻转使正向朝上,并且逻辑单位被按比例转换为实际距离大小,而不是像素数。
    需要注意的是,使用公制映射模式(非默认映射模式)时,为使输出可见,Y坐标必须为负值。
    例如:
    dc.Rectangle(0,0,200,100);//默认模式下画图
    dc.SetMapMode(MM_LOENGLISH);//改变映射模式
    dc.Rectangle(0,0,200,-100);//画图

    传送给CDC输出函数的是逻辑坐标值。
    设备坐标值是指窗口中相应的像素点位置。


    Windows中的几种坐标体系

    1、屏幕坐标

    屏幕坐标描述物理设备(显示器、打印机等)的一种坐标体系,
    坐标原点在屏幕的左上角,X轴向右为正,Y轴向下为正。度量单位是象素。
    原点、坐标轴方向、度量单位都是不能够改变的。

    2、设备坐标(又称物理坐标)

    设备坐标是描述在屏幕和打印机显示或打印的窗体的一种坐标体系。
    默认的坐标原点是在其客户区的左上角。X轴向右为正,Y轴向下为正。
    度量单位为象素。原点和坐标轴方向可以改变,但是度量单位不可以改变。

    3、逻辑坐标

    逻辑坐标是在程序中控制显示,打印使用的坐标体系。
    该坐标系与定义的映射模式密切相关。默认的映射模式是MM_TEXT。
    我们可以通过设置不同的映射模式来改变该坐标体系的默认行为。

    注意:
    首先,要记住两点:
    1。设备坐标的(0, 0)点始终是客户区的左上角。
    2。我们在绘图时指定的点全部都是逻辑坐标点。

    坐标转换
    调用CDC::LPtoDP可以将逻辑坐标转换为设备坐标;
    高用CDC::DPtoLP可以将设备坐标转换为逻辑坐标;

    什么时候用什么坐标系

    可以认为CDC的所有成员函数都以逻辑坐标作为参数
    可以认为CWnd的所有成员函数都以设备坐标作为其参数
    所有选中测试操作中都应该考虑设备坐标。区域的定义应采用设备坐标。
    某些像CRect::PtInRect之类的函数只有在采用设备坐标参数时才会保证有正确的结果
    将一些需要长期使用的值用逻辑坐标或物理坐标来保存。
    如果用逻辑坐标来保存某点的坐标的话,那么只要用户对窗口进行一下滚动,该点的坐标就不再有效了。
    鼠标单击事件下得到的坐标都是设备坐标!
    移动原点
    CDC::SetViewportOrg()移动视口的原点 
    CDC::SetWindwosOrg()移动窗口的原点
    正常情况下,只能使用其中之一,同时使用两个会搞提一团糟。

    获取设备信息
    获得系统分辨率
    CClientDC dc(this);
    int cx = dc.GetDeviceCaps(HORZRES);
    int cy = dc.GetDeviceCaps(VERTRES);

    用GDI绘图

    MFC的CDC类将相关的GDI函数封装在类成员函数中。
    在设备描述表对象中或通过指向设备描述表对象的指针可以方便地调用这些函数

    画线
    dc.MoveTo(0,0);//设置当前位置
    dc.LineTo(100,100);//指定一个线的终点位置

    画圆
    dc.Ellipse(0,0,100,100);
    CRect rect(0,0,100,100);
    dc.Ellipse(rect);

    画矩形
    dc.Rectangle(0,0,100,100);//画一个带直角的矩形

    GDI画笔和CPen类
    Windows用当前选入设备描述表的画笔绘制直线和曲线,
    并给用Rectangle,Ellipse以及其他图形生成函数画出的图形镶画边框。
    默认画笔画出的是一个像素点宽的黑色实线。
    如果要改变画线方式,则需创建一个GDI画笔,并由CDC::SelectOjbect将它选设备描述表

    MFC用类CPen表示GDI画笔。

    创建画笔的方法
    创建画笔的最简单的方法是构造一个CPen对象并把定义画笔所用的参数都传送给该对象
    CPen pen(PS_SOLID,1,RGB(255,0,0));

    创建画笔的第二种方法是构造 一个汉有初始化的CPen对象并调用CPen::CreatePen:
    CPen pen;
    pen.CreatePen(PS_SOLID,1,RGB(255,0,0));

    创建画笔的第三种方法是构造一个没有初始化的CPen对象,向LOGPEN结构中填充描述画笔特性的参数
    ,然后调用CPen::CreatePenIndirect生成画笔
    CPen pen;
    LOGPEN lp;
    lp.lognStyle = PS_SOLID;//样式
    lp.lopnWidth.x = 1;//宽度
    lp.lopnColor = RGB(255,0,0);//颜色
    pen.CreatePenIndirect(&lp);

    从以上的画笔定义可以看出,定义画笔需要三个特性:样式,宽度和颜色。
    画笔的样式说明请参见MSDN

    GDI画刷和CBrush类
    在默认情况下,则Rectangle,Ellipse以及其它CDC函数画出的封闭图形填充着白色像素点。
    通过创建GDI画刷并在画图之前将它选入设备描述表,可以改变图形的填充颜色。
    MFC的CBrush类封装了GDI画刷。
    画刷有三种基本类型:单色、带阴影和带图案。
    单色画刷填充的单色。
    阴影线画刷采用预先定义好的交叉线图案填充图形。
    图案画刷用位图来填充图形。

    创建单色画刷的方法类似于创建画笔,如下所示:
    CBrush brush(RGB(255,0,0));

    CBrush brush;
    brush.CreateSolidBrush(RGB(255,0,0));

    创建带阴影线画刷
    CBrush brush(HS_DIAGCROSS,RGB(255,0,0));//阴影索引,COLORREF值

    CBrush brush;
    brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0));
    HS_DIAGCROSS是可供选择的六种阴影线样式之一,其它样式请参见MSDN

    注意:
    在用阴影线画刷填充时,除非用CDC::SetBkColor改变设备描述表的当前背景色,
    或用CDC::SetBkMode把背景模式OPAQUE改成TRANSPARENT,禁止背景填充,
    否则WIndows就以默认的背景钯(白色)填充阴影色线间的空白处。

    原文出处:http://blog.programfan.com/article.asp?id=19140


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lovesunshine2008/archive/2009/04/04/4048142.aspx

    展开全文
  • UG NX 12 坐标系

    2021-05-20 14:06:28
    UG中坐标系包含三种坐标,分别是绝对坐标系ACS(Absolute Coordinate System)、工作坐标系WCS(Work Coordinate System)和机械坐标系MCS(Machine Coordinate System),这些坐标系都满足右手法则。 ACS:默认坐标...

    坐标系是软件用来进行工作的空间基准,所有的操作都是相对于坐标系进行的。UG中坐标系包含三种坐标,分别是绝对坐标系ACS(Absolute Coordinate System)、工作坐标系WCS(Work Coordinate System)和机械坐标系MCS(Machine Coordinate System),这些坐标系都满足右手法则。

    ACS:默认坐标系,其原点位置永远不会变,在用户新建文件时就已经存在,是软件开发人员预置的内定坐标。

    WCS:是UG提供给用户的坐标,用户可以根据需要任意移动位置,也可以进行旋转,以及新建wCS等操作。

    MCS:机械坐标系用于模具设计、数控加工、配线等向导操作中。

    在通常的设计工作中,用户可以通过对wCS的调整快速地变换工作方位,提高设计工作的效率。

    执行菜单栏中的【格式】|【WCS】选项,弹出【WCS】菜单,如下图所示。下面介绍4种常用的UG坐标系操作。

    在这里插入图片描述
    1.动态

    动态WCS命令可以通过鼠标直接控制动态坐标系上的平移手柄和旋转球来移动和旋转WCS,也可以直接在文本框中输入平移的距离和旋转的角度,如图下图所示。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    2.原点

    通过定义当前坐标系的原点来更改WCS的位置。该命令只能改变坐标系的位置,不会改变坐标轴的朝向。

    3.旋转

    旋转wCs命令通过当前的wcS绕其中一条轴旋转一定的角度,来定义一个新的WCS

    执行菜单栏中的【格式】|【WCS】|【旋转】命令,弹出【旋转WCS绕…】】对话框,该对话框用来选取旋转的轴和输入旋转的角度,如下图所示。正值为逆时针旋转,负值为顺时针旋转。

    在这里插入图片描述
    4.定向

    定向WCS是对WCS采用对话框定义的方式进行定向,定向的方式有多种。执行菜单栏中的【格式】|【WCS】|【定向】命令,弹出【CSYS】对话框,在该对话框中的【类型】

    下拉列表中共有16种定向类型,如下图所示。

    在这里插入图片描述
    可以通过定向坐标系工具方便地对WCS进行定向,其中【对象的CSYS】与【原点,X点,Y点】等方式比较常用。

    在这里插入图片描述

    展开全文
  • 工业机器人常用的六种坐标系

    万次阅读 2019-11-28 11:07:52
    工业机器人上的坐标系包括六种:大地坐标系(World Coordinate System)、基坐标系(Base Coordinate System)、关节坐标系(Joint Coordinate System)、工具坐标系(Tool Coordinate System)、工件坐标系(Work .....
  • UG NX 10 坐标系

    千次阅读 2020-09-07 16:29:03
    UG包含3种坐标系,分别是绝对坐标系ACS(Absolute Coordinate System)、工作坐标系wCS(WorkCoordinate System)和机械坐标系MCS(Machine Coordinate System),这些坐标系都满足右手法则。 ACS:默认坐标系,其...
  • 坐标系之间的相互转换

    千次阅读 2018-11-22 14:25:31
    gcoord(geographic coordinates)是一处理地理坐标系的js库,用来修正百度地图、高德地图及其它互联网地图坐标系不统一的问题 Features 轻量 - 无外部依赖,gzip后大小仅2kb 兼容性强 - 能在node环境以及所有现代...
  • 机器人基本知识工业机器人的坐标系及TCP工业机器人轴的类型工业机器人坐标系类型关节坐标系直角坐标系世界坐标系工具坐标系工件坐标系用户坐标系坐标标定方法工具坐标系(没太明白)工件坐标系 工业机器人的坐标系及...
  • opengl中的坐标系

    2015-09-29 10:22:13
    OPENGL坐标系可分为:世界坐标系当前绘图坐标系。 世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到...
  • 几个坐标系的介绍放在下一节,而这些椭球体的转换将在第三部分介绍(主要就是数学中,空间直角坐标系旋转的问题)。 1.3 我国常见GCS 借助以下4个常见坐标系及椭球体,就可以推及到世界各地不同的GCS及椭球体,...
  • ARcore坐标系与地理坐标系转换

    千次阅读 2018-12-28 15:55:29
    这还不是我们最终的世界坐标系,因为我们的手机的方向并不总是指向正北也就是我们上面定义的坐标系中的O->N方向,他自己的方位角Azimuth angle(可以通过传感器获取),即手机与正北方向的夹角。所以,我们需要对...
  • 地理坐标系是以经纬度为单位的地球坐标系统,地理坐标系2重要部分,即地球椭球体(spheroid)和大地基准面(datum)。由于地球表面的不规则性,它不能用数学公式来表达,也就无法实施运算,所以必须找一...
  • OpenGL中的坐标系

    千次阅读 2013-06-03 16:28:30
    它是一右手坐标系可以认为该坐标系是固定不变的,在初始态下,其x轴为沿屏幕水平向右,y轴为沿屏幕垂直向上,z轴则为垂直屏幕面向外指向用户,当然,如果在程序中对视点进行了转换,就不能再认为是这样的了。...
  • [OpenGL]OpenGL坐标系及坐标转换

    千次阅读 2014-05-06 15:53:40
    OpenGL通过相机模拟、可以实现计算机图形学中最基本的三维变换,即几何...世界坐标系:在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,将三维物体及二维数据联系在一起的唯一纽带
  • ArcGIS——GIS中的坐标系

    万次阅读 多人点赞 2017-10-13 11:08:26
    从第一次上地图学的课开始,对GIS最基本的地图坐标系统就很迷...想必多多少少都会听说过几个名词,也许悠远,也许模糊。高斯克吕格,北京54,西安80,WGS84,投影坐标系统,etc. 今天就从头说起,讲讲那些坐标系统的
  • 说到Android坐标系其实就是一三维坐标,Z轴向上,X轴向右,Y轴向下。这三维坐标的点处理就能构成Android丰富的界面或者动画等效果,所以Android坐标系在整个Android界面中算是盖楼房的尺寸草图,下面我们就来看看...
  • GIS的坐标系讲解

    千次阅读 2020-08-06 17:16:05
    在Qgis的二次开发过程中,由于没有接触过gis方面的东西,在涉及到具体物理量,例如坐标、距离等的时候,...想必各位从业人员多多少少都会听说过几个名词,可能那么点印象吧。例如,高斯克吕格,北京54,西安80,W.
  • 自定义坐标系(北京54、西安80、2000坐标系)  (2014-09-22 13:46:43) 转载▼ 标签:  杂谈 分类: ENVI 2016年4月更新:请将此教材(包括截图)中的 IAG-75 全部修改为...
  • 本节介绍PDF中使用的每个坐标系,包括它们之间的关系以及如何转换。  注:本节讨论的坐标系适用于 2D 图形。 一、坐标空间  路径和位置是通过一对坐标进行定义的, x(横坐标) 和 y(纵坐标),表示二维坐标...
  • GIS中很多不同的坐标系,当数据在不同的坐标系下显示的时候,就要把数据从数据本身的坐标系转换到当前当前地图显示的坐标系。 二,GIS坐标系背景 1、基本概念 地球是一近似椭球体,测绘时用椭球模型逼近,这...
  • 一、坐标系 1)定义坐标范围:一般MATLAB自动定义坐标范 围,如用户认为设定的不合适,可用:axis([Xmin, Xmax, Ymin, Ymax]) 来重新设定;...3)通常MATLAB的坐标系是长方形,长宽比例大约是 4:3,为了得到一正方形的
  • VC中坐标系的建立

    千次阅读 2009-04-10 09:04:00
    建立一合适的坐标系可以为我们的绘图带来很大的方便 。下面介绍一下如何在VC中建立我们想要的坐标系。一 设备坐标和逻辑坐标 设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出...
  • 关于坐标系我们通常用经纬度来表示一地理位置,但是由于一些原因,我们从不同渠道得到的经纬度信息可能并不是在同一个坐标系下。 高德地图、腾讯地图以及谷歌中国区地图使用的是GCJ-02坐标系 百度地图使用的是BD-...
  • 坐标几个函数的用法说明

    千次阅读 2010-03-08 21:55:00
    本文转自:http://www.cppblog.com/Lee7/archive/2009/05/29/86070.html (1)Windows坐标系统Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系。一般而言,GDI的文本和图形输出函数使用逻辑坐标...
  • 我国全国版图常用的投影为双标准纬线圆锥投影,如等积Albers投影或者等角Lambert投影,所使用的地理坐标参照系则依据数据生产时间而有所不同,如早期的北京54坐标系和西安80坐标系,以及近年来所普遍采用的国家2000...
  • 普通的三维画图大多数就是画立方体,颜色花哨一点,但是因为项目需求,要画一三维坐标系,并在上面显示三维向量,不是要平面的那种坐标系,而是做成像是在纸上画的那种立体长方体并显示出向量。 刚开始还是小...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,552
精华内容 9,020
关键字:

当前的用户坐标系可以有几个