程序源码程序源码下载地址
https://download.csdn.net/download/u011713916/11743497
实验原理


**详细题目:
**
编程思想:

具体代码
我使用了MathNet.Numerics.dll矩阵库,功能强大,还可以求解病态矩阵

MathNet.Numerics.dll

完整源码:

System;
using System.Net.Http.Headers;
using System.Xml.Linq;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics.LinearAlgebra.Generic;//调用矩阵库namespace The_Rescetion
{class Program{static void Main(string[] args){//求单位权中误差函数double EeMartix  (double[,]B,double[]ll,double[]xx,int i,int j)//观测值数个数,J//求得未知数个数//B{double[] v=new double[i];//创造数组存储V;double q0=0;double Tmp = 0;//建立临时存储变量for (int l = 0; l < i; l++)//计算V=B*X—L{for (int m = 0; m < j; m++){Tmp = Tmp +B[l, m] * xx[m];}v[l] = Tmp-ll[l];Tmp = 0;}for (int l = 0; l < i; l++)//计算V*VT{Tmp += v[l] * v[l];}q0 = Math.Sqrt(Tmp / (2 * i - 6));//单位权中误差计算公式return q0;//返回中误差}void print( double[] a)//定义打印接口函数{for (int i = 0; i < a.Length; i++){Console.WriteLine(" {0}", a[i]);}}double Pinjun(double[] a)//此函数功能是取平均值{double tmp=0;for (int i = 1; i < a.Length; i++){tmp = tmp + a[i];}return (tmp / 4.0);}/*double[] x = new double[4];double[]y=new double[4];double[] X = new double[4];double[] Y = new double[4];double[] Z = new double[4];*/double[] x = new[] {-86.15, -53.40, -14.78, 10.46};double[] y = new []{-68.99,82.21 ,-76.63,64.43};double[] X = new[] { 36589.41,37631.08,39100.97,40426.54};double[] Y = new[] { 25273.32,31324.51,24934.98,30319.81};double[] Z = new[] {2195.17, 728.69, 2386.50, 757.31};double H = 6941.77;double f = 153.24;/*  Console.WriteLine("按列输入x");Fuzhi(x);Console.WriteLine("按列输入y");Fuzhi(y);Console.WriteLine("按列输入X");Fuzhi(X);Console.WriteLine("按列输入Y");Fuzhi(Y);Console.WriteLine("按列输入Z");Fuzhi(Z);Console.WriteLine("输入航高");double H = Convert.ToDouble(Console.ReadLine());Console.WriteLine("输入f");double f= Convert.ToDouble(Console.ReadLine());*/double Xstart=Pinjun(X) ;//赋予初值double Ystart =Pinjun(Y);double Zstart = H;//为航高double q=0, w=0, k = 0;//假设为垂直观测//double rad = Math.PI/360/60;double rad = 0.000000001;Console.WriteLine("X的初始值:{0}\nY的初始值:{1}\nZ的初始值:{2}\n",Xstart,Ystart,Zstart);////double a1, a2, a3, b1, b2, b3, c1, c2, c3;//R转角矩阵while (true)//迭代{a1 = Math.Cos(q) * Math.Cos(k) - Math.Sin(q) * Math.Sin(w) * Math.Sin(k);a2=-Math.Cos(q)*Math.Sin(k)- Math.Sin(q) * Math.Sin(w) * Math.Sin(k);a3 = -Math.Sin(q) * Math.Cos(w);b1 = Math.Cos(w) * Math.Sin(k);b2 = Math.Cos(w) * Math.Cos(k);b3 = -Math.Sin(w);c1=Math.Sin(q)*Math.Cos(k)+ Math.Cos(q) * Math.Sin(w) * Math.Sin(k);c2 = -Math.Sin(q) * Math.Sin(k) + Math.Cos(q) * Math.Sin(w) * Math.Cos(k);c3 = Math.Cos(q) * Math.Cos(w);//var R=new DenseMatrix(new [,]{{a1,a2,a3},{b1,b2,b3},{c1,c2,c3}});//打印旋转矩阵// Console.WriteLine("旋转矩阵R为:\n{0}",R);//求像点近似值double[] l1 = new double[4];double[] l2 = new double[4];double[] l3 = new double[4];double[] l4= new double[4];double[] l5 = new double[4];double [,]al=new double[8,6];double[] ll = new double[8];//////for (int i = 0; i < 4; i++){//求像点近似值l1[i] = a1 * (X[i] - Xstart) + b1 * (Y[i] - Ystart) + c1 * (Z[i] - Zstart);l2[i] = a2 * (X[i] - Xstart) + b2 * (Y[i] - Ystart) + c2 * (Z[i] - Zstart);l3[i] = a3 * (X[i] - Xstart) + b3 * (Y[i] - Ystart) + c3 * (Z[i] - Zstart);l4[i] = -f * l1[i] / l3[i];//x点的近似坐标l5[i] = -f * l2[i] / l3[i];//y点的近似坐标}for (int i = 0; i < 4; i++)//求系数矩阵A{al[2 * i ,0] = (a1 * f + a3 * (x[i])) / l3[i];//a11al[2 * i ,1] = (b1 * f + b3 * (x[i] )) / l3[i];//a12al[2 * i ,2] = (c1 * f + c3 * (x[i] )) / l3[i];//a13/*a14 */  al[2 * i,3] = (y[i]) * Math.Sin(w) - Math.Cos(w) * ((x[i] ) *( (x[i]) * Math.Cos(k) - (y[i] ) * Math.Sin(k)) / f + f * Math.Cos(k));/*a15 */al[2 * i ,4] = -f * Math.Sin(k) - (x[i] ) * ((x[i]) * Math.Sin(k) + (y[i] ) * Math.Cos(k)) / f;al[2 * i ,5] = (y[i] );//a16al[2 * i+1,0] = (a2 * f + a3 * (y[i] )) / l3[i];al[2 * i+1,1] = (b2 * f + b3 * (y[i] )) / l3[i];al[2 * i+1,2] = (c2 * f + c3 * (y[i] )) / l3[i];al[2 * i+1,3] = -(x[i] ) * Math.Sin(w) -  Math.Cos(w) * ((y[i] ) * ((x[i] ) * Math.Cos(k) - (y[i] ) * Math.Sin(k)) / f - f * Math.Sin(k));al[2 * i+1,4] = -f * Math.Cos(k) - (y[i] ) * ((x[i] ) * Math.Sin(k) + (y[i] ) * Math.Cos(k)) / f;al[2 * i+1,5] = -(x[i] );}for (int i = 0; i < 4; i++)//求x-x0的矩阵L{ll[2 * i] = x[i] - l4[i];ll[2 * i + 1] = y[i] - l5[i];}var aMatrix=new DenseMatrix(al);//创建矩阵Avar xmatrix =  aMatrix.Transpose()*aMatrix;//xmartix=At*Avar Xmatrix = xmatrix.Inverse() * aMatrix.Transpose();//Xmartix=(At*A)'*Atdouble[,]XXtmp=new double[6,8];XXtmp = Xmatrix.ToArray();//矩阵转化为二维数组double[]XXfinally=new double[6];//(At*A)'*At*L最终得出X的变化率double tmp = 0;for (int i = 0; i < 6; i++){for (int j = 0; j < 8; j++){tmp = tmp + XXtmp[i, j] * ll[j];}XXfinally[i] = tmp;tmp = 0;}//重新校正初值Xstart+= XXfinally[0];Ystart+= XXfinally[1];Zstart += XXfinally[2];q += XXfinally[3];w += XXfinally[4];k += XXfinally[5];double[] newtest = new[] { Xstart, Ystart, Zstart, q, w, k };//将新的初值存入数组if(XXfinally[3] <=rad && XXfinally[4] <= rad && XXfinally[5] <= rad)//迭代判断条件{Console.WriteLine("X,Y,Z,Q,W,k为:\n[");print(newtest);//输出最后的X矩阵Console.WriteLine("]");Console.WriteLine("解为:\nXs={0}\nYs={1}\nZs={2}\n",newtest[0], newtest[1], newtest[2]);Console.WriteLine("旋转矩阵R为:\n{0}", R);Console.WriteLine("精度评定求得中误差为:");Console.WriteLine(EeMartix(al, ll, XXfinally, 8, 6));  break;}}Console.ReadKey();}
}
}

此代码可以修改为类直接调用,直接赋予初值数组属性即可。
支持原创,转载必须说明
——By shiZwen 2019.9.10

用C#编写摄影测量后方交会求外方位元素相关推荐

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

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

  2. 摄影测量外方位元素代码

    航摄相片的外方位元素表示的是摄影摄影瞬间相片上的点对于地面上的点之间的关系的一些参数,在测绘工作中,如果求出了一张航拍相片的外方位元素,那么就可以根据像素点的坐标计算出对应的地面点的坐标,而这些解算过 ...

  3. Matlab解算空间后方交会外方位元素

    目录 1 问题描述 2 实现部分 参考文献   本问题为武汉大学摄影测量学教材课后习题,现在用MATLAB实现,供大家学习参考. 1 问题描述   已知摄像机主距f=153.24mm,四对点的像点坐标 ...

  4. 空间前方交会(利用相机外方位元素和像点坐标进行解算)

    目录 一.前言 二.空间前方交会 1. 前方交会的概念 2. 基本公式 三.代码展示 四.小结 一.前言   在摄影测量过程中,得到相机的外方位元素以及地面控制点对应的像点坐标之后,如何解算地面控制点 ...

  5. 航飞原始影像外方位元素_【技术】无人机倾斜摄影建模技术在虚拟现实中的应用...

    (如有侵权,请联系删除) 摘 要 针对于虚拟现实平台中构建三维场景的费时费力问题,基于无人机倾斜摄影建模技术构建三维模型,利用 3DS Max 建模软件进行模型优化,并结合 Unity 3D 引擎构建 ...

  6. 外参矩阵(旋转矩阵+平移向量)以及外方位元素的关系

    外参包括旋转矩阵R3×3.平移向量T3×1,它们共同描述了如何把点从世界坐标系转换到摄像机坐标系,旋转矩阵描述了世界坐标系的坐标轴相对于摄像机坐标轴的方向, 平移向量描述了在摄像机坐标系下空间原点的位 ...

  7. 航飞原始影像外方位元素_影响无人机航测精度的因素都有哪些?

    ‍[摘要]本文通过对1∶500 无人机航测法成图过程中误差产生的来源进行分析,研究‍提高成图精度的关键技术,经过试验建立1∶500 无人机航测法高精度成图技术路线和工艺流程,并给出实际生产项目中的具体 ...

  8. 立体像对空间前方交会(利用外方位元素交会出地面点三维坐标)

    要通过外方位元素进行前方交会首先需要的已知量有: 然后计算左右片在地辅坐标系中旋转矩阵的方向余弦 再计算基线分量 计算像点的像空间辅助坐标 计算投影系数 计算地面点的左像辅系坐标 计算地面点的地面坐标 ...

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

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

最新文章

  1. 精度 vs 效率:模型越小,精度就一定越低吗?
  2. 北欧小国的宏大AI实验:让1%的人口接受人工智能培训
  3. UNITY2018开启deepprofiling
  4. [LeetCode] 461. Hamming Distance
  5. Leecode06. Z 字形变换——Leecode大厂热题100道系列
  6. 2018qs计算机科学专业,2018QS世界大学计算机科学专业排名.docx
  7. Redis这么快你知道吗?
  8. java swing jcheckbox_Swing JCheckBox类
  9. 深入理解css之float
  10. DNS解释问题:java.net.UnknownHostException
  11. Python入门-traceback
  12. php中strrpos函数的返回值类型是型_PHP字符串处理的一些常用函数 - strrpos
  13. 开发Linux应用程序的三种方法
  14. parted 对nvme盘进行分区
  15. “金三银四” 是找工作的最佳时期吗?
  16. F28335 PWM触发ADC采样 代码+注释
  17. 论文阅读笔记(4)——《Language Generation with Multi-Hop Reasoning on Commonsense Knowledge Graph》
  18. 蓝牙键盘连接——输入pin码
  19. 2021了,前端,移动开发,后端,我该选哪个?
  20. 智慧大田——智能无线灌溉系统

热门文章

  1. 首发|Forrester云原生开发者洞察白皮书,低代码概念缔造者又提出新的开发范式
  2. 眼球经济下,如何使用公关做好整合营销?
  3. 电脑黑屏案例入手分析解决显卡常见故障
  4. Ubuntu 安装 dhcp-server
  5. android进度条竖条,音频(audio)自定义样式以及控制操作面板
  6. 零基础学3D游戏建模需要多久?
  7. 双非本科没有项目经历,如何进入BATJ等一线公司?
  8. 6 如何写一个简单地标签
  9. 直播源码开发,Android 屏蔽返回键(后退键)
  10. Python获取秒级时间戳与毫秒级时间戳的方法