单像空间后方交会程序报告
摄影测量学单像空间后方交会编程实习报告(精品资料).doc

【最新整理,下载后即可编辑】摄影测量学单像空间后方交会编程实习报告班级:130x姓名:xx学号:2013302590xxx指导老师:李欣一、实习目的通过对提供的数据进行计算,输出像片的外方位元素并评定精度。
深入理解单像空间后方交会的思想,体会在有多余观测情况下,用最小二乘平差方法编程实现解求影像外方位元素的过程。
通过尝试编程实现加强编程处理问题的能力和对实习内容的理解,通过对实验结果的分析,增强综合运用所学知识解决实际问题的能力。
了解摄影测量平差的基本过程,掌握空间后方交会的定义和实现算法。
二、实习内容根据学习的单像空间后方交会的知识,用程序设计语言(C++或C语言)编写一个完整的单像空间后方交会程序,通过对提供的数据进行计算,输出像片的外方位元素并评定精度。
三、实习数据已知航摄仪的内方位元素:fk =153.24mm,x=y=0,摄影比例尺为1:15000;4个地面控制点的地面坐标及其对应像点的像片坐标:四、实习原理如果我们知道每幅影像的6个外方位元素,就能确定被摄物体与航摄影像的关系。
因此,如何获取影像的外方位元素,一直是摄影测量工作者所探讨的问题。
可采取的方法有:利用雷达、全球定位系统(GPS)、惯性导航系统(INS)以及星相摄影机来获取影像的外方位元素;也可以利用影像覆盖范围内一定数量的控制点的空间坐标与摄影坐标,根据共线条件方程,反求该影像的外方位元素,这种方法称为单幅影像的空间后方交会。
单像空间后方交会的基本思想是:以单幅影像为基础,从该影像所覆盖地面范围内若干控制点的已知地面坐标和相应点的像坐标量测值出发,根据共线条件方程,解求该影像在航空摄影时刻的外方位元素Xs,Ys,Zs,ϕ,ω,κ。
五、 实习流程1. 获取已知数据。
从摄影资料中查取影像比例尺1/m ,平均摄影距离(航空摄影的航高、内方位元素x 0,y 0,f ;获取控制点的空间坐标X t ,Y t ,Z t 。
2. 量测控制点的像点坐标并进行必要的影像坐标系统误差改正,得到像点坐标。
单像空间后方交会实习报告

单像空间后方交会实习报告一、实习目的单像空间后方交会是摄影测量中确定像片外方位元素的重要方法。
通过本次实习,旨在深入理解单像空间后方交会的基本原理和计算过程,熟练掌握相关软件的操作,提高对摄影测量数据处理的实践能力,并培养解决实际问题的思维和方法。
二、实习原理单像空间后方交会的目的是利用像片上的像点坐标以及相应的地面控制点坐标,通过数学模型求解像片的外方位元素(三个线元素 Xs、Ys、Zs 和三个角元素φ、ω、κ)。
其基本原理基于共线条件方程,即摄影中心、像点和相应的地面点位于同一条直线上。
共线条件方程可以表示为:\\begin{align}x x_0&= f\frac{a_1(X X_s) + b_1(Y Y_s) + c_1(Z Z_s)}{a_3(X X_s) + b_3(Y Y_s) + c_3(Z Z_s)}\\y y_0&= f\frac{a_2(X X_s) + b_2(Y Y_s) + c_2(Z Z_s)}{a_3(X X_s) + b_3(Y Y_s) + c_3(Z Z_s)}\end{align}\其中,\((x,y)\)为像点坐标,\((x_0,y_0)\)为主点坐标,\(f\)为摄影机焦距,\((X,Y,Z)\)为地面点的物方空间坐标,\((X_s,Y_s,Z_s)\)为摄影中心的物方空间坐标,\((a_1,b_1,c_1),(a_2,b_2,c_2),(a_3,b_3,c_3)\)为由角元素φ、ω、κ 构成的旋转矩阵的元素。
三、实习数据本次实习使用了一组航空像片,像片比例尺为 1:5000,焦距为152mm,像主点坐标为\((x_0,y_0)=(5000mm,5000mm)\)。
同时,提供了 6 个均匀分布在像片范围内的地面控制点的物方空间坐标和像点坐标。
四、实习步骤1、数据准备整理地面控制点的物方空间坐标和像点坐标,确保数据的准确性。
输入像片的基本参数,如像主点坐标、焦距等。
单像空间后方交会实习报告

单像空间后方交会实习报告摘要本报告旨在总结并评估笔者在单像空间后方交会实习中的经验和收获。
首先,报告介绍了单像空间后方交会实习的目的和背景。
接着,报告详细描述了实习期间所进行的实验和操作步骤。
在实习过程中,笔者遇到了一些挑战,但通过团队合作和专业指导取得了成功。
最后,报告总结了实习对于个人职业发展的重要性,并提出了改进实习体验的建议。
1. 引言单像空间后方交会是测量和分析地球或其他星球上的点的空间坐标的方法之一。
该方法通过将来自不同位置的图像投影到一个共同的平面上,并在该平面上对图像进行测量和分析,以确定点的坐标。
本实习旨在将现实生活中的实地测量和图像处理技术相结合,通过实际操作了解和掌握单像空间后方交会的原理和应用。
2. 实习过程本次实习分为三个步骤:图像获取、图像处理和空间坐标计算。
2.1 图像获取首先,为了进行后续的图像处理和分析,我们需要获取一组具有不同视角的图像。
为了实现这个目标,我们选择了一片公共景区进行实地测量。
在测量过程中,我们使用了专业的测量设备和相机,并按照一定的间隔和角度拍摄了一组图像。
这些图像将被用于后续的图像处理和分析。
2.2 图像处理在图像处理阶段,我们使用了专业的图像处理软件对获取到的图像进行处理。
首先,我们使用了相机标定算法对相机内外参数进行校准,以保证后续测量的精度和准确度。
然后,我们对每张图像进行了特征点提取和匹配,以建立图像之间的对应关系。
最后,根据所获得的对应关系,我们重建了图像场景的三维模型,并将其用于后续的空间坐标计算。
2.3 空间坐标计算在空间坐标计算阶段,我们使用了单像空间后方交会的原理,计算了每个图像特征点的空间坐标。
首先,我们将图像场景的三维模型与图像上的特征点进行对应,以确定特征点在三维空间中的位置。
然后,我们利用三角测量原理计算出特征点的三维坐标。
最后,通过对所有图像特征点的计算,我们可以得到目标点的空间坐标。
3. 实习挑战与解决在实习过程中,我们遇到了一些挑战,如图像质量、算法调优和测量误差等。
单像空间后方交会实习报告

单像空间后方交会实习报告本文是一份单像空间后方交会实习报告,旨在总结和分享本人在这个领域进行实习的经验和所得。
一、实习背景和目的在开始正文之前,首先介绍一下实习的背景和目的。
本次实习是为了深入了解单像空间后方交会的原理和应用,并提升我的实践能力。
通过与团队合作,完成一系列的实习任务和项目,我期望能够在这个领域不断成长和进步。
二、实习内容和方法2.1 实习内容本次实习主要涉及单像空间后方交会的方法和技术。
我通过参与实际项目,了解和学习了从数据采集到数据处理的整个流程,并深入研究了相关的算法和工具。
2.2 实习方法为了能够全面了解单像空间后方交会的知识和技术,我采用了多种实习方法。
首先,我积极参与了团队的讨论和会议,与同事们交流和分享我们的学习和经验。
其次,我通过独立完成一些小型项目和任务,提升了自己的实践能力。
此外,我还阅读了大量的相关文献和资料,深入研究了该领域的理论知识。
三、实习成果和收获3.1 实习成果在实习期间,我完成了几个实践项目任务,并取得了一些成果。
首先,我成功实现了单像空间后方交会的基本原理和方法,并在实际项目中应用。
其次,我编写了一份详尽的实习报告,总结了整个实习过程和所得的经验。
3.2 实习收获通过这次实习,我获得了很多宝贵的经验和收获。
首先,我深入了解并掌握了单像空间后方交会的原理和方法,提升了自己的实践能力。
其次,我学会了如何与团队合作,并通过与他人的交流和合作进一步提升自己。
此外,我还学会了如何独立思考和解决问题,在实践中培养了自己的创新思维能力。
四、实习感悟和建议4.1 实习感悟通过实习,我深刻体会到了理论与实践的结合的重要性。
只有将所学的理论知识应用到实践项目中,才能真正理解和掌握。
在实践中遇到各种困难和挑战,我也学会了如何从失败中总结经验,再次进行尝试。
4.2 实习建议对于即将进行单像空间后方交会实习的同学们,我有几点建议。
首先,要注重理论知识的学习和积累,打好基础。
编写单片空间后方交会程序实习一

实验一 编写单片空间后方交会程序
一、实验目的
用程序设计语言(Visual C++或者C 语言、matlab 语言)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并评定精度。
本实验的目的在于让学生深入理解单片空间后方交会的原理,体会在有多余观测情况下,用最小二乘平差方法编程实现解求影像外方位元素的过程。
通过上机调试程序加强动手能力的培养,通过对实验结果的分析,增强学生综合运用所学知识解决实际问题的能力。
二、实验内容与要求
利用一定数量的地面控制点,根据共线条件方程求解像片外方位元素。
三、实验原理
根据摄影过程的几何反转原理。
四、实验数据准备
﹡ 已知航摄仪的内方位元素0,24.15300===y x mm f (摄影比例尺为1:50000); ﹡ 4个地面控制点的地面坐标及其对应像点的像片坐标:
1.每人必须独立上机操作;
2.实验前认真复习单片空间后方交会的有关内容。
六、实验报告
原理、实验步骤及程序框图
上机调试程序并打印结果。
后方交会MATLAB程序实习报告

《摄 影 测 量 学》单像空间后方交会实习报告班 级: XXXX姓 名: X X X学 号:XXXXXXXXXXXXX指导教师: X X X一、实习目的1、掌握空间后方交会的定义和实现算法;2、了解摄影测量平差的基本过程;3、熟练MATLAB 等程序编写。
二、实习原理利用至少三个已知地面控制点的坐标),,(A A A Z Y X A 、),,(B B B Z Y X B 、),,(C C C Z Y X C ,与其影像上对应的三个像点的影像坐标),(a a y x a 、),(b b y x b 、),(c c y x c ,根据共线方程,反求该像片的外方位元素κωϕ、、、、、S S S Z Y X 。
共线条件方程式:将共线式线性化并取一次小值项得:三、解算过程①获取已知数据。
包括影像比例尺1/m,平均摄影距离(航空摄影的航高)H,内方位元素x0、y0、f,控制点的空间坐标X、Y、Z。
②量测控制点的像点坐标并进行必要的影像坐标系统误差改正,得到像点坐标。
③确定未知数的初始值。
单像空间后方交会必须给出待定参数的初始值,在竖直航空摄影且地面控制点大体对称分布的情况下,Xs0和Ys0为均值,Zs0为航高,φ、ω、κ的初值都设为0。
或者κ的初值可在航迹图上找出或根据控制点坐标通过坐标正反变换求出。
④计算旋转矩阵R。
利用角元素近似值计算方向余弦值,组成R阵。
⑤逐点计算像点坐标的近似值。
利用未知数的近似值按共线条件式计算控制点像点坐标的近似值(x),(y)。
⑥逐点计算误差方程式的系数和常数项,组成误差方程式。
⑦计算法方程的系数矩阵ATA与常数项ATL,组成法方程式。
⑧解求外方位元素。
根据法方程,解求外方位元素改正数,并与相应的近似值求和,得到外方位元素新的近似值。
⑨检查计算是否收敛。
将所求得的外方位元素的改正数与规定的限差比较,通常对φ,ω,κ的改正数△φ,△ω,△κ给予限差,通常为0.000001弧度,当3个改正数均小于0.000001弧度时,迭代结束。
摄影测量学空间后方交会实验报告

摄影测量学实验报告实验一、单像空间后方交会学院:建测学院班级:测绘082姓名:肖澎学号: 15一.实验目的1.深入了解单像空间后方交会的计算过程;2.加强空间后方交会基本公式和误差方程式,法线方程式的记忆;3.通过上机调试程序加强动手能力的培养。
二.实验原理以单幅影像为基础,从该影像所覆盖地面范围内若干控制点和相应点的像坐标量测值出发,根据共线条件方程,求解该影像在航空摄影时刻的相片外方位元素。
三.实验内容1.程序图框图2.实验数据(1)已知航摄仪内方位元素f=153.24mm,Xo=Yo=0。
限差0.1秒(2)已知4对点的影像坐标和地面坐标:3.实验程序using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication3{class Program{static void Main(){//输入比例尺,主距,参与平参点的个数Console.WriteLine("请输入比例尺分母m:\r");string m1 = Console.ReadLine();double m = (double)Convert.ToSingle(m1);Console.WriteLine("请输入主距f:\r");string f1 = Console.ReadLine();double f = (double)Convert.ToSingle(f1);Console.WriteLine("请输入参与平差控制点的个数n:\r");string n1 = Console.ReadLine();int n = (int)Convert.ToSingle(n1);//像点坐标的输入代码double[] arr1 = new double[2 * n];//1.像点x坐标的输入for (int i = 0; i < n; i++){Console.WriteLine("请输入已进行系统误差改正的像点坐标的x{0}值:\r", i+1);string u = Console.ReadLine();for (int j = 0; j < n; j += 2){arr1[j] = (double)Convert.ToSingle(u);}}//2.像点y坐标的输入for (int i = 0; i < n; i++){Console.WriteLine("请输入已进行系统误差改正的像点坐标的y{0}值:\r", i+1);string v = Console.ReadLine();for (int j = 1; j < n; j += 2){arr1[j] = (double)Convert.ToSingle(v);}}//控制点的坐标输入代码double[,] arr2 = new double[n, 3];//1.控制点X坐标的输入for (int j = 0; j < n; j++){Console.WriteLine("请输入控制点在地面摄影测量坐标系的坐标的X{0}值:\r", j+1);string u = Console.ReadLine();arr2[j , 0] = (double)Convert.ToSingle(u);}//2.控制点Y坐标的输入for (int k = 0; k < n; k++){Console.WriteLine("请输入控制点在地面摄影测量坐标系的坐标的Y{0}值:\r", k+1);string v = Console.ReadLine();arr2[k , 1] = (double)Convert.ToSingle(v);}//3.控制点Z坐标的输入for (int p =0; p < n; p++){Console.WriteLine("请输入控制点在地面摄影测量坐标系的坐标的Z{0}值:\r", p+1);string w = Console.ReadLine();arr2[p , 2] = (double)Convert.ToSingle(w);}//确定外方位元素的初始值//1.确定Xs的初始值:double Xs0 = 0;double sumx = 0;for (int j = 0; j < n; j++){double h = arr2[j, 0];sumx += h;}Xs0 = sumx / n;//2.确定Ys的初始值:double Ys0 = 0;double sumy = 0;for (int j = 0; j < n; j++){double h = arr2[j, 1];sumy += h;}Ys0 = sumy / n;//3.确定Zs的初始值:double Zs0 = 0;double sumz = 0;for (int j = 0; j <= n - 1; j++){double h = arr2[j, 2];sumz += h;}Zs0 = sumz / n;doubleΦ0 = 0;doubleΨ0 = 0;double K0 = 0;Console.WriteLine("Xs0,Ys0,Zs0,Φ0,Ψ0,K0的值分别是:{0},{1},{2},{3},{4},{5}", Xs0, Ys0, Zs0, 0, 0, 0);//用三个角元素的初始值按(3-4-5)计算各方向余弦值,组成旋转矩阵,此时的旋转矩阵为单位矩阵I:double[,] arr3 = new double[3, 3];for (int i = 0; i < 3; i++)arr3[i, i] = 1;}double a1 = arr3[0, 0]; double a2 = arr3[0, 1]; double a3 = arr3[0, 2];double b1 = arr3[1, 0]; double b2 = arr3[1, 1]; double b3 = arr3[1, 2];double c1 = arr3[2, 0]; double c2 = arr3[2, 1]; double c3 = arr3[2, 2];/*利用线元素的初始值和控制点的地面坐标,代入共线方程(3-5-2),* 逐点计算像点坐标的近似值*///1.定义存放像点近似值的数组double[] arr4 = new double[2 * n];//----------近似值矩阵//2.逐点像点坐标计算近似值//a.计算像点的x坐标近似值(x)for (int i = 0; i < 2 * n; i += 2){for (int j = 0; j < n; j++){arr4[i] = -f * (a1 * (arr2[j, 0] - Xs0) + b1 * (arr2[j, 1] - Ys0) + c1 * (arr2[j, 2] - Zs0)) / (a3 * (arr2[j, 0] - Xs0) + b3 * (arr2[j, 1] - Ys0) + c3 * (arr2[j, 2] - Zs0)); }}//b.计算像点的y坐标近似值(y)for (int i = 1; i < 2 * n; i += 2){for (int j = 0; j < n; j++){arr4[i] = -f * (a2 * (arr2[j, 0] - Xs0) + b2 * (arr2[j, 1] - Ys0) + c2 * (arr2[j, 2] - Zs0)) / (a3 * (arr2[j, 0] - Xs0) + b3 * (arr2[j, 1] - Ys0) + c3 * (arr2[j, 2] - Zs0)); }}//逐点计算误差方程式的系数和常数项,组成误差方程:double[,] arr5 = new double[2 * n, 6]; //------------系数矩阵(A)//1.计算dXs的系数for (int i = 0; i < 2 * n; i += 2){arr5[i, 0] = -1 / m; //-f/H == -1/m}//2.计算dYs的系数for (int i = 1; i < 2 * n; i += 2){arr5[i, 1] = -1 / m; //-f/H == -1/m}//3.a.计算误差方程式Vx中dZs的系数for (int i = 0; i < 2 * n; i += 2)arr5[i, 2] = -arr1[i] / m * f;}//3.b.计算误差方程式Vy中dZs的系数for (int i = 1; i < 2 * n; i += 2){arr5[i, 2] = -arr1[i] / m * f;}//4.a.计算误差方程式Vx中dΦ的系数for (int i = 0; i < 2 * n; i += 2){arr5[i, 3] = -f * (1 + arr1[i] * arr1[i] / f * f);}//4.a.计算误差方程式Vy中dΦ的系数for (int i = 1; i < 2 * n; i += 2){arr5[i, 3] = -arr1[i - 1] * arr1[i] / f;}//5.a.计算误差方程式Vx中dΨ的系数for (int i = 0; i < 2 * n; i += 2){arr5[i, 4] = -arr1[i] * arr1[i + 1] / f;}//5.b.计算误差方程式Vy中dΨ的系数for (int i = 1; i < 2 * n; i += 2){arr5[i, 4] = -f * (1 + arr1[i] * arr1[i] / f * f);}//6.a.计算误差方程式Vx中dk的系数for (int i = 0; i < 2 * n; i += 2){arr5[i, 5] = arr1[i + 1];}//6.b.计算误差方程式Vy中dk的系数for (int i = 1; i < 2 * n; i += 2){arr5[i, 5] = -arr1[i - 1];}//定义外方位元素组成的数组double[] arr6 = new double[6];//--------------------外方位元素改正数矩阵(X)//定义常数项元素组成的数组double[] arr7 = new double[2 * n];//-----------------常数矩阵(L)//计算lx的值for (int i = 0; i < 2 * n; i += 2)arr7[i] = arr1[i] - arr4[i]; //将近似值矩阵的元素代入}//计算ly的值for (int i = 1; i <= 2 * (n - 1); i += 2){arr7[i] = arr1[i] - arr4[i]; //将近似值矩阵的元素代入}/* 对于所有像点的坐标观测值,一般认为是等精度量测,所以权阵P为单位阵.所以X=(ATA)-1ATL *///1.计算ATdouble[,] arr5T = new double[6, 2 * n];for (int i = 0; i < 6; i++){for (int j = 0; j < 2 * n; j++){arr5T[i, j] = arr5[j, i];}}//A的转置与A的乘积,存放在arr5AA中double[,] arr5AA = new double[6, 6];for (int i = 0; i < 6; i++){for (int j = 0; j < 6; j++){arr5AA[i, j] = 0;for (int l = 0; l < 2 * n; l++){arr5AA[i, j] += arr5T[i, l] * arr5[l, j];}}}nijuzhen(arr5AA);//arr5AA经过求逆后变成原矩阵的逆矩阵//arr5AA * arr5T存在arr5AARATdouble[,] arr5AARAT = new double[6, 2 * n];for (int i = 0; i < 6; i++){for (int j = 0; j < 2 * n; j++){arr5AARAT[i, j] = 0;for (int p = 0; p < 6; p++){arr5AARAT[i, j] += arr5AA[i, p] * arr5T[p, j];}}}//计算arr5AARAT x L,存在arrX中double[] arrX = new double[6];for (int i = 0; i < 6; i++){for (int j = 0; j < 1; j++){arrX[i] = 0;for (int vv = 0; vv < 6; vv++){arrX[i] += arr5AARAT[i, vv] * arr7[vv];}}}//计算外方位元素值double Xs, Ys, Zs, Φ, Ψ, K;Xs = Xs0 + arrX[0];Ys = Ys0 + arrX[1];Zs = Zs0 + arrX[2];Φ = Φ0 + arrX[3];Ψ = Ψ0 + arrX[4];K = K0 + arrX[5];for (int i = 0; i <= 2; i++){Xs += arrX[0];Ys += arrX[1];Zs += arrX[2];Φ += arrX[3];Ψ += arrX[4];K += arrX[5];}Console.WriteLine("Xs,Ys,Zs,Φ,Ψ,K的值分别是:{0},{1},{2},{3},{4},{5}", Xs0, Ys0, Zs0, Φ, Ψ, K);Console.Read();}//求arr5AA的逆矩public static double[,] nijuzhen(double[,] a) {double[,] B = new double[6, 6];int i, j, k;int row = 0;int col = 0;double max, temp;int[] p = new int[6];for (i = 0; i < 6; i++){p[i] = i;B[i, i] = 1;}for (k = 0; k < 6; k++){//找主元max = 0; row = col = i;for (i = k; i < 6; i++){for (j = k; j < 6; j++){temp = Math.Abs(a[i, j]);if (max < temp){max = temp;row = i;col = j;}}}//交换行列,将主元调整到k行k列上if (row != k){for (j = 0; j < 6; j++){temp = a[row, j];a[row, j] = a[k, j];a[k, j] = temp;temp = B[row, j];B[row, j] = B[k, j];B[k, j] = temp;i = p[row]; p[row] = p[k]; p[k] = i; }if (col != k){for (i = 0; i < 6; i++){temp = a[i, col];a[i, col] = a[i, k];a[i, k] = temp;}}//处理for (j = k + 1; j < 6; j++){a[k, j] /= a[k, k];}for (j = 0; j < 6; j++){B[k, j] /= a[k, k];a[k, k] = 1;}for (j = k + 1; j < 6; j++){for (i = 0; j < k; i++){a[i, j] -= a[i, k] * a[k, j];}for (i = k + 1; i < 6; i++){a[i, j] -= a[i, k] * a[k, j];}}for (j = 0; j < 6; j++){for (i = 0; i < k; i++){B[i, j] -= a[i, k] * B[k, j];}for (i = k + 1; i < 6; i++){B[i, j] -= a[i, k] * B[k, j];}for (i = 0; i < 6; i++) {a[i, k] = 0;a[k, k] = 1;}}//恢复行列次序for (j = 0; j < 6; j++){for (i = 0; i < 6; i++) {a[p[i], j] = B[i, j]; }}for (i = 0; i < 6; i++){for (j = 0; j < 6; j++) {a[i, j] = a[i, j];}}return a;}4.实验结果四.实验总结此次实验让我深入了解单像空间后方交会的计算过程,加强了对空间后方交会基本公式和误差方程式,法线方程式的记忆。
摄影测量学单像空间后方交会编程实习报告

摄影测量学单像空间后方交会编程实习报告本次实习中,我使用编程语言进行了单像空间后方交会的实现,并取得了一定的成果。
首先,我了解了单像空间后方交会的基本原理。
根据光线在透镜上的成像规律,可以推导出物体点在像平面上的坐标与图像点在像平面上的坐标之间的关系式。
通过已知的摄像机内外方位元素和图像点坐标,可以反求得物体点的坐标。
在程序编写过程中,我采用了Python编程语言。
首先,我定义了一个类,用于存储摄像机的内外方位元素和图像点坐标。
然后,我编写了一个函数,用于计算物体点的坐标。
该函数根据已知的内外方位元素和图像点坐标,使用逆向投影的方式反求物体点的坐标。
最后,我编写了一个主函数,通过读取输入文件中的数据,调用计算函数,并将结果保存到输出文件中。
在实现的过程中,我遇到了一些问题。
首先,由于摄像机的内外方位元素需要提前获取,因此我通过测量方法获得了实际的内外方位元素。
然而,测量的过程中存在一定的误差,因此在计算物体点坐标时可能存在一定的误差。
其次,图像坐标与物体点坐标之间的关系式中存在一些参数,如焦距、主点坐标等,这些参数也需要提前获取。
在程序中,我将这些参数作为输入参数,通过外部文件进行输入。
在实习的过程中,我充分运用了自己所学的摄影测量学知识,并将其与编程技能相结合。
在实现过程中,我遇到了一些难题,但通过查阅资料和与老师的讨论,最终得以解决。
通过编程实习,我深入理解了单像空间后方交会的原理,并通过实际操作提高了自己的计算能力。
总的来说,本次实习使我对摄影测量学有了更深入的认识,也提升了我的计算和编程能力。
通过此次实习,我对摄影测量学的兴趣更加浓厚,也更加期待在今后的学习和研究中能够进一步深入探索。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单像空间后方交会程序报告指导老师:刘老师班级:测绘101姓名:尚锋学号: 19号1、应用程序的主入口部分的代码:using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;namespace单像空间后方交会{static class Program{///<summary>///应用程序的主入口点。
///</summary>[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form1());}}}2、方法解算类(通用)部分的代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace单像空间后方交会{class Tongyong{struct image_point//一个像点结构,包含像点坐标和地面点坐标 {public double x;public double y;public double X;public double Y;public double Z;}private double f; //主距private double u; //u为外方位元素,下面5个相同private double w;private double k;private double Xs;private double Ys;private double Zs;private image_point[] p = new image_point[4]; //四个控制点private double[] R = new double[9]; //旋转矩阵private double[] a = new double[8]; //像点坐标近似值private double[,] A = new double[8, 6]; //误差方程式系数private double[] L = new double[8]; //误差方程式常数项private int count = 0; //统计代次数public Tongyong(double g, double[] q) //构造函数,初始化各变量,单位m{f = g;for (int i = 0; i < 4; i++){int j = i * 5;p[i].x = q[j];p[i].y = q[j + 1];p[i].X = q[j + 2];p[i].Y = q[j + 3];p[i].Z = q[j + 4];}double ave = 0, sum = 0; //求比例尺分母for (int i = 0; i < 3; i++){for (int j = i + 1; j < 4; j++){sum += Math.Sqrt(Math.Pow(p[i].X - p[j].X, 2) + Math.Pow(p[i].Y - p[j].Y, 2)) / Math.Sqrt(Math.Pow(p[i].x - p[j].x, 2) + Math.Pow(p[i].y - p[j].y, 2));}}ave = sum / 6;u = 0; //给定外方位元素的初始值,角度均设置为0w = 0;k = 0;Xs = (p[0].X + p[1].X + p[2].X + p[3].X) / 4; //Xs为四个控制点X的平均值,Ys类似Ys = (p[0].Y + p[1].Y + p[2].Y + p[3].Y) / 4;Zs = (p[0].Z + p[1].Z + p[2].Z + p[3].Z) / 4 + ave * f; }private double sin(double m) //正弦,为简化而写,下同{return Math.Sin(m);}private double cos(double m){return Math.Cos(m);}private void calcos() //计算旋转矩阵{R[0] = cos(u) * cos(k) - sin(u) * sin(w) * sin(k);R[1] = -cos(u) * sin(k) - sin(u) * sin(w) * cos(k);R[2] = -sin(u) * cos(w);R[3] = cos(w) * sin(k);R[4] = cos(w) * cos(k);R[5] = -sin(w);R[6] = sin(u) * cos(k) + cos(u) * sin(w) * sin(k);R[7] = cos(u) * sin(w) * cos(k) - sin(u) * sin(k);R[8] = cos(u) * cos(w);}private void calabout() //像点坐标的近似值{int i;for (i = 0; i < 4; i++){a[2 * i] = -f * (R[0] * (p[i].X - Xs) + R[3] * (p[i].Y - Ys) + R[6] * (p[i].Z - Zs)) / (R[2] * (p[i].X - Xs) + R[5] * (p[i].Y - Ys) + R[8] * (p[i].Z - Zs));a[2 * i + 1] = -f * (R[1] * (p[i].X - Xs) + R[4] * (p[i].Y - Ys) + R[7] * (p[i].Z - Zs)) / (R[2] * (p[i].X - Xs) + R[5] * (p[i].Y - Ys) + R[8] * (p[i].Z - Zs));}}private void calxx() //误差方程式的系数和常数项{int i;for (i = 0; i < 4; i++) //系数{double z = R[2] * (p[i].X - Xs) + R[5] * (p[i].Y - Ys) + R[8] * (p[i].Z - Zs);int n = i * 2;A[n, 0] = (R[0] * f + R[2] * p[i].x) / z;A[n, 1] = (R[3] * f + R[5] * p[i].x) / z;A[n, 2] = (R[6] * f + R[8] * p[i].x) / z;A[n, 3] = p[i].y * sin(w) - f * cos(w) * cos(k) - p[i].x / f * (p[i].x * cos(w) * cos(k) - p[i].y * cos(w) * sin(k));A[n, 4] = -f * sin(k) - p[i].x / f * (p[i].x * sin(k) + p[i].y * cos(k));A[n, 5] = p[i].y;A[n + 1, 0] = (R[1] * f + R[2] * p[i].y) / z;A[n + 1, 1] = (R[4] * f + R[5] * p[i].y) / z;A[n + 1, 2] = (R[7] * f + R[8] * p[i].y) / z;A[n + 1, 3] = -p[i].x * sin(w) + f * cos(w) * sin(k) - p[i].x / f * (p[i].x * cos(w) * cos(k) - p[i].y * sin(k) * cos(w));A[n + 1, 4] = -f * cos(k) - p[i].y / f * (p[i].x * sin(k) + p[i].y * cos(k));A[n + 1, 5] = -p[i].x;}for (i = 0; i < 4; i++) //常数项{L[2 * i] = p[i].x - a[2 * i];L[2 * i + 1] = p[i].y - a[2 * i + 1];}}private double calAdd(){double[,] temp = new double[6, 6]; //A的转置与A相乘的积double[,] ANew = new double[6, 8]; //A的转置double[] t = new double[6]; //A的转置与L相乘的积double[] X = new double[6]; //改正数int i, j, n;for (i = 0; i < 8; i++) //求A的转置ANew{for (j = 0; j < 6; j++){ANew[j, i] = A[i, j];}}for (i = 0; i < 6; i++) //求A的转置与A相乘的积temp{for (j = 0; j < 6; j++){temp[i, j] = 0;for (n = 0; n < 8; n++){temp[i, j] += ANew[i, n] * A[n, j];}}}MATINV(temp); //temp的逆,保存在本身矩阵中for (i = 0; i < 6; i++) //求A的转置与L的乘积t{t[i] = 0;for (j = 0; j < 8; j++){t[i] += ANew[i, j] * L[j];}}for (i = 0; i < 6; i++) //求改正数X{X[i] = 0;for (j = 0; j < 6; j++){X[i] += temp[i, j] * t[j];}}Xs += X[0]; //外方位元素初始值加上改正数Ys += X[1];Zs += X[2];u += X[3];w += X[4];k += X[5];return maxone(X); //返回判断条件,最大的改正数的值}public void makeSure() //计算流程控制函数{calcos();calabout();calxx();double VALUE = calAdd();count++;while (VALUE > 0.00001) //迭代至最大改正数<=0.00001为止 {calcos();calabout();calxx();VALUE = calAdd();count++;}}private void MATINV(double[,] c) //求6阶矩阵的逆{int i, j, h, m;const int n = 6;double l;double[,] q = new double[n, 12];for (i = 0; i < n; i++) //构造高斯矩阵{for (j = 0; j < n; j++){q[i, j] = c[i, j];}}for (i = 0; i < n; i++) //单位矩阵{for (j = n; j < 12; j++){if (i + 6 == j)q[i, j] = 1;elseq[i, j] = 0;}}for (h = 0, m = 0; m < n - 1; m++, h++) //消去对角线以下的数据{for (i = m + 1; i < n; i++){if (q[i, h] == 0d)continue;l = q[m, h] / q[i, h];for (j = 0; j < 12; j++){q[i, j] *= l;q[i, j] -= q[m, j];}}}for (h = n - 1, m = n - 1; m > 0; m--, h--) // 消去对角线以上的数据{for (i = m - 1; i >= 0; i--){if (q[i, h] == 0d)continue;l = q[m, h] / q[i, h];for (j = 0; j < 12; j++){q[i, j] *= l;q[i, j] -= q[m, j];}}}for (i = 0; i < n; i++)//将对角线上数据化为1{l = 1.0 / q[i, i];for (j = 0; j < 12; j++){q[i, j] *= l;}}for (i = 0; i < n; i++) //提取逆矩阵{for (j = 0; j < n; j++){c[i, j] = q[i, j + 6];}}}private double maxone(double[] Arr) //返回六个元素中的最大值 {double[] ARR = new double[6];for (int i = 0; i < 6; i++){ARR[i] = Arr[i];if (ARR[i] < 0d) //取正ARR[i] = -ARR[i];}Array.Sort(ARR, 0, 6);return ARR[5];}public int COUNT{get{return count;}}public double U{get{return u; }}public double W{get{return w; }}public double K{get{return k; }}public double XS {get{return Xs; }}public double YS {get{return Ys; }}public double ZS {get{return Zs; }}}3、窗体一部分的代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Diagnostics;using System.Data.OleDb;using System.IO;namespace单像空间后方交会{public partial class Form1 : Form{private double[] data = new double[20]; //保存表中的数据private double f = 0; //主距public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){// TODO: 这行代码将数据加载到表“database1DataSet1.data”中。