• C#简单实现摄影测量后方交会   ——题目来自武大版《摄影测量学》习题2.27   一、 实验目的和要求 通过对题目已知的4对影像坐标和地面坐标,通过编程实现计算近似垂直摄...

    C#简单实现摄影测量后方交会 

                                                                                                ——题目来自武大版《摄影测量学》习题2.27

                     

    一、    实验目的和要求

    通过对题目已知的4对影像坐标和地面坐标,通过编程实现计算近似垂直摄影情况下空间后方交会的解,最后得到6个外方位元素的解。要求编程实现主要算法,通过读取文件,在窗体程序中完成计算,并输出结果显示。角元素迭代计算至小于某一限值即可。

    本实验的目的在于让学生深入理解单片空间后方交会的原理,体会在多余观测情况下,用最小二乘平差方法编程实现解求影像外方位元素的过程。通过上机调试程序加强动手能力的培养,通过对实验结果的分析,增强学生综合运用所学知识解决实际问题的能力。

    二、     实验内容与数据

    1.   实验内容

    利用一定数量的地面控制点,根据共线条件方程像片外方位元素。

    2.   实验数据

    已知航摄仪的内方位元素:fk=153.24mm,x0=y0=0.0mm。

    4个地面控制点的地面坐标及其对应像点的像片坐标:

     

    影像坐标

     

     

    地面坐标

     

     

     x(mm)

     y(mm)

      X(M)

    Y(m)

     Z(m)

    1

    -86.15

    -68.99

    36589.41

    25273.32

    2195.17

    2

    -53.40

    82.21

    37631.08

    31324.51

    728.69

    3

    -14.78

    -76.63

    39100.97

    24934.98

    2386.50

    4

    10.46

    64.43

    40426.54

    30319.81

    757.31

     

    三、     实验原理及步骤

    (1)获取已知数据:比例尺分母m,内方位元素x0,y0,f,以及控制点的地面摄影测量坐标X、Y、Z。
        (2)获取控制点的像点坐标:得到像点坐标x、y。 
        (3)确定未知数的初始值:在竖直摄影情况下,外方位角元素的初始值为0,即phi0=omiga0=kappa0=0;线元素中,Zs0=H=mf,Xs0、Ys0的取值用四个控制点坐标的平均值,即Xs0=1/4*(X1+X2+X3+X4);Ys0=1/4 *(Y1+Y2+Y3+Y4). 
        (4)计算旋转矩阵R:利用角元素的近似值计算方向余弦值,组成R阵。 
        (5)逐点计算像点坐标的近似值:利用未知数的近似值按共线方程计算控制点像点坐标的近似值(x),(y)。 
        (6)组成误差方程式:逐点计算误差方程式的系数和常数项。 
        (7)组成法方程式:计算法方程式的系数矩阵ATA与常数项ATL。 
        (8)解求外方位元素:根据法方程,解求外方位元素改正数,并与相应的近似值求和,得到外方位元素新的近似值。 
        (9)检查计算是否收敛:将求得的外方位元素的改正数与规定的限差比较,小于限差则计算终止,否则用新的近似值重复第4至第8步骤的计算,直到满足要求为止。

    四、    程序框图

     

     

     

    五、    后方交会计算代码

       

    //后方交会
            privatevoid button2_Click(object sender, EventArgs e)
    
            {
    
                double[] x = { Convert.ToDouble(t1.Text), Convert.ToDouble(t6.Text), Convert.ToDouble(t11.Text),Convert.ToDouble(t16.Text)};
    
                double[] y = { Convert.ToDouble(t2.Text), Convert.ToDouble(t7.Text), Convert.ToDouble(t12.Text),Convert.ToDouble(t17.Text)};
    
                double[] X = { Convert.ToDouble(t3.Text), Convert.ToDouble(t8.Text), Convert.ToDouble(t13.Text),Convert.ToDouble(t18.Text)};
    
                double[] Y = { Convert.ToDouble(t4.Text), Convert.ToDouble(t9.Text), Convert.ToDouble(t14.Text),Convert.ToDouble(t19.Text)};
    
                double[] Z = { Convert.ToDouble(t5.Text), Convert.ToDouble(t10.Text),Convert.ToDouble(t15.Text),Convert.ToDouble(t20.Text)};
    
                double f = Convert.ToDouble(t22.Text)/ 1000, _m = Convert.ToDouble(t21.Text);
    
                for (int i = 0; i < 4;i++)    //单位换算
    
                {
    
                    x[i] = x[i] / 1000;
    
                    y[i] = y[i] / 1000;
    
                }
    
     
    
              /////定义外方位元素,并附初值
    
                double Xs, Ys, Zs, phi =0, omiga = 0, kappa = 0;
    
                Xs = (X[0] + X[1] + X[2] + X[3]) /4.0;
    
                Ys = (Y[0] + Y[1] + Y[2] + Y[3]) /4.0;
    
                Zs = _m * f;
    
     
    
                /////定义x,y近似值,即计算值
    
                double[] _x = newdouble[4];
    
                double[] _y = newdouble[4];
    
     
    
                /////定义共线方程中的分子分母项,便于计算
    
                double[] _X = newdouble[4];
    
                double[] _Y = newdouble[4];
    
                double[] _Z = newdouble[4];
    
     
    
                /////定义旋转矩阵R
    
                double[,] R = newdouble[3, 3];
    
                double[,] L = newdouble[8, 1];//误差方程中的常数项
    
                double[,] XX = newdouble[6, 1];//X向量
    
     
    
                /////开始迭代
    
                do
    
                {
    
                    /////计算旋转矩阵
    
                    R[0, 0] = Math.Cos(phi) * Math.Cos(kappa) - Math.Sin(phi) * Math.Sin(omiga) * Math.Sin(kappa);//a1
    
                    R[0, 1] = -Math.Cos(phi) * Math.Sin(kappa) - Math.Sin(phi) * Math.Sin(omiga) * Math.Cos(kappa);//a2
    
                    R[0, 2] = -Math.Sin(phi) * Math.Cos(omiga);//a3
    
                    R[1, 0] = Math.Cos(omiga) * Math.Sin(kappa);//b1
    
                    R[1, 1] = Math.Cos(omiga) * Math.Cos(kappa);//b2
    
                    R[1, 2] = -Math.Sin(omiga);//b3
    
                    R[2, 0] = Math.Sin(phi) * Math.Cos(kappa) + Math.Cos(phi) * Math.Sin(omiga) * Math.Sin(kappa);//c1
    
                    R[2, 1] = -Math.Sin(phi) * Math.Sin(kappa) + Math.Cos(phi) * Math.Sin(omiga) * Math.Cos(kappa);//c2
    
                    R[2, 2] = Math.Cos(phi) * Math.Cos(omiga);//c3
    
     
    
                    for (int i = 0; i < 4;i++)
    
                    {
    
                        //用共线方程计算 x,y 的近似值 ,即计算值      
    
                        _X[i] = R[0, 0] * (X[i] -Xs) + R[1, 0] * (Y[i] - Ys) + R[2, 0] * (Z[i] - Zs);
    
                        _Y[i] = R[0, 1] * (X[i] -Xs) + R[1, 1] * (Y[i] - Ys) + R[2, 1] * (Z[i] - Zs);
    
                        _Z[i] = R[0, 2] * (X[i] -Xs) + R[1, 2] * (Y[i] - Ys) + R[2, 2] * (Z[i] - Zs);
    
     
    
                        _x[i] = -f * _X[i] / _Z[i];
    
                        _y[i] = -f * _Y[i] / _Z[i];
    
                    }
    
     
    
                    Matrix B = newMatrix(8, 6, "B");//4个控制点,每个是2行6列,4个是8行6列
    
                    int n = B.getN;
    
                    int m = B.getM;
    
                    double[,] b = B.Detail;
    
                    for (int i = 0; i < 4;i++)
    
                    {
    
                        //计算系数矩阵
    
                        b[2 * i, 0] = (R[0, 0] * f+ R[0, 2] * x[i]) / _Z[i];
    
                        b[2 * i, 1] = (R[1, 0] * f+ R[1, 2] * x[i]) / _Z[i];
    
                        b[2 * i, 2] = (R[2, 0] * f+ R[2, 2] * x[i]) / _Z[i];
    
                        b[2 * i, 3] = y[i] * Math.Sin(omiga) - ((x[i]/ f) * (x[i] * Math.Cos(kappa) - y[i] *Math.Sin(kappa)) + f * Math.Cos(kappa)) * Math.Cos(omiga);
    
                        b[2 * i, 4] = -f * Math.Sin(kappa) - (x[i]/ f) * (x[i] * Math.Sin(kappa) + y[i] *Math.Cos(kappa));
    
                        b[2 * i, 5] = y[i];
    
     
    
                        b[2 * i + 1, 0] = (R[0, 1]* f + R[0, 2] * y[i]) / _Z[i];
    
                        b[2 * i + 1, 1] = (R[1, 1]* f + R[1, 2] * y[i]) / _Z[i];
    
                        b[2 * i + 1, 2] = (R[2, 1]* f + R[2, 2] * y[i]) / _Z[i];
    
                        b[2 * i + 1, 3] = -x[i] * Math.Sin(omiga) - ((x[i]/ f) * (x[i] * Math.Cos(kappa) - y[i] *Math.Sin(kappa)) - f * Math.Sin(kappa)) * Math.Cos(omiga);
    
                        b[2 * i + 1, 4] = -f * Math.Cos(kappa) - (y[i]/ f) * (x[i] * Math.Sin(kappa) + y[i] *Math.Cos(kappa));
    
                        b[2 * i + 1, 5] = -x[i];
    
     
    
                        //计算常数项
    
                        L[2 * i, 0] = x[i] - _x[i];
    
                        L[2 * i + 1, 0] = y[i] -_y[i];
    
                    }
    
                    Matrix C = MatrixOperator.MatrixTrans(B);         //系数矩阵的转置矩阵
    
                    C.Name = "C";
    
                    Matrix D = MatrixOperator.MatrixMulti(C,B);       //系数矩阵与其转置矩阵相乘
    
                    D.Name = "C*B";
    
                    Matrix dn = MatrixOperator.MatrixInvByCom(D);      //系数矩阵与其转置矩阵积的逆矩阵
    
                    dn.Name = "dn";
    
                    Matrix dn2 = MatrixOperator.MatrixMulti(dn,C);       //ATA的逆阵乘以A的转置
    
                    dn2.Name = "dn2";
    
                    double[,] ATARAT =dn2.Detail;
    
     
    
                    ////计算ATARAT* L,存在XX中
    
                    for (int i = 0; i < 6;i++)
    
                        for (int j = 0; j < 1;j++)
    
                        {
    
                            XX[i, j] = 0;
    
                            for (int l = 0; l < 8;l++)
    
                                XX[i, j] +=ATARAT[i, l] * L[l, 0];
    
                        }
    
     
    
     
    
                    ////计算外方位元素值
    
                    Xs += XX[0, 0];
    
                    Ys += XX[1, 0];
    
                    Zs += XX[2, 0];
    
                    phi += XX[3, 0];
    
                    omiga += XX[4, 0];
    
                    kappa += XX[5, 0];
    
     
    
     
    
                }
    
                while (Math.Abs(XX[0, 0]) >=0.000029 || Math.Abs(XX[1, 0]) >=0.000029 || Math.Abs(XX[2, 0]) >=0.000029 || Math.Abs(XX[3, 0]) >=1000 * 0.000029 || Math.Abs(XX[4, 0]) >=1000 * 0.000029 || Math.Abs(XX[5, 0]) >=1000 * 0.000029);
                textbox1.Text = Convert.ToString(Xs);   //输出到文本框
                textbox2.Text = Convert.ToString(Ys);
    
                textbox3.Text = Convert.ToString(Zs);
    
                textbox4.Text = Convert.ToString(phi);
    
                textbox5.Text = Convert.ToString(omiga);
    
               textbox6.Text = Convert.ToString(kappa);

     

     

    六、    计算结果展示

     

    展开全文
  • C#空间后方交会程序 2020-06-30 18:09:56
    C#实现空间后方交会
  • 亲测可运行程序。空间后方交会,用C#编写,控制台程序,内置含有矩阵求逆、矩阵转置DLL。
  • c#单像空间后方交会 2020-03-22 23:32:43
    c#编的单张像片空间后方交会程序,输入数据方式是excel表格
  • 单像空间后方交会C# 2020-06-30 18:05:07
    单像空间后方交会C#单像空间后方交会C#单像空间后方交会C#单像空间后方交会C#
  • 摄影测量空间后方交会程序合集,含MFC和C++,C#源码,要进行摄影测量实习的同学们,你们有福了,快来下载这个吧,这个程序的合集可真的费了我不少心血呢。。。。
  • (1)已知航摄仪内方位元素f=153.24mm,Xo=Yo=0。限差0.1秒 (2)已知4对点的影像坐标和地面坐标:
  • 用程序设计语言(VC或者VB)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并评定精度。本实验的目的在于让学生深入理解单片空间后方交会的原理,体会在有多余观测情况下...
  • 单片空间后方交会[C#] 2008-05-09 20:37:00
    using System;using System.Collections.Generic;using System.Text;namespace _33...{ class Program ...{ public class Data ...{ //内方位元素 double f = 0.1
  • 主要编制了单张相片的整个过程,比较详细。
  • 解算过程分为两个阶段:后方交会、前方交会。 思路为利用后方交会计算外方位元素,利用前方交会解算待定地面点坐标。 后方交会的解算过程为: (1)获取已知数据:比例尺分母m,内方位元素x0,y0,f,以及控制点的...
  • 单张像片,已知主距f,像点坐标x,y和地面点坐标X,Y,Z求外方面为元素,即用空间后方交会计算外方位元素。
  • 本代码提供了摄影测量中单像空间后方交会解算外方位元素和立体像对前方交会解算地面点坐标的详细方法,对于摄影测量学专业的学生来说无疑是一个不可或缺的好资料,希望对大家有所帮助!
  • 单幅影像空间后方交会 2020-05-27 23:33:26
    本代码是本人在VS2010下,用C++的对象思想写出的矩阵类,用于实现摄影测量中单幅影像后防交会的模块。模块是个完整的程序可以运行,重点在于矩阵类中各种操作方法的实现。.
  • 单片空间后方交会是利用三个不在一条直线的已知点计算相片外方位元素的方法。 获取已知数据,包括: x[]、y[]:改正后的控制点的像方坐标 X[]、Y[]、Z[]:控制点的物方坐标 f: 相机焦距 在空间后方交会中,通常...
  • 实验原理 **详细题目: ** 编程思想: 具体代码 我使用了MathNet.Numerics.dll矩阵库,功能强大,还可以求解病态矩阵 MathNet.Numerics.dll ...using MathNet.Numerics.LinearAlgebra...
  • 【摄影测量学空间后方交会作业】求解程序 #include <stdio.h> #include<cmath>#include<iostream.h>#include<fstream.h> int main(){ double NJZ(double sum[100][100],double l[10]...
  • 在学习摄影测量课程过程中,老师要求我们采用 C#语言编写程序实现 前方交会和后方交会数据梳理,绝对定向和相对定向处理以及光束法 。 经过一段时间努力 是顺利完成程序的编写。写完以后,一直存在电脑中没有理会。...
  • 航摄相片的外方位元素表示的是摄影摄影瞬间相片上的点对于地面上的点之间的关系的一些参数,在测绘工作中,如果求出了一张航拍相片的外方位元素,那么就可以根据像素点的坐标计算出对应的地面点的坐标,而这些解算...
1 2 3
收藏数 53
精华内容 21