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];/定义旋转矩阵Rdouble[,] 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);//a1R[0, 1] = -Math.Cos(phi) * Math.Sin(kappa) - Math.Sin(phi) * Math.Sin(omiga) * Math.Cos(kappa);//a2R[0, 2] = -Math.Sin(phi) * Math.Cos(omiga);//a3R[1, 0] = Math.Cos(omiga) * Math.Sin(kappa);//b1R[1, 1] = Math.Cos(omiga) * Math.Cos(kappa);//b2R[1, 2] = -Math.Sin(omiga);//b3R[2, 0] = Math.Sin(phi) * Math.Cos(kappa) + Math.Cos(phi) * Math.Sin(omiga) * Math.Sin(kappa);//c1R[2, 1] = -Math.Sin(phi) * Math.Sin(kappa) + Math.Cos(phi) * Math.Sin(omiga) * Math.Cos(kappa);//c2R[2, 2] = Math.Cos(phi) * Math.Cos(omiga);//c3for (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#简单实现摄影测量后方交会相关推荐

  1. 摄影测量-后方交会与前方交会,相对定向与绝对定向,光束法

    在学习摄影测量课程过程中,老师要求我们采用 C#语言编写程序实现 前方交会和后方交会数据梳理,绝对定向和相对定向处理以及光束法 . 经过一段时间努力 是顺利完成程序的编写.写完以后,一直存在电脑中没有 ...

  2. 基于matlab的摄影测量后方交会元素解算

    自己做的后方交会元素解算matlab源程序 废话不多说,直接上代码 代码的原始数据都已经直接赋值了,可以再写一点点代码读入excel或者txt // A code block %单幅影像后方交会 %a ...

  3. 摄影测量--后方交会

    转载自:https://blog.csdn.net/hanford/article/details/53665508 目 录 第1章 计算公式    1 1.1 计算公式一    1 1.1.1 角度 ...

  4. 摄影测量后方交会-前方交会(C#)

    双像解析摄影测量中的后交-前交解法,常用于已知像片的外方位元素.需确定少量待定点坐标的情况.解算过程分为两个阶段:后方交会.前方交会. 思路为利用后方交会计算外方位元素,利用前方交会解算待定地面点坐标 ...

  5. 用C#编写摄影测量后方交会求外方位元素

    程序源码程序源码下载地址 https://download.csdn.net/download/u011713916/11743497 实验原理 **详细题目: ** 编程思想: 具体代码 我使用了M ...

  6. 摄影测量--相对定向-绝对定向(C++实现)

    一. 目的 理解并掌握空间相对定向-原理. 体会相对定向-绝对定向与前后方交会的异同,理解各参数含义. 熟悉计算流程,并通过编程运用到实践上. 提高编程计算能力,并将算式转换为程序,体会编程计算的特点 ...

  7. 第一篇文献:谈大数据时代的云控制摄影测量 ——张祖勋院士

    提出背景:大数据时代的到来,通过无人机等手段获取到的摄影测量影像具有传统航测影像不具备的优势和缺点.优势主要是数据量大,获取到的周期短,时效性高.劣势是规范性弱,缺乏严格的航线规划.且大多为非量测型相 ...

  8. 影像测量—摄影测量和RTK原理

    影像测量-摄影测量和RTK原理 GNSS定位原理 GNSS定位的基本原理是根据高速运动的卫星瞬间位置作为已知的起算数据,采用空间距离后方交会的方法,确定待测点的位置.卫星发射测距信号和导航电文,其中导 ...

  9. 基于相关系数的影像匹配_智库丨陈晓勇:低空摄影测量立体影像匹配的现状与展望...

    ↑ 点击上方「中国测绘学会」 可快速关注我们 摘要: 影像匹配是在两幅或多幅具有重叠度的影像中通过特定的算法提取影像间同名点的过程,是低空摄影测量数据处理中最为关键的步骤,匹配质量与效率直接影响到后续 ...

  10. 摄像头线性矫正的c语言实现,摄影测量考试试题及详细答案

    1摄影测量学 2航向重叠 3单像空间后方交会 4相对行高 5像片纠正 6解析空中三角测量 7透视平面旋转定律 8外方位元素 9核面 10绝对定向元素 一.填空 1摄影测量的基本问题,就是将______ ...

最新文章

  1. java使用ireport生成报表_JasperReport(3)——Java简单使用IReport生成的文件建立报表...
  2. 求一个集合的所有子集 Python实现
  3. oracle查询用户的概要文件,Oracle用户、概要文件、权限及角色实例
  4. JVM插码之三:javaagent介绍及javassist介绍
  5. 二叉树的锯齿形层序遍历Python解法
  6. c++游戏代码坦克大作战_一红一蓝多种模式的双人小游戏:红蓝大作战
  7. 服务器机房 维护,服务器机房建设与管理维护.pdf
  8. Spring Cloud Netflix之Eureka上篇
  9. [转]知乎大神YaqiLYU关于tracking方向的2013-2016趋势总览!!!强烈推荐!!!
  10. IIS7中查看w3wp进程
  11. 温度传感器的类型原理特点和应用
  12. 实现div元素在整个屏幕的的垂直居中之translateY(-50%)的利用
  13. Excel百宝箱ET特别版
  14. 如何快速梳理领域文献
  15. Cisco RV340命令执行漏洞(CVE-2022-20707)及关联历史漏洞分析
  16. 2022第七届“数维杯”大学生数学建模夏令营
  17. 为什么餐厅老是没人光临?快试试全息投影餐厅
  18. CentOS7 能ping通网关不能上网
  19. 机器学习:朴素贝叶斯算法+中文情感分类+python
  20. 塔望3W消费战略产品案丨筷手小厨:筷手功夫饭的差异化致胜之道

热门文章

  1. 编写函数:字符串的小写转大写(Append Code)
  2. 【中间件】pika安装及性能测试
  3. 换个角度来看看C++中的左值、右值、左值引用、右值引用
  4. 科达制造和盐湖股份的事儿
  5. python中fact_python中fact函数是什么及如何使用?
  6. 小马激活工具出现Cannot open file k:\OEMSF 的解决方法
  7. c语言人名首字母大写,关于字符串:如何在C中大写名字和姓氏的首字母?
  8. matlab-梯形积分
  9. 码畜 码奴 码农 IT民工和IT其他工种的划分定义
  10. winrar打开导航已取消是什么原因