摄影测量学空间后方交会实验报告测绘101徐斌.docx
- 文档编号:28430745
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:20
- 大小:79.61KB
摄影测量学空间后方交会实验报告测绘101徐斌.docx
《摄影测量学空间后方交会实验报告测绘101徐斌.docx》由会员分享,可在线阅读,更多相关《摄影测量学空间后方交会实验报告测绘101徐斌.docx(20页珍藏版)》请在冰豆网上搜索。
摄影测量学空间后方交会实验报告测绘101徐斌
摄影测量学空间后方交会实验报告测绘101徐斌
摄影测量学实验报告
实验一、单像空间后方交会
学院:
建测学院
班级:
测绘101
姓名:
徐斌
学号:
26
一(实验目的
1.深入了解单像空间后方交会的计算过程;
2.加强空间后方交会基本公式和误差方程式,法线方程式的记忆;3.通过上机调试程序加强动手能力的培养。
二(实验原理
以单幅影像为基础,从该影像所覆盖地面范围内若干控制点和相应点的像坐标量测值出发,根据共线条件方程,求解该影像在航空摄影时刻的相片外方位元素。
三(实验内容
1.程序图框图
2.实验数据
(1)已知航摄仪内方位元素f,153.24mm,Xo,Yo,0。
限差0.1秒
(2)已知4对点的影像坐标和地面坐标:
影像坐标地面坐标
x(mm)y(mm)X(m)Y(m)Z(m)1-86.15-68.9936589.4125273.322195.172-53.4082.2137631.0831324.51728.693-14.78-76.6339100.9724934.982386.50410.4664.4340426.5430319.81757.31
3.实验程序
Form1.cs程序
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.IO;
namespace后方交会1
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
}
publicdouble
f,m,
Xs,Ys,Zs,
a1,a2,a3,b1,b2,b3,c1,c2,c3,
q,w,k;
publicstaticintN,s;
publicdouble[]x=newdouble[4];
publicdouble[]y=newdouble[4];
publicdouble[]X=newdouble[4];
publicdouble[]Y=newdouble[4];
publicdouble[]Z=newdouble[4];
publicdouble[,]L=newdouble[N*2,1];
stringoutput="外方位元素\t\n";
MatrixXX;
string[]a=File.ReadAllLines("d:
\\控制点.txt");
publicvoid计算N()
{
intcnt;
using(StreamReadersr=newStreamReader(@"d:
\控制点.txt"))
{
cnt=0;
while(sr.ReadLine()!
=null)
{
cnt++;
}
//这个cnt就是行数
}
N=cnt/5;
}
publicvoid计算初始值()
{
doubletemp=0;
for(inti=0;i { temp+=X[i]; } Xs=temp/N; doubletmp=0; for(inti=0;i { tmp+=Y[i]; } Ys=tmp/N; Zs=m*f; } publicvoid求改正数() { 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.Cos(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); intp=0; intj=p; for(p=0;p { x[j]=double.Parse(a[p])/1000; y[j]=double.Parse(a[p+1])/1000; X[j]=double.Parse(a[p+2]); Y[j]=double.Parse(a[p+3]); Z[j]=double.Parse(a[p+4]); j++; } MatrixA=newMatrix(N*2,6); inti=0; intb=i; for(i=0;i { A.m_data[b,0]=(a1*f+a3*x[i])/(a3*(X[i]-Xs)+b3*(Y[i]-Ys)+c3*(Z[i]-Zs)); A.m_data[b,1]=(b1*f+b3*x[i])/(a3*(X[i]-Xs)+b3*(Y[i]-Ys)+c3*(Z[i]-Zs)); A.m_data[b,2]=(c1*f+c3*x[i])/(a3*(X[i]-Xs)+b3*(Y[i]-Ys)+c3*(Z[i]-Zs)); A.m_data[b,3]=y[i]*Math.Sin(w)-(x[i]/f*(x[i]*Math.Cos(k)-y[i]*Math.Sin(k))+f*Math.Cos(k))*Math.Cos(w); A.m_data[b,4]=-f*Math.Sin(k)-x[i]/f*(x[i]*Math.Sin(k)+y[i]*Math.Cos(k)); A.m_data[b,5]=y[i]; A.m_data[b+1,0]=(a2*f+a3*y[i])/(a3*(X[i]-Xs)+b3*(Y[i]-Ys)+c3*(Z[i]-Zs)); A.m_data[b+1,1]=(b2*f+b3*y[i])/(a3*(X[i]-Xs)+b3*(Y[i]-Ys)+c3*(Z[i]-Zs)); A.m_data[b+1,2]=(c2*f+c3*y[i])/(a3*(X[i]-Xs)+b3*(Y[i]-Ys)+c3*(Z[i]-Zs)); A.m_data[b+1,3]=-x[i]*Math.Sin(w)-(y[i]/f*(x[i]*Math.Cos(k)-y[i]*Math.Sin(k))-f*Math.Sin(k))*Math.Cos(w); A.m_data[b+1,4]=-f*Math.Cos(k)-y[i]/f*(x[i]*Math.Sin(k)+y[i]*Math.Cos(k)); A.m_data[b+1,5]=-x[i]; b+=2; } MatrixT=newMatrix(6,N*2); T=A.Transpose(); MatrixAT=T*A; MatrixAA=AT.Inverse(); MatrixP=AA*T; MatrixL=newMatrix(N*2,1); intv=0; intm=v; for(v=0;v { L.m_data[m,0]=x[v]+f*(a1*(X[v]-Xs)+b1*(Y[v]-Ys)+c1*(Z[v] -Zs))/(a3*(X[v]-Xs)+b3*(Y[v]-Ys)+c3*(Z[v]-Zs)); L.m_data[m+1,0]=y[v]+f*(a2*(X[v]-Xs)+b2*(Y[v]-Ys)+c2*(Z[v] -Zs))/(a3*(X[v]-Xs)+b3*(Y[v]-Ys)+c3*(Z[v]-Zs)); m+=2; } XX=P*L; //计算外方位元素 Xs+=XX[0,0]; Ys+=XX[1,0]; Zs+=XX[2,0]; q+=XX[3,0]; w+=XX[4,0]; k+=XX[5,0]; } publicvoid迭代() { 求改正数(); for(inti=0;i<6;i++) { for(intj=0;j<1;j++) { output+=XX[i,j]+"\t\n"; } } if(Math.Abs(XX[3,0])>=0.000029&&Math.Abs(XX[4,0])>=0.000029&&Math.Abs(XX[5, 0])>=0.000029) { for(intd=1;d { 求改正数(); for(inti=0;i<6;i++) { for(intj=0;j<1;j++) { output+=XX[i,j]+"\t\n"; } } if(Math.Abs(XX[3,0])<=0.000029&&Math.Abs(XX[4,0])<=0.000029&& Math.Abs(XX[5,0])<=0.000029) { 输出(); break; } } if(Math.Abs(XX[3,0])>=0.000029||Math.Abs(XX[4,0])>=0.000029|| Math.Abs(XX[5,0])>=0.000029) { MessageBox.Show("已达到指定迭代次数,迭代结束! ! ! "); MessageBox.Show(output,"后方交会",MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { 输出(); } } publicvoid输出() { _Xs.Text=Xs.ToString(); _Ys.Text=Ys.ToString(); _Zs.Text=Zs.ToString(); _q.Text=q.ToString(); _w.Text=w.ToString(); _k.Text=k.ToString(); } privatevoidbutton1_Click(objectsender,EventArgse) { try { f=double.Parse(textBox1.Text); } catch { MessageBox.Show("请先输入主距"); } s=int.Parse(textBox2.Text); m=int.Parse(textBox3.Text); 计算N(); inti=0; intj=i; for(i=0;i { x[j]=double.Parse(a[i]); y[j]=double.Parse(a[i+1]); X[j]=double.Parse(a[i+2]); Y[j]=double.Parse(a[i+3]); Z[j]=double.Parse(a[i+4]); j++; } 计算初始值(); } privatevoidbutton2_Click(objectsender,EventArgse) { 迭代(); } privatevoidbutton3_Click(objectsender,EventArgse) { MessageBox.Show("请将点坐标文件保存到d盘根目录并保存为\"控制点.txt\"\n要求每行一个值,五行表示一个点\n测绘101徐斌"); } } } 添加Matrix.cs类程序 usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; namespace后方交会1 { publicclassMatrix { //构造方阵 publicMatrix(introw) { m_data=newdouble[row,row]; } publicMatrix(introw,intcol) { m_data=newdouble[row,col]; } //复制构造函数 publicMatrix(Matrixm) { introw=m.Row; intcol=m.Col; m_data=newdouble[row,col]; for(inti=0;i for(intj=0;j m_data[i,j]=m.m_data[i,j]; } //设为单位阵 publicvoidSetUnit() { for(inti=0;i for(intj=0;j (1);j++) m_data[i,j]=((i==j)? 1: 0); } //设置元素值 publicvoidSetValue(doubled) { for(inti=0;i for(intj=0;j (1);j++) m_data[i,j]=d; } //返中行数 publicintRow { get { returnm_data.GetLength(0); } } //返回列数 publicintCol { get { returnm_data.GetLength (1); } } //重载索引,存取数据成员 publicdoublethis[introw,intcol] { get { returnm_data[row,col]; } set { m_data[row,col]=value; } } //初等变换对调两行: ri<-->rj publicMatrixExchange(inti,intj) { doubletemp; for(intk=0;k { temp=m_data[i,k]; m_data[i,k]=m_data[j,k]; m_data[j,k]=temp; } returnthis; } //初等变换第index行乘以mul MatrixMultiple(intindex,doublemul) { for(intj=0;j { m_data[index,j]*=mul; } returnthis; } //初等变换第src行乘以mul加到第index行 MatrixMultipleAdd(intindex,intsrc,doublemul) { for(intj=0;j { m_data[index,j]+=m_data[src,j]*mul; } returnthis; } //transpose转置 publicMatrixTranspose() { Matrixret=newMatrix(Col,Row); for(inti=0;i for(intj=0;j { ret[j,i]=m_data[i,j]; } returnret; } //矩阵乘 publicstaticMatrixoperator*(Matrixlhs,Matrixrhs) { if(lhs.Col! =rhs.Row)//异常 { System.Exceptione=newException("相乘的两个矩阵的行列数不匹配"); throwe; } Matrixret=newMatrix(lhs.Row,rhs.Col); doubletemp; for(inti=0;i { for(intj=0;j { temp=0; for(intk=0;k { temp+=lhs[i,k]*rhs[k,j]; } ret[i,j]=temp; } } returnret; } //功能: 返回列主元素的行号 //参数: row为开始查找的行号 //说明: 在行号[row,Col)范围内查找第row列中绝对值最大的元素,返回所在行号 intPivot(introw) { intindex=row; for(inti=row+1;i { if(m_data[i,row]>m_data[index,row]) index=i; } returnindex; } //逆阵: 使用矩阵的初等变换,列主元素消去法 publicMatrixInverse() { if(Row! =Col)//异常,非方阵 { System.Exceptione=newException("求逆的矩阵不是方阵"); throwe; } Matrixtmp=newMatrix(this); Matrixret=newMatrix(Row);//单位阵 ret.SetUnit(); intmaxIndex; doubledMul; for(inti=0;i { maxIndex=tmp.Pivot(i); if(tmp.m_data[maxIndex,i]==0) { System.Exceptione=newException("求逆的矩阵的行列式的值等于0,"); throwe; } if(maxIndex! =i)//下三角阵中此列的最大值不在当前行,交换 { tmp.Exchange(i,maxIndex); ret.Exchange(i,maxIndex); } ret.Multiple(i,1/tmp[i,i]); tmp.Multiple(i,1/tmp[i,i]); for(intj=i+1;j { dMul=-tmp[j,i]/tmp[i,i]; tmp.MultipleAdd(j,i,dMul); ret.MultipleAdd(j,i,dMul); } } for(inti=Row-1;i>0;i--) { for(intj=i-1;j>=0;j--) { dMul=-tmp[j,i]/tmp[i,i]; tmp.MultipleAdd(j,i,dMul); ret.MultipleAdd(j,i,dMul); } } returnret; } //是方阵吗, publicboolIsSquare() { returnRow==Col; } //是对称阵吗, publicboolIsSymmetric() { if(Row! =Col) returnfalse; for(inti=0;i for(intj=i+1;j if(m_data[i,j]! =m_data[j,i]) returnfalse; returntrue; } //公有数据成员 publicdoub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 摄影测量学 空间 后方 交会 实验 报告 测绘 101 徐斌