单片空间后方交会C#源代码
- 格式:docx
- 大小:18.17 KB
- 文档页数:8
单像空间后方交会名词解释
单像空间后方交会是摄影测量学中的一个重要概念,它是指利用单个影像进行地物测量和定位的方法。
在单像空间后方交会中,通过对单张影像进行分析,可以确定地面上物体的位置和形状。
这个过程涉及到对影像中的特征点进行识别和匹配,然后利用相机内外参数以及影像上的像点坐标来计算地物的三维坐标。
单像空间后方交会的过程包括以下几个步骤,首先是对影像进行预处理,包括去畸变、影像配准等操作;然后是特征点的提取和匹配,这一步是通过计算机视觉算法来实现的,可以利用角点、边缘等特征来进行匹配;接下来是相机内外参数的标定,这一步是为了将像素坐标转换为实际世界坐标而进行的;最后是利用已知的相机参数和像点坐标来计算地物的三维坐标。
单像空间后方交会在航空摄影、遥感影像解译和地图制图等领域有着广泛的应用。
它可以通过对单张影像的处理,实现对地物的测量和定位,为地理信息系统和地图制图提供了重要的数据基础。
同时,随着计算机视觉和图像处理技术的不断发展,单像空间后方交会的精度和效率也在不断提高,为各种应用领域提供了更加可靠和精确的地物信息。
单片空间后方交会程序设计专业:测绘工程班级:测绘101姓名:张雯学号:2010220200512 用C 或VC++语言实现单片后方交汇的计算。
以单幅影像为基础,从该影象所覆盖地面范围内若干控制点的已知地面坐标和相应点的像坐标量测值出发,根据共线条件方程,求解该影象在航空摄影时刻的像片外方位元素Xs ,Ys ,Zs,ф,ω,κ.共线条件方程如下:x-x0=-f*[a1(X-Xs)+b1(Y-Ys)+c1(Z-Zs)]/[a3(X-Xs)+b3(Y-Ys)+c3(Z-Zs)] y-y0=-f*[a2(X-Xs)+b2(Y-Ys)+c2(Z-Zs)]/[a3(X-Xs)+b3(Y-Ys)+c3(Z-Zs)] x,y 为像点的像平面坐标;x0,y0,f 为影像的外方位元素;Xs,Ys,Zs 为摄站点的物方空间坐标;X,Y,Z 为物方点的物方空间坐标;输入原始数据归算像点坐标x,,y 计算和确定初值X s 0, Y s 0, Z s 0, φ0,ω0,κ0 组成旋转矩阵R 计算(x ),(y )和l x ,l y 逐点组成误差方程并法化 所有点完否? 解法方程,求未知数改正数 计算改正后外方位元素未知数改正数<限差否?整理并输出计算结果正常输出迭代次数小于限差否? 输出中间结果和出错信息4个地面控制点的地面坐标及其对应像点的像片坐标:结果输出:已知条件:像点坐标x,y:-53.4 82.21-14.78 -76.6310.46 64.43153.24 -86.15地点坐标Xa,Ya,Za:37631.1 31324.5 728.6939101 24935 2386.540426.5 30319.8 757.31-68.99 36589.4 25273.3摄影比例尺:1:50000内方位元素:x0=y0=0 f=153.24mm计算结果:旋转矩阵:0.997709 0.0675334 0.00398399-0.0675254 0.997715 -0.00211178-0.0041175 0.00183792 0.99999像点坐标位:(单位:mm)-86.15 -68.99-53.41 82.21-14.78 -76.6310.47 64.43外方位元素:Xs=39795.435 精度为:1.1254813Ys=27476.479 精度为:1.2437625Zs=7572.6929 精度为:0.48380521q=-0.0039840098 精度为:0.00018182003 w=0.0021117837 精度为:0.00015959235 k=-0.067576934 精度为:7.2440432e-005 迭代次数:4Press any key to continue。
单片空间后方交会程序设计
1 目的
用程序设计语言(VC或者VB)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并评定精度。
本实验的目的在于让学生深入理解单片空间后方交会的原理,体会在有多余观测情况下,用最小二乘平差方法编程实现解求影像外方位元素的过程。
通过上机调试程序加强动手能力的培养,通过对实验结果的分析,增强学生综合运用所学知识解决实际问题的能力。
2. 内容
利用一定数量的地面控制点,根据共线条件方程求解像片外方位元素。
3. 数据准备
已知航摄仪的内方位元素:f
k =153.24mm,x
=y
=0.0mm,摄影比例尺为1:50000;
4个地面控制点的地面坐标及其对应像点的像片坐标:
4. 操作步骤
上机调试程序并打印结果。
单像空间后方交会原理非常简单,稍稍懂一点线性代数和微分学知识就很容易理解。
但它的意义很大,所有的基于视觉技术的定位(测量)都是从它扩展来的,没有它就没有后面的复杂算法的演进,以面向更复杂的场景以及需求。
这块内容一般来说就是在已知地面上若干点的地面坐标以后,反求该相应摄影光束的外参数,当用以作摄影机的标定时,还可借以同时求出摄影的内参数。
具体的说就是一个多元线性模型,根据不同的需求可以基于它进一步构建各种平差模型。
单像空间后方交会实验报告(c++版)单像空间后方交会姓名:学号:时间:目录一、作业任务..................................................... - 4 -二、计算原理..................................................... - 4 -三、算法流程..................................................... - 8 -四、源程序....................................................... - 9 -五、计算结果..................................................... - 9 -六、结果分析..................................................... - 9 -七、心得与体会................................................... - 9 -八、附页......................................................... - 9 -1.c++程序.................................................. - 10 -2.C++程序截图.............................................. - 17 -3.matlb程序 ............................................... - 17 -一、 作业任务已知条件:摄影机主距f=153.24mm ,x0=0,y0=0, 像片比例尺为1:40000,有四对点的像点坐标与相应的地面坐标如下表。
《摄影测量》课程期末统一考试题(卷)[B]一、名词解释(20分,每个4分)1、单片空间后方交会:在摄影之后,利用一定数量的地面控制点,根据共线方程条件方程式反求像片的外方位元素。
P502、同名核线:同一核面与左、右两像片相交的两条核线称为同名核线。
P723、影像匹配:4、影像的外方位元素:在恢复内方位元素(即恢复了摄影光束)的基础上,确定摄影光束在摄影瞬间的空间位置和姿态的参数,称为外方位元素,一张像片的外方位元素包括六个参数,其中三个是直线元素,用于描述摄影中心的空间坐标值;另外三个是角元素,用于描述像片的空间姿态。
P375、解析相对定向:根据同名光线对对相交这一立体像对对内在的几何关系,通过测量的像点坐标,用解析计算的方法解求相对定向元素,建立于地面相似的立体模型,确认模型点的三维坐标。
P77(相对定向与像片的绝对位置无关,不需要地面控制点)二、填空题(20分,每空1分)1、表示航摄像片的外方位角元素可以采用、和三种转角系统。
2、航摄像片是所覆盖地物的中心投影投影,地形图是所表示内容的正射投影投影。
3、摄影测量加密按数学模型可分为航带法、独立模型法和光束法三种方法。
4、摄影测量中常用的坐标系有像平面坐标系、像空间坐标系、像空间辅助坐标系、摄影测量坐标系、地面摄影测量坐标系和地面测量坐标系。
5、要将地物点在摄影测量坐标系中的模型坐标转换到地面摄影测量坐标系,最少需要个和个地面控制点。
6、摄影测量的发展经历了模拟摄影测量、解析摄影测量和数字摄影测量三个阶段。
三、简答题(30分)1、请说明实现自动相对定向的方法原理和关键技术2、什么是数字高程模型?并说明DEM的几种常用的表示形式及特点。
四、综合题(30分)1、推导摄影中心点、像点与其对应物点三点位于一条直线上的共线条件方程,说明式中各符号的意义,用图示意航摄像片的内、外方位元素,并简要叙述以上方程在摄影测量中的主要用途。
2、简述一种框幅式航空影像制作其核线影像的方法。
主方法:private void Cal_Click(object sender, EventArgs e){string[] lines = RichText.Text.Split('\n');long m = lines.Length;m = m - 1;//真实数据行数double[] Coor_x = new double[m];//已知点x坐标double[] Coor_y = new double[m];//已知点x坐标double[] Coor_X = new double[m];//已知点X坐标double[] Coor_Y = new double[m];//已知点Y坐标double[] Coor_Z = new double[m];//已知点Z坐标///赋值for (int i = 0; i < m; i++){string[] FJstring = Regex.Split(lines[i+1], ",");Coor_x[i] = 0.001*(Convert.ToDouble(FJstring[0]));Coor_y[i] = 0.001 *( Convert.ToDouble(FJstring[1]));Coor_X[i] = Convert.ToDouble(FJstring[2]);Coor_Y[i] = Convert.ToDouble(FJstring[3]);Coor_Z[i] = Convert.ToDouble(FJstring[4]);}if (textBox_m.Text == ""){MessageBox.Show("请输入参数!");}if (textBox_m.Text != ""){double M = double.Parse(textBox_m.Text);//比例尺double f = 0.001 * (double.Parse(textBox_f.Text));//焦距double x0 = 0.001 * double.Parse(textBox_x0.Text);//内方位元素x0double y0 = 0.001 * double.Parse(textBox_y0.Text);//内方位元素y0double X0 = 0, Y0 = 0, Z0 = 0;//外方位坐标元素初始值double min = (double.Parse(textBox_k.Text));//焦距double angle1 = 0, angle2 = 0, angle3 = 0;//外方位角元素初始值for (int i = 0; i < m; i++){//累加X0 = Coor_X[i] + X0;Y0 = Coor_Y[i] + Y0;Z0 = Coor_Z[i] + Z0;}X0 = X0 / m;Y0 = Y0 / m;Z0 = Z0 / m + M * f;double[,] A = new double[2 * m, 6];//A,二维:(2 * m)*6double[,] l = new double[2 * m, 1];//l,二维:(2 * m)*1double[,] V = new double[2 * m, 6];//V,二维:(2 * m)*6double[,] XXX = new double[6, 1];//XXX,6*1 所求参数值,即外方位元素改正数///循环解求误差方程,以限差为标准结束循环Matrix ad = new Matrix();Cls_AL ae = new Cls_AL();int num = 0;//记录循环次数for (int i = 0; ; i++){//求A,lae.Cal_AL(X0, Y0, Z0, angle1, angle2, angle3, m, f, x0, y0, Coor_x, Coor_y, Coor_X, Coor_Y, Coor_Z, A, l);//求XXXXXX = ad.Cal_Chengfa(ad.Cal_Chengfa(ad.Cal_Qiuni(ad.Cal_Chengfa(ad.Cal_Zhuanzhi(A), A)), ad.Cal_Zhuanzhi(A)), l);///改正外方位元素X0 = X0 + XXX[0, 0];Y0 = Y0 + XXX[1, 0];Z0 = Z0 + XXX[2, 0];angle1 = angle1 + XXX[3, 0];angle2 = angle2 + XXX[4, 0];angle3 = angle3 + XXX[5, 0];num++;if ((Math.Abs(XXX[3, 0]) < min) && (Math.Abs(XXX[4, 0]) < min) && (Math.Abs(XXX[5, 0]) < min)){ break; }}///精度评定;V = ad.Cal_Jianfa(ad.Cal_Chengfa(A, XXX), l);double[,] c = new double[1, 1];//单位权中误差c = ad.Cal_Chengfa(ad.Cal_Zhuanzhi(V), V);double cc = Math.Sqrt(c[0, 0] / (2 * m - 6));double[,] AA = new double[6, 6];//外方位元素改正数的协因数阵QQ AA = ad.Cal_Qiuni(ad.Cal_Chengfa(ad.Cal_Zhuanzhi(A), A));RichText.Text = ("外方位元素为:" + '\n' + "Xs = " + Convert.ToString(X0) + '\n' + "Ys = " + Convert.ToString(Y0) + '\n' + "Zs = " + Convert.ToString(Z0) + '\n' + "angel_1 = " + Convert.ToString(angle1) + '\n' + "angel_2 = " + Convert.ToString(angle2) + '\n' + "angel_3 = " + Convert.ToString(angle3) + '\n' + "单位权中误差为: " + Convert.ToString(cc) + '\n' + "Xs精度为: " + Convert.ToString(cc * Math.Sqrt(AA[0, 0])) + '\n' + "Ys精度为:" + Convert.ToString(cc * Math.Sqrt(AA[1, 1])) + '\n' + "Zs精度为:" + Convert.ToString(cc * Math.Sqrt(AA[2, 2])) + '\n' + "迭代次数为:" + Convert.ToString(num));}}动态类库:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace dll{/// <summary>/// Matrix类包含三个方法:矩阵乘法,矩阵转置,矩阵求逆/// </summary>public class Matrix{/// <summary>/// 矩阵乘法/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public double[,] Cal_Chengfa(double[,] a, double[,] b){//定义一个以a行数为行数,b列数为列数的数组double[,] c = new double[a.GetLength(0), b.GetLength(1)];for (int i = 0; i < c.GetLength(0); i++){for (int j = 0; j < c.GetLength(1); j++)c[i, j] = 0;for (int k = 0; k < a.GetLength(1); k++){c[i, j] += a[i, k] * b[k, j]; //i行j列元素结果}}}return c;}/// <summary>/// 矩阵减法/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public double[,] Cal_Jianfa(double[,] a, double[,] b){//定义一个以a行数为行数,b列数为列数的数组int m = a.GetLength(0);int n = a.GetLength(1);double[,] c = new double[m, m];for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){c[i, j] = a[i, j] - b[i, j];}}return c;}/// <summary>/// 矩阵转置/// </summary>/// <param name="a"></param>/// <returns></returns>public double[,] Cal_Zhuanzhi(double[,] a){double[,] b = new double[a.GetLength(1), a.GetLength(0)];for (int i = 0; i < a.GetLength(1); i++){for (int j = 0; j < a.GetLength(0); j++)b[i, j] = a[j, i];}}return b;}/// <summary>/// 矩阵求逆/// </summary>/// <param name="a"></param>/// <returns></returns>public double[,] Cal_Qiuni(double[,] a){double[,] b = new double[a.GetLength(0), a.GetLength(1)]; int i, j, row, k;double max, temp;//单位矩阵for (i = 0; i < a.GetLength(1); i++){b[i, i] = 1;}for (k = 0; k < a.GetLength(1); k++){max = 0; row = k;//找最大元,其所在行为rowfor (i = k; i < a.GetLength(1); i++){temp = Math.Abs(a[i, k]);if (max < temp){max = temp;row = i;}}//交换k与row行if (row != k){for (j = 0; j < a.GetLength(0); 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;}}//首元化为1for (j = k + 1; j < a.GetLength(0); j++) a[k, j] /= a[k, k];for (j = 0; j < a.GetLength(0); j++) b[k, j] /= a[k, k];a[k, k] = 1;//k列化为0//对afor (j = k + 1; j < a.GetLength(0); j++){for (i = 0; i < k; i++) a[i, j] -= a[i, k] * a[k, j];for (i = k + 1; i < a.GetLength(0); i++) a[i, j] -= a[i, k] * a[k, j];}//对bfor (j = 0; j < a.GetLength(0); j++){for (i = 0; i < k; i++) b[i, j] -= a[i, k] * b[k, j];for (i = k + 1; i < a.GetLength(0); i++) b[i, j] -= a[i, k] * b[k, j];}for (i = 0; i < a.GetLength(0); i++) a[i, k] = 0;a[k, k] = 1;}return b;}}public class Cls_AL{//计算A,L阵public void Cal_AL(double X0, double Y0, double Z0, double angle1, double angle2, double angle3, long m, double f, double x0, double y0, double[] Coor_x, double[] Coor_y, double[] Coor_X, double[] Coor_Y, double[] Coor_Z, double[,] A, double[,] l){//旋转矩阵double a1 = Math.Cos(angle1) * Math.Cos(angle3) - Math.Sin(angle1) * Math.Sin(angle2) * Math.Sin(angle3);double a2 = -Math.Cos(angle1) * Math.Sin(angle3) - Math.Sin(angle1) * Math.Sin(angle2) * Math.Cos(angle3);double a3 = -Math.Sin(angle1) * Math.Cos(angle2);double b1 = Math.Cos(angle2) * Math.Sin(angle3);double b2 = Math.Cos(angle2) * Math.Cos(angle3);double b3 = -Math.Sin(angle2);double c1 = Math.Sin(angle1) * Math.Cos(angle3) + Math.Cos(angle1) * Math.Sin(angle2) * Math.Sin(angle3);double c2 = -Math.Sin(angle1) * Math.Sin(angle3) + Math.Cos(angle1) * Math.Sin(angle2) * Math.Cos(angle3);double c3 = Math.Cos(angle1) * Math.Cos(angle2);///系数double[] a11 = new double[m];double[] a12 = new double[m];double[] a13 = new double[m];double[] a21 = new double[m];double[] a22 = new double[m];double[] a23 = new double[m];double[] a14 = new double[m];double[] a15 = new double[m];double[] a16 = new double[m];double[] a24 = new double[m];double[] a25 = new double[m];double[] a26 = new double[m];for (int i = 0; i < m; i++){double Z = ((a3 * (Coor_X[i] - X0)) + (b3 * (Coor_Y[i] - Y0)) + (c3 * (Coor_Z[i] - Z0)));//a11[i] = ((a1 * f) + (a3 * Coor_x[i])) / Z;a12[i] = ((b1 * f) + (b3 * Coor_x[i])) / Z;a13[i] = ((c1 * f) + (c3 * Coor_x[i])) / Z;a21[i] = ((a2 * f) + (a3 * Coor_y[i])) / Z;a22[i] = ((b2 * f) + (b3 * Coor_y[i])) / Z;a23[i] = ((c2 * f) + (c3 * Coor_y[i])) / Z;a14[i] = Coor_y[i] * Math.Sin(angle2) - Math.Cos(angle2)*((Coor_x[i] / f) * (Coor_x[i] * Math.Cos(angle3) - Coor_y[i]*Math .Sin (angle3))+f*Math .Cos(angle3));a15[i] = -f * Math.Sin(angle3) - Coor_x[i] * (Coor_x[i] * Math.Sin(angle3) + Coor_y[i] * Math.Cos(angle3)) / f;a16[i] = Coor_y[i];a24[i] = -Coor_x[i] * Math.Sin(angle2) - Coor_y[i] * Math.Cos(angle2) * (Coor_x[i] * Math.Cos(angle3) - Coor_y[i] * Math.Sin(angle3) - f * Math.Sin(angle3)) / f;a25[i] = -f * Math.Cos(angle3) - Coor_y[i] * (Coor_x[i] * Math.Sin(angle3) + Coor_y[i] * Math.Cos(angle3)) / f;a26[i] = -Coor_x[i];A[2 * i, 0] = a11[i];A[2 * i, 1] = a12[i];A[2 * i, 2] = a13[i];A[2 * i, 3] = a14[i];A[2 * i, 4] = a15[i];A[2 * i, 5] = a16[i];A[2 * i + 1, 0] = a21[i];A[2 * i + 1, 1] = a22[i];A[2 * i + 1, 2] = a23[i];A[2 * i + 1, 3] = a24[i];A[2 * i + 1, 4] = a25[i];A[2 * i + 1, 5] = a26[i];l[2 * i, 0] = -x0+Coor_x[i] + f * ((a1 * (Coor_X[i] - X0)) + (b1 * (Coor_Y[i] - Y0)) + (c1 * (Coor_Z[i] - Z0))) / Z;l[2 * i + 1, 0] = -y0+Coor_y[i] + f * ((a2 * (Coor_X[i] - X0)) + (b2 * (Coor_Y[i] - Y0)) + (c2 * (Coor_Z[i] - Z0))) / ((a3 * (Coor_X[i] - X0)) + (b3 * (Coor_Y[i] - Y0)) + (c3 * (Coor_Z[i] - Z0)));}}}}测试数据:x,y,z,X,Y,Z-86.15,-68.99,36589.41,25273.32,2195.17-53.40,82.21,37631.08,31324.51,728.69-14.78,-76.63,39100.97,24934.98,2386.5010.46,64.43,40426.54,30319.81,757.31。