单向空间后方交会源程序
单片空间后方交会编程
![单片空间后方交会编程](https://img.taocdn.com/s3/m/6c5eb50203d8ce2f006623dd.png)
矩阵相乘2_*1_2_*12_12_*1_2*1j i j j j i result m m =void mult(double *m1,double *m2,double *result,int i_1,int j_12,int j_2){int i,j,k;for(i=0;i<i_1;i++)for(j=0;j<j_2;j++){result[i*j_2+j]=0.0;for(k=0;k<j_12;k++)result[i*j_2+j]+=m1[i*j_12+k]*m2[j+k*j_2];}return;}矩阵求逆n n n n m m *1*11= int invers_matrix (double *m1,int n ){int *is ,*js ;int i ,j ,k ,l ,u ,v ;double temp ,max_v ;is =(int *)malloc (n *sizeof (int ));js =(int *)malloc (n *sizeof (int ));if (is ==NULL ||js ==NULL ){printf ("out of memory!\n");return (0);}for (k =0;k <n ;k ++){max_v =0.0;for (i =k ;i <n ;i ++)for (j =k ;j <n ;j ++){temp =fabs (m1[i *n +j ]);if (temp >max_v ){max_v =temp ; is [k ]=i ; js [k ]=j ;}}if (max_v ==0.0){free (is ); free (js );printf("invers is not availble!\n");return(0);}if(is[k]!=k)for(j=0;j<n;j++){u=k*n+j; v=is[k]*n+j;temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;}if(js[k]!=k)for(i=0;i<n;i++){u=i*n+k; v=i*n+js[k];temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;}l=k*n+k;m1[l]=1.0/m1[l];for(j=0;j<n;j++)if(j!=k){u=k*n+j;m1[u]*=m1[l];}for(i=0;i<n;i++)if(i!=k)for(j=0;j<n;j++)if(j!=k){u=i*n+j;m1[u]-=m1[i*n+k]*m1[k*n+j];}for(i=0;i<n;i++)if(i!=k){u=i*n+k;m1[u]*=-m1[l];}}for(k=n-1;k>=0;k--){if(js[k]!=k)for(j=0;j<n;j++){u=k*n+j; v=js[k]*n+j;temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;}if(is[k]!=k)for(i=0;i<n;i++){u=i*n+k; v=i*n+is[k];temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;}}free (is ); free (js );return (1);}矩阵转置m n Tn m m m **21= void transpose (double *m1,double *m2,int m ,int n ){int i ,j ;for (i =0;i <m ;i ++)for (j =0;j <n ;j ++)m2[j *m +i ]=m1[i *n +j ];return ;}提交验收成果要求打印:1.程序实习报告(理解后方交会原理);2 . 程序流程图;3.打印源程序代码(C 和C++独立完成,附带程序注释说明);4.计算结果输出(包括: 原始计算数据, 计算的外方位元素并对其评定精度;。
第五讲 单片空间后方交会
![第五讲 单片空间后方交会](https://img.taocdn.com/s3/m/da4a7515866fb84ae45c8d47.png)
x12 − f (1 + 2 ) f xy − 1 1 f
2 x2 − f (1 + 2 ) f
−
x1 y1 f
y12 − f (1 + 2 ) f − x2 y2 f
x y − 2 2 f
2 x3 − f (1 + 2 ) f
2 y2 − f (1 + 2 ) f
−
x3 y3 f
xy − 3 3 f
Y B
A
C X
利用航摄像片上三个以上像点坐标和对应像 点坐标和对应地面点坐标,计算像片外方位元 素的工作,称为单张像片的空间后方交会。 进行空间后方交会运算,常用的一个基本公 式是前面提到的共线方程。式中的未知数,是 六个外方位元素。由于一个已知点可列出两个 方程式,如有三个不在一条直线上的已知点, 就可列出六个独立的方程式,解求六个外方位 元素。由于共线条件方程的严密关系式是非线 性函数,不便于计算机迭代计算。为此,要由 严密公式推导出一次项近似公式,即变为线性 函数。
(5) 用所取未知数的初始值和控制点的地面坐标,代入共线方程式,逐 ) 用所取未知数的初始值和控制点的地面坐标,代入共线方程式, 点计算像点坐标的近似值 ( x), ( y ) 并计算 lx , l y a ( X − X S ) + b1 (Y − YS ) + c1 ( Z − Z S ) x=−f 1 a3 ( X − X S ) + b3 (Y − YS ) + c3 ( Z − Z S ) a ( X − X S ) + b2 (Y − YS ) + c2 ( Z − Z S ) y=−f 2 a3 ( X − X S ) + b3 (Y − YS ) + c3 ( Z − Z S ) (6) 组成误差方程式。 ) 组成误差方程式。 7) 计算法方程式的系数矩阵与常数项,组成法方程式。 (7) 计算法方程式的系数矩阵与常数项,组成法方程式。 (8) 解算法方程,迭代求得未知数的改正数。 ) 解算法方程,迭代求得未知数的改正数。
单像空间后方交会
![单像空间后方交会](https://img.taocdn.com/s3/m/0e46418583d049649b66585d.png)
像空间辅助坐标系(u,v,w)
坐标原点位于S,但坐标轴不一定与像平 面坐标轴平行,按需要定义。
像空坐标系与像空辅助坐标系之关系
物方坐标系
地面测量坐标系(Xt,Yt,Zt)
义。
地面摄影测量坐标系(X,Y,Z,)
原点位于地面某一已知点,坐标轴按需要定
地面测量坐标系与摄影测量坐标系之关系
确定像片相对S 的位置。 --焦距 --像主点 在像平面坐标系中 的坐标 例
外方位元素
1、确定S在物方空 间坐标系中位置的元 素(直线元素)。 Xs,Ys,Zs 例 Xs=1140.2m Ys=2003.5m Zs=1035.7m
பைடு நூலகம்2、确定像片在
物方空间坐标系中 位置的元素(角 元素)。 1) 角元素
像方坐标系与物方 坐标系之关系
共线方程线性化:
前式具体化:
即有
'
2
'
2
(5-9a)具体化:
写成
即
综合上述推导,有共线方程的线性形式:
式中
二.解算中的具体公式
利用(a)式解求外方位元素时,有6个未知数,须用像 片及地面3个点的3对已知的(X,Y,Z)、(x,y)组6个 方程.实用中为提高精度常取多余点多余观测,为此要按 最小二乘平差计算.则平差算式如下:
分)
单像空间后方交会(第五章部
根据单张航测像片上一定数量的已 知点(像片坐标和地面坐标已知),计算该 像片的外方位元素(摄影中心S的坐标 Xs,Ys,Zs,像片的角元素 ).
知道外方位 元素,可用来恢 复像片在摄影时 的空间位置,重 建像片与被摄地 面之间的相互关 系
内方位元素
( X1 , Y1 , Z1 )
单片空间后方交会程序设计
![单片空间后方交会程序设计](https://img.taocdn.com/s3/m/74cdcfdfb14e852458fb572e.png)
单片空间后方交会程序设计
1 目的
用程序设计语言(VC或者VB)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并评定精度。
本实验的目的在于让学生深入理解单片空间后方交会的原理,体会在有多余观测情况下,用最小二乘平差方法编程实现解求影像外方位元素的过程。
通过上机调试程序加强动手能力的培养,通过对实验结果的分析,增强学生综合运用所学知识解决实际问题的能力。
2. 内容
利用一定数量的地面控制点,根据共线条件方程求解像片外方位元素。
3. 数据准备
已知航摄仪的内方位元素:f
k =153.24mm,x
=y
=0.0mm,摄影比例尺为1:50000;
4个地面控制点的地面坐标及其对应像点的像片坐标:
4. 操作步骤
上机调试程序并打印结果。
编写单片空间后方交会程序实习一
![编写单片空间后方交会程序实习一](https://img.taocdn.com/s3/m/2d250a6aa98271fe910ef937.png)
实验一 编写单片空间后方交会程序
一、实验目的
用程序设计语言(Visual C++或者C 语言、matlab 语言)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并评定精度。
本实验的目的在于让学生深入理解单片空间后方交会的原理,体会在有多余观测情况下,用最小二乘平差方法编程实现解求影像外方位元素的过程。
通过上机调试程序加强动手能力的培养,通过对实验结果的分析,增强学生综合运用所学知识解决实际问题的能力。
二、实验内容与要求
利用一定数量的地面控制点,根据共线条件方程求解像片外方位元素。
三、实验原理
根据摄影过程的几何反转原理。
四、实验数据准备
﹡ 已知航摄仪的内方位元素0,24.15300===y x mm f (摄影比例尺为1:50000); ﹡ 4个地面控制点的地面坐标及其对应像点的像片坐标:
1.每人必须独立上机操作;
2.实验前认真复习单片空间后方交会的有关内容。
六、实验报告
原理、实验步骤及程序框图
上机调试程序并打印结果。
空间后方交会C++程序代码
![空间后方交会C++程序代码](https://img.taocdn.com/s3/m/2cfee6034a7302768e993912.png)
摄影测量后方交会程序(c/c++)输入数据截图:结果截图:程序源代码(其中的矩阵求逆在前面已经有了,链接):#include <stdio.h>#include <stdlib.h>#include <math.h>const double PRECISION=1e-5;typedef double DOUBLE[5];int InputData(int &Num, DOUBLE *&Data,double &m,double &f);int Resection(const int &Num,const DOUBLE *&Data,const double &m,const double &f);int InverseMatrix(double *matrix,const int &row);int main(int argc, char* argv[]){DOUBLE *Data=NULL;int Num;double f(0),m(0);if(InputData(Num,Data,m,f)){if (Data!=NULL){delete []Data;}return 1;}if(Resection(Num,Data,m,f)){if (Data!=NULL){delete []Data;}return 1;}if (Data!=NULL){delete []Data;}printf("解算完毕...\n");do{printf("计算结果保存于\"结果.txt\"文件中\n""请选择操作(输入P打开结果数据,R打开原始数据,其它退出程序):");fflush(stdin); //刷新输入流char order=getchar();if ('P'==order || 'p'==order){system("结果.txt");}else if ('R'==order || 'r'==order){system("data.txt");}elsebreak;system("cls");}while(1);system("PAUSE");return 0;}/***********************************************函数名:InputData*函数介绍:从文件(data.txt)中读取数据,*文件格式如下:*点数 m(未知写作0)* 内方位元素(f x0 y0)*编号 x y X Y Z*下面是一个实例:4 0153.24 0 01 -86.15 -68.99 36589.41 25273.32 2195.172 -53.40 82.21 37631.08 31324.51 728.693 -14.78 -76.63 39100.97 24934.98 2386.504 10.46 64.43 40426.54 30319.81 757.31*参数:(in/out)Num(点数),*(in/out)Data(存放数据),m,f,x0,y0*返回值:int ,0成功,1文件打开失败,2控制点个*数不足,3文件格式错误*作者:vcrs*完成时间:09-10-4**********************************************/int InputData(int &Num, DOUBLE *&Data,double &m,double &f) {double x0,y0;FILE *fp_input;if (!(fp_input=fopen("data.txt","r"))){return 1;}fscanf(fp_input,"%d%lf",&Num,&m);if (Num<4){return 2;}fscanf(fp_input,"%lf%lf%lf",&f,&x0,&y0);f/=1000;if (m<0 || f<0){return 3;}Data=new DOUBLE[Num];double *temp= new double[Num-1];double scale=0;int i;for (i=0;i<Num;i++){//读取数据,忽略编号if(fscanf(fp_input,"%*d%lf%lf%lf%lf%lf",&Data[i][0],&Data[i][1],&Data[i][2],&Data[i][3],&Data[i][4])!=5){return 3;}//单位换算成mData[i][0]/=1000.0;Data[i][1]/=1000.0;}//如果m未知则归算其值if (0==m){for (i=0;i<Num-1;i++){temp[i]=(Data[i][2]-Data[i+1][2])/(Data[i][0]-Data[i+1][0])+ (Data[i][3]-Data[i+1][3])/(Data[i][1]-Data[i+1][1]);scale+=temp[i]/2.0;}m=scale/(Num-1);}fclose(fp_input);delete []temp;return 0;}/***********************************************函数名:MatrixMul*函数介绍:求两个矩阵的积,*参数:Jz1(第一个矩阵),row(第一个矩阵行数),*Jz2(第二个矩阵),row(第二个矩阵列数),com(第一个*矩阵列数),(out)JgJz(存放结果矩阵)*返回值:void*作者:vcrs*完成时间:09-10-4**********************************************/void MatrixMul(double *Jz1,const int &row,double *Jz2,const int &line,const int &com,double *JgJz){for (int i=0;i<row;i++){for (int j=0;j<line;j++){double temp=0;for (int k=0;k<com;k++){temp+=*(Jz1+i*com+k)*(*(Jz2+k*line+j));}*(JgJz+i*line+j)=temp;}}}/***********************************************函数名:OutPut*函数介绍:向结果.txt文件输出数据*参数:Q协因数阵,m精度,m0单位权中误差,6个外*方位元素,旋转矩阵*返回值:int,0成功,1失败*作者:vcrs*完成时间:09-10-4**********************************************/int OutPut(const double *&Q,const double *&m,const double &m0, const double &Xs,const double &Ys,const double &Zs,const double &Phi,const double &Omega,const double &Kappa,const double *R){FILE *fp_out;if (!(fp_out=fopen("结果.txt","w"))){return 1;}FILE *fp_input;if (!(fp_input=fopen("data.txt","r"))){return 1;}fprintf(fp_out,"**************************************""**************************************""**************************************""*********************************\n");fprintf(fp_out,"\n空间后方交会程序(C\\C++)\n遥感信息工程学院\n班级:""00000\n学号:0000000\n姓名:vcrs\n\n");fprintf(fp_out,"**************************************""**************************************""**************************************""*********************************\n");fprintf(fp_out,"已知数据:\n\n已知点数:");int num;double temp,x,y;fscanf(fp_input,"%d%lf",&num,&temp);fprintf(fp_out,"%d\n",num);fprintf(fp_out,"摄影比例尺(0表示其值位置):");fprintf(fp_out,"%10.0lf\n",temp);fprintf(fp_out,"内方位元素(f x0 y0):");fscanf(fp_input,"%lf%lf%lf",&temp,&x,&y);fprintf(fp_out,"%10lf\t%10lf\t%10lf\n",temp,x,y);for (int i=0;i<num;i++){double temp[5];fscanf(fp_input,"%*d%lf%lf%lf%lf%lf",&temp[0],&temp[1],&temp[2],&temp[3],&temp[4]);fprintf(fp_out,"%3d\t%10lf\t%10lf\t%10lf\t%10lf\t%10lf\n", i+1,temp[0],temp[1],temp[2],temp[3],temp[4]);}fclose(fp_input);fprintf(fp_out,"**************************************""**************************************""*********************************\n");fprintf(fp_out,"计算结果如下:\n\n外方位元素:\n"); fprintf(fp_out,"\tXs=%10lf\n",Xs);fprintf(fp_out,"\tYs=%10lf\n",Ys);fprintf(fp_out,"\tZs=%10lf\n",Zs);fprintf(fp_out,"\tPhi=%10lf\n",Phi);fprintf(fp_out,"\tOmega=%10lf\n",Omega);fprintf(fp_out,"\tKappa=%10lf\n\n",Kappa);fprintf(fp_out,"旋转矩阵:\n");for (i=0;i<3;i++){fprintf(fp_out,"\t");for (int j=0;j<3;j++){fprintf(fp_out,"%10lf\t",*(R+i*3+j));}fprintf(fp_out,"\n");}fprintf(fp_out,"\n单位权中误差:%10lf\n\n",m0);fprintf(fp_out,"协因数阵:\n");for (i=0;i<6;i++){fprintf(fp_out,"\t");for (int j=0;j<6;j++){fprintf(fp_out,"%20lf\t",*(Q+i*6+j));}fprintf(fp_out,"\n");}fprintf(fp_out,"\n外方位元素精度:");for (i=0;i<6;i++){fprintf(fp_out,"%10lf\t",m[i]);}fprintf(fp_out,"\n");fprintf(fp_out,"**************************************""**************************************""*********************************\n");fclose(fp_out);return 0;}/***********************************************函数名:Resection*函数介绍:计算*参数:Num(点数),Data(数据),m,,f(焦距),x0,y0*返回值:int,0成功,其它失败*作者:vcrs*完成时间:09-10-4**********************************************/int Resection(const int &Num,const DOUBLE *&Data,const double &m, const double &f){double Xs=0,Ys=0,Zs=0;int i,j;//设置初始值for (i=0;i<Num;i++){Xs+=Data[i][2];Ys+=Data[i][3];}Xs/=Num;Ys/=Num;Zs=m*f;double Phi(0),Omega(0),Kappa(0);double R[3][3]={0.0};double *L=new double[2*Num];typedef double Double6[6];Double6 *A=new Double6[2*Num];double *AT=new double[2*Num*6];double *ATA=new double[6*6];double *ATL=new double[6];double *Xg=new double[6];//迭代计算do{//旋转矩阵R[0][0]=cos(Phi)*cos(Kappa)-sin(Phi)*sin(Omega)*sin(Kappa);R[0][1]=-cos(Phi)*sin(Kappa)-sin(Phi)*sin(Omega)*cos(Kappa);R[0][2]=-sin(Phi)*cos(Omega);R[1][0]=cos(Omega)*sin(Kappa);R[1][1]=cos(Omega)*cos(Kappa);R[1][2]=-sin(Omega);R[2][0]=sin(Phi)*cos(Kappa)+cos(Phi)*sin(Omega)*sin(Kappa);R[2][1]=-sin(Phi)*sin(Kappa)+cos(Phi)*sin(Omega)*cos(Kappa);R[2][2]=cos(Phi)*cos(Omega);for (i=0;i<Num;i++){double X=R[0][0]*(Data[i][2]-Xs)+R[1][0]*(Data[i][3]-Ys)+ R[2][0]*(Data[i][4]-Zs);double Y=R[0][1]*(Data[i][2]-Xs)+R[1][1]*(Data[i][3]-Ys)+ R[2][1]*(Data[i][4]-Zs);double Z=R[0][2]*(Data[i][2]-Xs)+R[1][2]*(Data[i][3]-Ys)+ R[2][2]*(Data[i][4]-Zs);double xxx,yyy;xxx=-f*X/Z;yyy=-f*Y/Z;//常数项L[2*i]=Data[i][0]-(-f*X/Z);L[2*i+1]=Data[i][1]-(-f*Y/Z);A[2*i][0]=(R[0][0]*f+R[0][2]*(xxx))/Z;A[2*i][1]=(R[1][0]*f+R[1][2]*(xxx))/Z;A[2*i][2]=(R[2][0]*f+R[2][2]*(xxx))/Z;A[2*i][3]=(yyy)*sin(Omega)-(((xxx)/f)*((xxx)*cos(Kappa)-(yyy)*sin(Kappa))+f*cos(Kappa))*cos(Omega);A[2*i][4]=-f*sin(Kappa)-((xxx)/f)*((xxx)*sin(Kappa)+(yyy)*cos(Kappa));A[2*i][5]=(yyy);A[2*i+1][0]=(R[0][1]*f+R[0][2]*(yyy))/Z;A[2*i+1][1]=(R[1][1]*f+R[1][2]*(yyy))/Z;A[2*i+1][2]=(R[2][1]*f+R[2][2]*(yyy))/Z;A[2*i+1][3]=-(xxx)*sin(Omega)-(((yyy)/f)*((xxx)*cos(Kappa)-(yyy)*sin(Kappa))-f*sin(Kappa))*cos(Omega);A[2*i+1][4]=-f*cos(Kappa)-((yyy)/f)*((xxx)*sin(Kappa)+(yyy)*cos(Kappa));A[2*i+1][5]=-(xxx);}//求矩阵A的转置矩阵ATfor (i=0;i<2*Num;i++){for (j=0;j<6;j++){*(AT+j*2*Num+i)=A[i][j];}}//求ATAMatrixMul(AT,6,&A[0][0],6,2*Num,ATA);if(InverseMatrix(ATA,6))return 1;MatrixMul(AT,6,L,1,2*Num,ATL);MatrixMul(ATA,6,ATL,1,6,Xg);Xs+=Xg[0];Ys+=Xg[1];Zs+=Xg[2];Phi+=Xg[3];Omega+=Xg[4];Kappa+=Xg[5];} while(fabs(Xg[0])>=PRECISION ||fabs(Xg[1])>=PRECISION || fabs(Xg[2])>=PRECISION ||fabs(Xg[3])>=PRECISION ||fabs(Xg[4])>=PRECISION || (Xg[5])>=PRECISION);//注:协因数阵,旋转矩阵等计算本应该使用最后外方位元素值,//由于变换很小忽略double *Q=ATA;double *V=new double[2*Num];MatrixMul(&A[0][0],2*Num,Xg,1,6,V);double VTV=0;for(i=0;i<2*Num;i++){V[i]-=L[i];VTV+=V[i]*V[i];}double m0=sqrt(VTV/(2*Num-6));double *mm=new double[6];for (i=0;i<6;i++){mm[i]=sqrt(*(Q+i*6+i))*m0;}OutPut(Q,mm,m0,Xs,Ys,Zs,Phi,Omega,Kappa,&R[0][0]);delete []L;delete []A;delete []AT;delete []ATA;delete []ATL;delete []Xg;delete []mm;delete []V;return 0;}void swap(double &a,double &b){double temp=a;a=b;b=temp;}/***********************************************函数名:InverseMatrix*函数介绍:求矩阵的逆(高斯-约当法)*输入参数:(in/out)matrix(矩阵首地址),*(in)row(矩阵阶数)*输出参数:matrix(原矩阵的逆矩阵)*返回值:int ,0成功,1失败*调用函数:swap(double&,double&)*作者:vcrs*完成时间:09-10-4**********************************************/int InverseMatrix(double *matrix,const int &row) {double *m=new double[row*row];double *ptemp,*pt=m;int i,j;ptemp=matrix;for (i=0;i<row;i++)for (j=0;j<row;j++){*pt=*ptemp;ptemp++;pt++;}}int k;int *is=new int[row],*js=new int[row];for (k=0;k<row;k++){double max=0;//全选主元//寻找最大元素for (i=k;i<row;i++){for (j=k;j<row;j++){if (fabs(*(m+i*row+j))>max){max=*(m+i*row+j);is[k]=i;js[k]=j;}}}if (0 == max){return 1;}//行交换if (is[k]!=k){for (i=0;i<row;i++){swap(*(m+k*row+i),*(m+is[k]*row+i));}}//列交换if (js[k]!=k){for (i=0;i<row;i++){swap(*(m+i*row+k),*(m+i*row+js[k]));}}*(m+k*row+k)=1/(*(m+k*row+k));for (j=0;j<row;j++){if (j!=k){*(m+k*row+j)*=*((m+k*row+k));}}for (i=0;i<row;i++){if (i!=k){for (j=0;j<row;j++){if(j!=k){*(m+i*row+j)-=*(m+i*row+k)**(m+k*row+j);}}}}for (i=0;i<row;i++){if(i!=k){*(m+i*row+k)*=-(*(m+k*row+k));}}}int r;//恢复行列for (r=row-1;r>=0;r--){if (js[r]!=r){for (j=0;j<row;j++){swap(*(m+r*row+j),*(m+js[r]*row+j));}}if (is[r]!=r){for (i=0;i<row;i++){swap(*(m+i*row+r),*(m+i*row+is[r]));}}}ptemp=matrix;pt=m;for (i=0;i<row;i++){for (j=0;j<row;j++){*ptemp=*pt;ptemp++;pt++;}}delete []is;delete []js;delete []m;return 0;}。
简述单像空间后方交会的程序设计步骤
![简述单像空间后方交会的程序设计步骤](https://img.taocdn.com/s3/m/4256d271ef06eff9aef8941ea76e58fafab04587.png)
简述单像空间后方交会的程序设计步骤摘要:一、单像空间后方交会概念阐述二、单像空间后方交会程序设计目的三、单像空间后方交会程序设计步骤1.数据准备2.建立中心投影几何模型3.求解像片外方位元素4.评定精度四、实验意义及能力培养正文:单像空间后方交会是一种基于摄影测量原理的算法,通过计算影像的外方位元素,实现对影像的定位和测量。
在已知地面上若干点的地面坐标和对应像点的像片坐标的情况下,利用共线条件方程求解像片外方位元素。
以下详细介绍单像空间后方交会的程序设计步骤:一、单像空间后方交会概念阐述单像空间后方交会是指在影像覆盖范围内,根据一定数量的分布合理的地面控制点(已知其像点和地面点的坐标),利用共线条件方程求解像片外方位元素的过程。
它是摄影测量中一种基础的算法,为后续复杂算法的演进提供了基础。
二、单像空间后方交会程序设计目的单像空间后方交会程序设计的目的是让学生深入理解单片空间后方交会的原理,通过上机调试程序加强动手能力的培养,通过对实验结果的分析,增强学生综合运用所学知识解决实际问题的能力。
三、单像空间后方交会程序设计步骤1.数据准备:已知航摄仪的内方位元素,摄影比例尺,以及地面控制点的地面坐标和对应像点的像片坐标。
2.建立中心投影几何模型:根据针孔相机模型,建立中心投影的几何模型,包括物空间坐标系、像空间坐标系和摄影坐标系。
3.求解像片外方位元素:利用共线条件方程,通过最小二乘平差方法求解像片的外方位元素。
4.评定精度:根据实验数据,评定求解得到的像片外方位元素的精度。
四、实验意义及能力培养单像空间后方交会实验有助于学生掌握摄影测量基本原理,了解单像空间后方交会的计算过程,提高动手实践能力。
通过实验,学生可以深入理解线性代数和微分学在摄影测量中的应用,为后续学习提供更扎实的基础。
此外,实验还可以培养学生的解决问题的能力和综合运用所学知识的能力,为未来从事相关领域工作打下坚实基础。
综上所述,单像空间后方交会是一种重要的摄影测量方法,通过程序设计实现对影像的定位和测量。
单向后方交会实验报告C
![单向后方交会实验报告C](https://img.taocdn.com/s3/m/41a4d3ff33d4b14e8524685c.png)
单向后方交会实验报告C++实验报告班级:测绘一班学号:日期:2016.5.5目录一、计算原理 (3)二、算法流程 (4)三、源程序 (5)四、计算结果 (13)五、结果分析 (13)六、心得体会 (13)一、计算原理已知条件摄影机主距f=153.24mm,x0=0.01mm,y0=0.02mm, 像片比例尺为1:40000,有四对点的像点坐标与相应的地面坐标如下表。
以单像空间后方交会方法,求解该像片的外方位元素。
二、算法流程(1)获取已知数据。
从航摄资料中差取平均航高与摄影机主距;获取控制点的地面测量坐标并转换为地面摄影坐标。
(2)量测控制点的像点坐标并作系统误差改正。
(3)确定未知数的初始值。
在竖直摄影且地面控制点大体对称分布的情况下,按如下方法确定初始值,即X0SX?,Yn0SY?,Zn0S?mf?1?Z n?0??0??0?0(4)用三个角元素的初始值按下式,计算各个方向余弦值,组成旋转矩阵Ra1?cos?cos??sin?sin?sin?a2??cos?sin??sin?sin?cos?a3??sin?cos?b1?cos?sin?b 2?cos?cos?b3??sin?c1?sin?cos??cos?sin?sin?c2??sin?sin??cos?sin?cos?c3?cos?cos?(5)逐点计算像点坐标的近似值。
利用未知数的近似值和控制点的地面坐标;带入共线方程式,逐点近似像点坐标的近似值(x)、(y)。
(6)逐点计算误差方程式的系数和常数项,组成误差方程式。
(7)计算法方程的系数矩阵ATA和常数项ALL,组成法方程式。
(8)解法方程,求得外方位元素的改正数dXS、dYS、dZS、d?、d?、d?。
(9)用前次迭代取得的近似值,加本次迭代的改正数,计算外方位元素的新值。
KK?1KKK?1KXS?XS?dXS,YSK?YSK?1?dYSK,ZS?ZS?dZS?K??K?1?d?K,?K??K?1?d?K,?K??K?1?d?K(10)将求得的外方位元素改正数与规定的限差比较,若小于限差,则迭代结束。
空间后方交会程序
![空间后方交会程序](https://img.taocdn.com/s3/m/b79ec00803d8ce2f00662324.png)
一. 实验目的: 掌握摄影测量空间后方交会的原理,利用计算机编程语言实现空间后方交会外方位元素的解算。
二. 仪器用具及已知数据文件: 计算机windows xp 系统,编程软件(VISUAL C++6.0),地面控制点在摄影测量坐标系中的坐标及其像点坐标文件shuju.txt 。
三. 实验内容:单张影像的空间后方交会:利用已知地面控制点数据及相应像点坐标根据共线方程反求影像的外方位元素。
数学模型:共线条件方程式: )(3)(3)(3)(1)(1)(1Zs Z c Ys Y b Xs X a Zs Z c Ys Y b Xs X a f x -+-+--+-+--= )(3)(3)(3)(2)(2)(2Zs Z c Ys Y b Xs X a Zs Z c Ys Y b Xs X a f y -+-+--+-+--= 求解过程: (1)获取已知数据。
从航摄资料中查取平均航高与摄影机主距;获取控制点的地面测量坐标并转换为地面摄影测量坐标。
(2)量测控制点的像点坐标并做系统改正。
(3)确定未知数的初始值。
在竖直摄影且地面控制点大致分布均匀的情况下,按如下方法确定初始值,即: n X X S ∑=0,n Y Y S ∑=0,n Z mf Z S ∑=0 φ =ω=κ=0 式中;m 为摄影比例尺分母;n 为控制点个数。
(4)用三个角元素的初始值,计算个方向余弦,组成旋转矩阵R 。
(5)逐点计算像点坐标的近似值。
利用未知数的近似值和控制点的地面坐标代入共线方程式,逐点计算像点坐标的近似值(x )、(y )。
(6)逐点计算误差方程式的系数和常数项,组成误差方程式。
(7)计算法方程的系数矩阵A A T 和常数项l A T ,组成法方程式。
(8)解法方程,求得外方位元素的改正数dXs ,S dY ,s dZ ,d φ,d ω,d κ。
(9)用前次迭代取得的近似值,加本次迭代的改正数,计算外方位元素的新值。
摄影测量程序汇总(后方交会+前方交会+单模型光束法平差)
![摄影测量程序汇总(后方交会+前方交会+单模型光束法平差)](https://img.taocdn.com/s3/m/0828947933687e21af45a9a3.png)
程序运行环境为Visual Studio2010.运行前请先将坐标数据放在debug 下。
1.单像空间后方交会C语言程序:#include <stdio.h>#include <math.h>#include <iostream>double *readdata();void savedata(int hang,double *data,double *xishuarray,double *faxishu,double *l,int i,double xs,double ys,double zs,double fai,double oumiga,double kapa);void transpose(double *m1,double *m2,int m,int n);void inverse(double *a,int n);void multi(double *mat1,double * mat2,double * result,int a,int b,int c);void inverse(double *a,int n)/*正定矩阵求逆*/{int i,j,k;for(k=0;k<n;k++){for(i=0;i<n;i++){if(i!=k)*(a+i*n+k)=-*(a+i*n+k)/(*(a+k*n+k));}*(a+k*n+k)=1/(*(a+k*n+k));for(i=0;i<n;i++){if(i!=k){for(j=0;j<n;j++){if(j!=k)*(a+i*n+j)+=*(a+k*n+j)* *(a+i*n+k);}}}for(j=0;j<n;j++){if(j!=k)*(a+k*n+j)*=*(a+k*n+k);}}}void transpose(double *m1,double *m2,int m,int n) //矩阵转置{ int i,j;for(i=0;i<m;i++)for(j=0;j<n;j++)m2[j*m+i]=m1[i*n+j];return;}void multi(double *mat1,double *mat2,double * result,int a,int b,int c) { int i,j,k;for(i=0;i<a;i++){for(j=0;j<c;j++){result[i*c+j]=0;for(k=0;k<b;k++)result[i*c+j]+=mat1[i*b+k]*mat2[k*c+j];}}return;}double *readdata(){FILE *fp;int i,j;int number;char datacatolog[100];//scanf("%s",datacatolog);if ((fp=fopen("控制点坐标.txt","r"))==NULL){printf("读取数据出错!\n");return false;}fscanf(fp,"%d",&number);double *cordata=new double[number*5];for (i=0;i<number;i++){for (j=0;j<5;j++){fscanf(fp,"%lf",cordata+i*5+j);}}printf("控制点坐标数据读取成功!\n");return cordata;}void savedata(int hang,double *data,double *xishuarray,double *faxishu,double *l,int i,double xs,double ys,double zs,double fai,double oumiga,double kapa){FILE *fp;char *file1="结算数据.txt";fp=fopen(file1,"w");fprintf(fp,"---------原始坐标数据为--------:\n");for (int i=0;i<hang;i++){for (int j=0;j<5;j++){fprintf(fp,"%7.4lf ",data[i*5+j]);}fprintf(fp,"\n");}fprintf(fp,"--------------------------------\n");fprintf(fp,"---------误差方程系数阵为:--------:\n");for (int i=0;i<hang*2;i++){for (int j=0;j<6;j++){fprintf(fp,"%7.4lf ",xishuarray[i*5+j]);}fprintf(fp,"\n");}fprintf(fp,"--------------------------------\n");fprintf(fp,"---------法方程系数阵为:--------:\n");for (int i=0;i<6;i++){for (int j=0;j<6;j++){fprintf(fp,"%7.5lf ",faxishu[i*5+j]);}fprintf(fp,"\n");}fprintf(fp,"--------------------------------\n");fprintf(fp,"---------误差方程常数项为:--------:\n");for (int i=0;i<hang*2;i++){fprintf(fp,"%lf ",l[i]);fprintf(fp,"\n");}fprintf(fp,"--------------------------------\n");fprintf(fp,"---------迭代次数为:--------:\n");fprintf(fp,"%d\n",i);fprintf(fp,"--------------------------------\n");fprintf(fp,"-----------外方位元素为:---------\n");fprintf(fp," Xs= %lf, Ys=%lf, Zs=%lf\n",xs,ys,zs);fprintf(fp," fai= %lf, oumiga=%lf, kapa=%lf\n",fai,oumiga,kapa);fprintf(fp,"--------------------------------\n");fclose(fp);return;}void main(){int i,j;int ii,jj;int diedainumber=0;double x0=0.0,y0=0.0,f=0.0;double m=50000; //估算比例尺double fai=0,oumiga=0,kapa=0,Xs=0,Ys=0,Zs=0;double R[3][3]={0.0};double X=0.0,Y=0.0,Z=0.0,L[8][1]={0.0},A[8][6]={0.0};double correct[6][1]={0.0},AT[6][8]={0.0},ATA[6][6]={0.0},ATL[6][1]={0.0};int row; //row用于存放坐标行数double *controlpoint;controlpoint=readdata();row=sizeof(controlpoint);for (i=0;i<row;i++){for (j=0;j<5;j++){printf("%3.3lf ",controlpoint[i*5+j]);}printf("\n");}/*----------内方位元素----------*/printf("请输入像片的内方位元素(mm):\n");printf("x0=");x0/=1000.0;scanf("%lf",&x0); //double类型数据要用%lfprintf("y0=");y0/=1000.0;scanf("%lf",&y0);printf("f=");scanf("%lf",&f);f=f/1000.0;/*------------------------------*///-------确定未知数初始值------for(int i=0;i<row;i++){Xs=Xs+controlpoint[i*5+2];Ys=Ys+controlpoint[i*5+3];Zs=Zs+controlpoint[i*5+4];}Xs/=row;Ys/=row;Zs=Zs/row+m*f;//-----------------------------do{diedainumber++;//---------组成旋转矩阵--------R[0][0]=cos(fai)*cos(kapa)-sin(fai)*sin(oumiga)*sin(kapa);R[0][1]=-cos(fai)*sin(kapa)-sin(fai)*sin(oumiga)*cos(kapa);R[0][2]=-sin(fai)*cos(oumiga);R[1][0]=cos(oumiga)*sin(kapa);R[1][1]=cos(oumiga)*cos(kapa);R[1][2]=-sin(oumiga);R[2][0]=sin(fai)*cos(kapa)+cos(fai)*sin(oumiga)*sin(kapa);R[2][1]=-sin(fai)*sin(kapa)+cos(fai)*sin(oumiga)*cos(kapa);R[2][2]=cos(fai)*cos(oumiga);//-----------------------------//计算系数阵和常数项for(int i=0,k=0,j=0;i<=3;i++,k++,j++){X=R[0][0]*(controlpoint[i*5+2]-Xs)+R[1][0]*(controlpoint[i*5+3]-Ys)+R[2][0]*(co ntrolpoint[i*5+4]-Zs);Y=R[0][1]*(controlpoint[i*5+2]-Xs)+R[1][1]*(controlpoint[i*5+3]-Ys)+R[2][1]*(con trolpoint[i*5+4]-Zs);Z=R[0][2]*(controlpoint[i*5+2]-Xs)+R[1][2]*(controlpoint[i*5+3]-Ys)+R[2][2]*(controlpoint[i*5+4]-Zs);L[j][0]=controlpoint[i*5+0]-(x0-f*X/Z);L[j+1][0]=controlpoint[i*5+1]-(y0-f*Y/Z);j++;A[k][0]=(R[0][0]*f+R[0][2]*(controlpoint[i*5+0]-x0))/Z;A[k][1]=(R[1][0]*f+R[1][2]*(controlpoint[i*5+0]-x0))/Z;A[k][2]=(R[2][0]*f+R[2][2]*(controlpoint[i*5+0]-x0))/Z;A[k][3]=(controlpoint[i*5+1]-y0)*sin(oumiga)-((controlpoint[i*5+0]-x0)*((control point[i*5+0]-x0)*cos(kapa)-(controlpoint[i*5+1]-y0)*sin(kapa))/f+f*cos(kapa))*cos(o umiga);A[k][4]=-f*sin(kapa)-(controlpoint[i*5+0]-x0)*((controlpoint[i*5+0]-x0)*sin(kapa) +(controlpoint[i*5+1]-y0)*cos(kapa))/f;A[k][5]=controlpoint[i*5+1]-y0;A[k+1][0]=(R[0][1]*f+R[0][2]*(controlpoint[i*5+1]-y0))/Z;A[k+1][1]=(R[1][1]*f+R[1][2]*(controlpoint[i*5+1]-y0))/Z;A[k+1][2]=(R[2][1]*f+R[2][2]*(controlpoint[i*5+1]-y0))/Z;A[k+1][3]=-(controlpoint[i*5+0]-x0)*sin(oumiga)-((controlpoint[i*5+1]-y0)*((cont rolpoint[i*5+0]-x0)*cos(kapa)-(controlpoint[i*5+1]-y0)*sin(kapa))/f-f*sin(kapa))*cos( oumiga);A[k+1][4]=-f*cos(kapa)-(controlpoint[i*5+1]-y0)*((controlpoint[i*5+0]-x0)*sin(ka pa)+(controlpoint[i*5+1]-y0)*cos(kapa))/f;A[k+1][5]=-(controlpoint[i*5+0]-x0);k++;}transpose(A[0],AT[0],8,6);multi(AT[0],A[0],ATA[0],6,8,6);inverse(ATA[0],6);multi(AT[0],L[0],ATL[0],6,8,1);multi(ATA[0],ATL[0],correct[0],6,6,1);Xs=Xs+correct[0][0];Ys=Ys+correct[1][0];Zs=Zs+correct[2][0];fai=fai+correct[3][0];oumiga=oumiga+correct[4][0];kapa=kapa+correct[5][0];}while(correct[3][0]>=6.0/206265.0||correct[4][0]>=6.0/206265.0||correct[5][0] >=6.0/206265.0);printf("迭代次数为:%d\n",diedainumber);printf("---------误差方程系数为:--------\n");for (i=0;i<8;i++){for (j=0;j<6;j++){printf("%4.4lf ",A[i][j]);}printf("\n");}printf("--------------------------------\n");printf("求解得到的外方位元素为:\n");printf(" Xs= %lf\n",Xs);printf(" Ys= %lf\n",Ys);printf(" Zs= %lf\n",Zs);printf(" fai= %lf\n",fai);printf(" oumiga= %lf\n",oumiga);printf(" kapa= %lf\n",kapa);savedata(row,controlpoint,A[0],ATA[0],L[0],diedainumber,Xs,Ys,Zs,fai,oumiga,kap a);printf("-----------------解算结束!--------------\n");system("pause");}解算结果:已知左右像片外方位元素,给出像点坐标:C语言代码:#include <stdio.h>#include <iostream>#include <math.h>double *readdata();void savedata(int hang,double *data);double *readdata(){FILE *fp;int i,j,k;int number;char datacatolog[100];char leftdata[300];//scanf("%s",datacatolog);if ((fp=fopen("像点坐标数据.txt","r"))==NULL){printf("读取数据出错!\n");system("pause");exit(0);}fscanf(fp,"%d",&number);double *c=new double[number*4];for (k=0;k<2;k++){fread(&leftdata,14,1,fp);for (i=0;i<number;i++){for (j=0;j<2;j++){fscanf(fp,"%lf",c+k*2+i*4+j);}}}fclose(fp);return c;}void savedata(int hang,double *data){FILE *fp;char *file1="地面点坐标数据.txt";fp=fopen(file1,"w");fprintf(fp,"---------像点对应地面点坐标为--------:\n");fprintf(fp,"\n");for (int i=0;i<hang;i++){fprintf(fp,"第%d点:",i+1);for (int j=0;j<3;j++){fprintf(fp,"%7.4lf ",data[i*3+j]);}fprintf(fp,"\n\n");}fprintf(fp,"-----------------------------------------");fclose(fp);return;}void main(){double *imagepoint;int row;int i,j;imagepoint=readdata();row=sizeof(imagepoint);//--------------------------------------------double f=24;f/=1000;doublefai1=-0.0061,oumiga1=0.0327,kapa1=0.1711,Ys1=397367.171,Xs1=3445820.098,Zs1=1486.212;doublefai2=0.0063,oumiga2=0.0178,kapa2=0.1489,Ys2=397367.234,Xs2=3445959.266,Zs2=1490.096;// printf("请输入左像片的外方位元素:\n");//printf("Xs1= ");//scanf("%lf",&Xs1);//printf("Ys1= ");//scanf("%lf",&Ys1);//printf("Zs1= ");//scanf("%lf",&Zs1);//printf("fai1= ");//scanf("%lf",&fai1);//printf("oumiga1= ");//scanf("%lf",&oumiga1);//printf("kapa1= ");//scanf("%lf",&kapa1);//printf("请输入右像片的外方位元素:\n");//printf("Xs2= ");//scanf("%lf",&Xs2);//printf("Ys2= ");//scanf("%lf",&Ys2);//printf("Zs2= ");//scanf("%lf",&Zs2);//printf("fai2= ");//scanf("%lf",&fai2);//printf("oumiga2= ");//scanf("%lf",&oumiga2);//printf("kapa2= ");//scanf("%lf",&kapa2);double Bx=Xs2-Xs1,By=Ys2-Ys1,Bz=Zs2-Zs1;double N1=0,N2=0;double X1=0,Y1=0,Z1=0,X2=0,Y2=0,Z2=0;double R1[3][3]={0.0};double R2[3][3]={0.0};double GEOdata[4][3]={0.0};for (i=0;i<row;i++){//---------组成左影像旋转矩阵--------R1[0][0]=cos(fai1)*cos(kapa1)-sin(fai1)*sin(oumiga1)*sin(kapa1);R1[0][1]=-cos(fai1)*sin(kapa1)-sin(fai1)*sin(oumiga1)*cos(kapa1);R1[0][2]=-sin(fai1)*cos(oumiga1);R1[1][0]=cos(oumiga1)*sin(kapa1);R1[1][1]=cos(oumiga1)*cos(kapa1);R1[1][2]=-sin(oumiga1);R1[2][0]=sin(fai1)*cos(kapa1)+cos(fai1)*sin(oumiga1)*sin(kapa1);R1[2][1]=-sin(fai1)*sin(kapa1)+cos(fai1)*sin(oumiga1)*cos(kapa1);R1[2][2]=cos(fai1)*cos(oumiga1);//-----------------------------------//---------组成右影像旋转矩阵--------R2[0][0]=cos(fai2)*cos(kapa2)-sin(fai2)*sin(oumiga2)*sin(kapa2);R2[0][1]=-cos(fai2)*sin(kapa2)-sin(fai2)*sin(oumiga2)*cos(kapa2);R2[0][2]=-sin(fai2)*cos(oumiga2);R2[1][0]=cos(oumiga2)*sin(kapa2);R2[1][1]=cos(oumiga2)*cos(kapa2);R2[1][2]=-sin(oumiga2);R2[2][0]=sin(fai2)*cos(kapa2)+cos(fai2)*sin(oumiga2)*sin(kapa2);R2[2][1]=-sin(fai2)*sin(kapa2)+cos(fai2)*sin(oumiga2)*cos(kapa2);R2[2][2]=cos(fai2)*cos(oumiga2);//-------------像空辅系坐标-------------X1=R1[0][0]*imagepoint[i*4+0]+R1[0][1]*imagepoint[i*4+1]-R1[0][2]*f;Y1=R1[1][0]*imagepoint[i*4+0]+R1[1][1]*imagepoint[i*4+1]-R1[1][2]*f;Z1=R1[2][0]*imagepoint[i*4+0]+R1[2][1]*imagepoint[i*4+1]-R1[2][2]*f;X2=R2[0][0]*imagepoint[i*4+2]+R2[0][1]*imagepoint[i*4+3]-R2[0][2]*f;Y2=R2[1][0]*imagepoint[i*4+2]+R2[1][1]*imagepoint[i*4+3]-R2[1][2]*f;Z2=R2[2][0]*imagepoint[i*4+2]+R2[2][1]*imagepoint[i*4+3]-R2[2][2]*f;//--------------------------------------//------------点投影系数-------------N1=(Bx*Z2-Bz*X2)/(X1*Z2-Z1*X2);N2=(Bx*Z1-Bz*X1)/(X1*Z2-Z1*X2);//-----------------------------------//------------计算地面点坐标------------GEOdata[i][0]=Xs1+N1*X1;GEOdata[i][1]=Ys1+By+N2*Y2;GEOdata[i][2]=Zs1+N1*Z1;//--------------------------------------}//--------------------------------------------for (i=0;i<4;i++){printf("第%d个地面点坐标:",i+1);for (j=0;j<3;j++){printf("%lf ",GEOdata[i][j]);}printf("\n\n");}savedata(row,GEOdata[0]);system("pause");}测试结果:3.单模型光束法严密平差缺少已知数据进行验证,因此如果有已知数据请代入已知数据进行验证。
单像空间后方交会和双像解析空间后方-前方交会的算法程序实现
![单像空间后方交会和双像解析空间后方-前方交会的算法程序实现](https://img.taocdn.com/s3/m/73eae304581b6bd97f19ea08.png)
单像空间后方交会和双像解析空间后方-前方交会的算法程序实现遥感科学与技术摘要:如果已知每张像片的6个外方位元素,就能确定被摄物体与航摄像片的关系。
因此,利用单像空间后方交会的方法,可以迅速的算出每张像片的6个外方位元素。
而前方交会的计算,可以算出像片上点对应于地面点的三维坐标。
基于这两点,利用计算机强大的运算能力,可以代替人脑快速的完成复杂的计算过程。
关键词:后方交会,前方交会,外方位元素,C++编程0.引言:单张像片空间后方交会是摄影测量基本问题之一,是由若干控制点及其相应像点坐标求解摄站参数(X S,Y S,ZS,ψ、ω、κ)。
单像空间后方交会主要有三种方法:基于共线条件方程的平差解法、角锥法、基于直接线性变换的解法。
而本文将介绍第一种方法,基于共线条件方程反求象片的外方位元素。
而空间前方交会先以单张像片为单位进行空间后方交会,分别求出两张像片的外方位元素,再根据待定点的一对像点坐标,用空间前方交会的方法求解待定点的地面坐标。
可以说,这种求解地面点的坐标的方法是以单张像片空间后方交会为基础的,因此,单张像片空间后方交会成为解决这两个问题以及算法程序实现的关键。
1.单像空间后方交会的算法程序实现:(1)空间后方交会的基本原理:对于遥感影像,如何获取像片的外方位元素,一直是摄影测量工作者探讨的问题,其方法有:利用雷达(Radar)、全球定位系统(GPS)、惯性导航系统(I N S)以及星像摄影机来获取像片的外方位元素;也可以利用一定数量的地面控制点,根据共线方程,反求像片的外方位元素,这种方法称为单像空间后方交会(如图1所示)。
图中,地面坐标X i、Yi、Zi和对应的像点坐标x i、yi是已知的,外方位元素XS、Y S、ZS(摄站点坐标),ψ、ω、κ(像片姿态角)是待求的。
(2)空间后方交会数学模型:空间后方交会的数学模型是共线方程, 即中心投影的构像方程:式中X、Y、Z是地面某点在地面摄影测量坐标系中的坐标,x,y是该地面点在像片上的构像点的像片坐标,对于空间后方交会而言它们是已知的,还有主距f是已知的。
单像空间后方交会
![单像空间后方交会](https://img.taocdn.com/s3/m/df1d07aadd3383c4bb4cd281.png)
摄影测量学实习报告遥感07011班吴倩200732590254一、实习目的1.掌握空间后方交会的定义和实现算法(1)定义:空间后方交会是以单幅影像为基础,从该影像所覆盖地面范围内若干控制点的已知地面坐标和相应点的像坐标量测值出发,根据共线条件方程,解求该影像在航空摄影时刻的外方位元素Xs,Ys,Zs,φ,ω,κ。
(2)算法:由于每一对像方和物方共轭点可列出2个方程,因此若有3个已知地面坐标的控制点,则可列出6个方程,解求6个外方位元素的改正数△Xs,△Ys,△Zs,△φ,△ω,△κ。
实际应用中为了提高解算精度,常有多余观测方程,通常是在影像的四个角上选取4个或均匀地选择更多的地面控制点,因而要用最小二乘平差方法进行计算。
2.了解摄影测量平差的基本过程(1)获取已知数据。
从摄影资料中查取影像比例尺1/m,平均摄影距离(航空摄影的航高)、内方位元素x0,y0,f;获取控制点的空间坐标Xt,Yt,Zt。
(2)量测控制点的像点坐标并进行必要的影像坐标系统误差改正,得到像点坐标。
(3)确定未知数的初始值。
单像空间后方交会必须给出待定参数的初始值,在竖直航空摄影且地面控制点大体对称分布的情况下,Xs0和Ys0为均值,Zs0为航高,φ、ω、κ的初值都设为0。
或者κ的初值可在航迹图上找出或根据控制点坐标通过坐标正反变换求出。
(4)计算旋转矩阵R。
利用角元素近似值计算方向余弦值,组成R阵。
(5)逐点计算像点坐标的近似值。
利用未知数的近似值按共线条件式计算控制点像点坐标的近似值(x),(y)。
(6)逐点计算误差方程式的系数和常数项,组成误差方程式。
(7)计算法方程的系数矩阵ATA与常数项ATL,组成法方程式。
(8)解求外方位元素。
根据法方程,解求外方位元素改正数,并与相应的近似值求和,得到外方位元素新的近似值。
(9)检查计算是否收敛。
将所求得的外方位元素的改正数与规定的限差比较,通常对φ,ω,κ的改正数△φ,△ω,△κ给予限差,通常为0.1′,当3个改正数均小于0.1′时,迭代结束。
实习一 单张影像空间后方交会程序设计
![实习一 单张影像空间后方交会程序设计](https://img.taocdn.com/s3/m/29d91e2a02020740bf1e9b23.png)
实习一单张影像空间后方交会程序设计一、实习目的
学生通过编写程序实现单张影像空间后方交会计算,掌握非线性方程线性化的过程、相应数据读入与存储的方法以及迭代计算的特点,为该门课程的学习打下好的基础。
二、实习内容
根据实习要求及试验数据实现单张影像空间后方交会的计算,并将最后计算得到的旋转矩阵及外方位元素输出。
图1空间后方交会程序流程图
三、预备知识
1、熟悉一门编程语言;
2、分析已有数据的特点;
3、弄清矩阵的存储与操作方法;
4、矩阵的运算模块(函数)可直接在相关资料上查找并直接使用。
四、实习步骤
已有的控制点像点坐标及物方坐标可通过输入界面进行输入,已可定义成文本文件由程序读取文本文件;定义变量和数组来存储数据;最终计算结果的输出(可输出为文本文件)。
实习结束后提交每人提交一份实习报告。
五、思考题
1、矩阵在计算机中是怎样存储的?怎样实现对矩阵中每个元素的操作(读取与存储)?
2、单张影像空间后方交会计算时在什么条件下迭代结束?
六、实验数据
已知航摄仪的内方位元素:f=153.24mm,x0=y0=0.0mm,摄影比例尺为1:50000;4个地面控制点的地面坐标及其对应像点的像片坐标如下表。
试验一 单片空间后方交会程序设计
![试验一 单片空间后方交会程序设计](https://img.taocdn.com/s3/m/7e14e505844769eae009edd4.png)
三、存储数据的变量及数组
针对空间后方交会计算中数据的特点,需定义相 关的变量和数组来存储数据。 存储已知数据的数组:x[],y[]分别用来存储控制点 所对应的像点坐标;X[],Y[],Z[]分别用来存储地 面控制点坐标; 存储旋转矩阵数组:a[],b[], c []分别用来存储旋 转矩阵的九个方向余弦值 误差方程系数数组: A[]数组用来存储误差方程系数 误差方程常数项数组:l []数组用来存储误差方程常 数项
解法方程,求未知数改正数 计算改正后的外方位元素 否 未知数改正数<限差否? 整理并输出计算结果 正常结束
输出中间结果 和出错信息 非正常结束
已知航摄仪的内方位元素:f=153.24mm, x0=y0=0.0mm,摄影比例尺为1:50000; 4个地面控制 点的地面坐标及其对应像点的像片坐标如下表:
存储外方位元素改正值的数组:H[]存储某次迭 代计算出的参数改正值 相关变量:Xs0, Ys0, Zs0分别用来存储三个外 方位线元素;t,w,k分别用来存储三个外方 位角元素;f用来存储主距;m存储摄影比例尺 分母
用程序设计语言编写一个完整的单片空间后方交会程序,通 过对提供的试验数据进行计算,输出像片的外方位元素。
二、迭代计算的思想
迭代计算一般需要事先知道参数的初值,初 值选的不好,可能迭代计算收敛速度较慢,甚 至不收敛。
每计算出参数的改正值后,需要把改正值与 限差(迭代收敛的条件)进行比较,直到改正 值小于限差,迭代计算结束。
试验一 单片空间后方交会程序设计
重点: 1.理解单片空间后方交会计算流程 2.掌握迭代计算的思想 3.数据读入与存储方法
输入原始数据 归算像点坐标 x, y
一、空间后方交会 计算程序框图
是 迭 代 次 Ys0 , Z s0 , 0 , 0 , 0 组成旋转矩阵R 计算 ( x), ( y )和 l x , l y 直接生成误差方程B和L 否 所有点完否?
相片的空间后方交会解算 -回复
![相片的空间后方交会解算 -回复](https://img.taocdn.com/s3/m/8faa8f6b0166f5335a8102d276a20029bd6463e7.png)
相片的空间后方交会解算-回复相片的空间后方交会解算是测量地理坐标的一种方法,它通过从不同位置拍摄同一个目标物的相片,利用摄影测量技术解算出目标物在地面上的坐标。
这种方法常用于地形测量、地理信息系统和制图等领域。
本文将一步一步回答有关相片的空间后方交会解算的问题,并介绍其基本原理和实际应用。
第一步:准备工作在进行相片的空间后方交会解算之前,需要准备一些必要的工作。
首先,选择一个适合的目标物,例如建筑物、地标等,确保在不同位置拍摄时能够清晰可见。
接下来,选择使用相机,建议使用具有高分辨率和GPS功能的数码相机,这样可以在后续解算过程中提供更精确的数据。
最后,准备一台计算机以及专门的摄影测量软件,如Photoscan、Pix4D等。
第二步:拍摄相片在拍摄相片时,需要注意以下几个方面。
首先,选择不同位置拍摄,建议拍摄4-6张相片,以确保有足够的数据来进行后方交会解算。
其次,保持相机的水平和稳定,使用三脚架或其他支撑工具可以有效减少拍摄误差。
再次,根据实际情况调整焦距和曝光,确保目标物在每张相片中都能够清晰可见。
最后,在拍摄过程中,尽量减少遮挡物和光线变化,这样可以使解算过程更加准确。
第三步:数据处理在完成相片拍摄后,需要将相片导入计算机,并通过摄影测量软件进行数据处理。
首先,创建一个项目文件,然后将所有相片导入项目中。
接下来,根据实际情况,设置项目的坐标系统和单位,以确保计算结果与实际地理坐标一致。
然后,对每张相片进行特征点提取和匹配,这一步骤可以通过软件自动完成。
最后,进行相片的空间后方交会解算,即通过对不同位置拍摄的相片进行三角测量,解算出目标物在地面上的坐标。
第四步:解算结果评估在完成相片的空间后方交会解算后,需要对解算结果进行评估。
首先,检查解算结果的精度和准确性,与实际地理位置进行比较。
其次,通过误差分析和差异度检验等方法,评估解算过程中的误差来源和程度。
最后,进行结果可视化,比较解算结果与原始相片之间的差异,并进行必要的修正和调整。
单片空间后方交会C#源代码
![单片空间后方交会C#源代码](https://img.taocdn.com/s3/m/a071c25c1611cc7931b765ce05087632311274dd.png)
单片空间后方交会C#源代码主方法: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.T oDouble(FJstring[0])); Coor_y[i] = 0.001 *( Convert.T oDouble(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)*6 double[,] l = new double[2 * m, 1];//l,二维:(2 * m)*1double[,] V = new double[2 * m, 6];//V,二维:(2 * m)*6 double[,] 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.T oString(X0) + '\n' + "Ys = " + Convert.ToString(Y0) + '\n' + "Zs = " + Convert.T oString(Z0) + '\n' + "angel_1 = " + Convert.T oString(angle1) + '\n' + "angel_2 = " + Convert.T oString(angle2) + '\n' + "angel_3 = " +Convert.T oString(angle3) + '\n' + "单位权中误差为:" + Convert.T oString(cc) + '\n' + "Xs精度为: " + Convert.T oString(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.T oString(num));}}动态类库:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace dll{////// Matrix类包含三个方法:矩阵乘法,矩阵转置,矩阵求逆///。
单片空间后方交会程序
![单片空间后方交会程序](https://img.taocdn.com/s3/m/12bde482ec3a87c24028c4bd.png)
单片空间后方交会程序编译环境:VC6.0;工程:Win32 Console Application#include <stdio.h>#include <math.h>#define PI 3.1415926535897932#define N 10 //控制点个数最多为10/********************************************************************************** **** 矩阵转置函数(MResult = MOrigin(T)),参数说明:* MOrigin - 原始矩阵,以一维数组形式存储,m行n列* MResult - 转置后矩阵,以一维数组形式存储,n行m列*********************************************************************************** **/void Transpose(double *MOrigin, double *MResult, int m, int n){int i, j;for(i=0; i<n; i++)for(j=0; j<m; j++)MResult[i*m+j] = MOrigin[j*n+i];}/********************************************************************************** **** 矩阵求逆函数(Metrix = Metrix(-1)),参数说明:* Metrix - 原始矩阵,也是求逆之后的矩阵,以一维数组形式存储,n行n列*********************************************************************************** **/void Inverse(double *Metrix, int n){int i, j, k;for(k=0; k<n; k++){for(i=0; i<n; i++){if(i != k)Metrix[i*n+k] = - Metrix[i*n+k] / Metrix[k*n+k];}Metrix[k*n+k] = 1/Metrix[k*n+k];for(i=0; i<n; i++){if(i != k){for(j=0; j<n; j++){if(j != k)Metrix[i*n+j] += Metrix[k*n+j] * Metrix[i*n+k];}}}for(j=0; j<n; j++){if(j != k)Metrix[k*n+j] *= Metrix[k*n+k];}}}/********************************************************************************** **** 矩阵相乘函数(MResult = MOrigin1 * MOrigin2),参数说明:* MOrigin1 - 原始矩阵1,以一维数组形式存储,m行n列* MOrigin2 - 原始矩阵2,以一维数组形式存储,n行l列* MResult - 相乘后矩阵,以一维数组形式存储,m行l列*********************************************************************************** **/void Multiply(double *MOrigin1, double *MOrigin2, double *MResult, int m, int n, int l){int i, j, k;for(i=0; i<m; i++)for(j=0; j<l; j++){MResult[i*l+j] = 0.0;for(k=0; k<n; k++)MResult[i*l+j] += MOrigin1[i*n+k] * MOrigin2[j+k*l];}}/********************************************************************************** **** 矩阵相减函数(MResult = MOrigin1 - MOrigin2),参数说明:* MOrigin1 - 原始矩阵1,以一维数组形式存储,m行n列* MOrigin2 - 原始矩阵2,以一维数组形式存储,m行n列* MResult - 相减后矩阵,以一维数组形式存储,m行n列*********************************************************************************** **/void Minus(double *MOrigin1, double *MOrigin2, double *MResult, int m, int n){int i, j;for (i=0; i<m; i++)for (j=0; j<n; j++)MResult[n*i+j] = MOrigin1[n*i+j] - MOrigin2[n*i+j];}/********************************************************************************** **** 主函数*********************************************************************************** **/void main(){int i, m, n = 4, nCount = 0;double phi, omega, kappa, Xs, Ys, Zs;double x0, y0, f, Sx = 0.0, Sy = 0.0;double m0 =0.0;double x[N]={-86.15, -53.40, -14.78, 10.46},y[N]={-68.99, 82.21, -76.63, 64.43};double X[N]={36589.41, 37631.08, 39100.97, 40426.54},Y[N]={25273.32, 31324.51, 24934.98, 30319.81},Z[N]={2195.17, 728.69, 2386.50, 757.31};/*double x[N]={-1.5930, -10.8900, 94.8513, 58.5874, 89.4369, 0.7293},y[N]={56.7500, -70.1450, 84.6073, -95.0100, 1.1978, 85.8260};double X[N]={4795.0363, 4780.9533, 5055.6107, 4974.7324, 5043.3627, 4798.8008},Y[N]={4303786.2012, 4303431.5728, 4303867.3983, 4303372.1529, 4303638.8498, 4303867.1120},Z[N]={68.7139, 57.9388, 89.7012, 70.7783, 101.5542, 71.2536};*/double H[6]={1,1,1,1,1,1}, a[3], b[3], c[3], X_[N], Y_[N], Z_[N],A[12*N], B[12*N], V[2*N], L[2*N], C[36], D[6], E[2*N], M[1];x0 = y0 = 0.0;m = 10000;f = 153.24;// m = 2700;// f = 303.6400;for(i=0; i<n; i++){x[i] = x[i]/1000.0;y[i] = y[i]/1000.0;Sx += x[i];Sy += y[i];}phi = omega = kappa = 0.0;Xs = Sx/n;Ys = Sy/n;f = f/1000.0;Zs = m*f;while(fabs(H[3]) > 0.000000001 || fabs(H[4]) > 0.000000001 || fabs(H[5]) > 0.000000001) {a[0] = cos(phi)*cos(kappa) - sin(phi)*sin(omega)*sin(kappa);a[1] = -cos(phi)*sin(kappa) - sin(phi)*sin(omega)*cos(kappa);a[2] = -sin(phi)*cos(omega);b[0] = cos(omega)*sin(kappa);b[1] = cos(omega)*cos(kappa);b[2] = -sin(omega);c[0] = sin(phi)*cos(kappa) + cos(phi)*sin(omega)*sin(kappa);c[1] = -sin(phi)*sin(kappa) + cos(phi)*sin(omega)*cos(kappa);c[2] = cos(phi)*cos(omega);for(i=0; i<n; i++){X_[i] = x0 -f*(a[0]*(X[i]-Xs)+b[0]*(Y[i]-Ys)+c[0]*(Z[i]-Zs)) /(a[2]*(X[i]-Xs)+b[2]*(Y[i]-Ys)+c[2]*(Z[i]-Zs));Y_[i] = y0 -f*(a[1]*(X[i]-Xs)+b[1]*(Y[i]-Ys)+c[1]*(Z[i]-Zs)) /(a[2]*(X[i]-Xs)+b[2]*(Y[i]-Ys)+c[2]*(Z[i]-Zs));Z_[i] = a[2]*(X[i]-Xs) + b[2]*(Y[i]-Ys) + c[2]*(Z[i]-Zs);A[12*i+0] = (a[0]*f + a[2]*(x[i]-x0)) / Z_[i];A[12*i+1] = (b[0]*f + b[2]*(x[i]-x0)) / Z_[i];A[12*i+2] = (c[0]*f + c[2]*(x[i]-x0)) / Z_[i];A[12*i+3] = (y[i]-y0)*sin(omega) - ((x[i]-x0)*((x[i]-x0)*cos(kappa) -(y[i]-y0)*sin(kappa))/f + f*cos(kappa))*cos(omega);A[12*i+4] = -f*sin(kappa) - (x[i]-x0)*((x[i]-x0)*sin(kappa) +(y[i]-y0)*cos(kappa))/f;A[12*i+5] = (y[i]-y0);A[12*i+6] = (a[1]*f + a[2]*(y[i]-y0)) / Z_[i];A[12*i+7] = (b[1]*f + b[2]*(y[i]-y0)) / Z_[i];A[12*i+8] = (c[1]*f + c[2]*(y[i]-y0)) / Z_[i];A[12*i+9] = -(x[i]-x0)*sin(omega) - ((y[i]-y0)*((x[i]-x0)*cos(kappa) - (y[i]-y0)*sin(kappa))/f - f*sin(kappa))*cos(omega);A[12*i+10] = -f*cos(kappa) - (y[i]-y0)*((x[i]-x0)*sin(kappa) +(y[i]-y0)*cos(kappa))/f;A[12*i+11] = -(x[i]-x0);L[2*i] = x[i] - X_[i];L[2*i+1] = y[i] - Y_[i];}Transpose(A, B, 2*n, 6);Multiply(B, A, C, 6, 2*n, 6);Multiply(B, L, D, 6, 2*n, 1);Inverse(C, 6);Multiply(C, D, H, 6, 6, 1);Xs += H[0];Ys += H[1];Zs += H[2];phi += H[3];omega += H[4];kappa += H[5];nCount++;}Multiply(A, H, E, 2*n, 6, 1);Minus(E, L, V, 2*n, 1);Multiply(V, V, M, 2*N, 1, 1);m0 = sqrt(M[0]/(2.0*n-6.0));printf("六个外方位元素为:\n");printf("Xs = %.4f\n", Xs);printf("Ys = %.4f\n", Ys);printf("Zs = %.4f\n", Zs);// printf("phi = %.10f\n", phi);// printf("omega = %.10f\n", omega);// printf("kappa = %.10f\n", kappa);int degree[3], minute[3], second[3];degree[0] = (int)(phi*180.0/PI);minute[0] = (int)((phi*180.0/PI-degree[0])*60.0);second[0] = (int)(((phi*180.0/PI-degree[0])*60.0-minute[0])*60.0); degree[1] = (int)(omega*180.0/PI);minute[1] = (int)((omega*180.0/PI-degree[1])*60.0);second[1] = (int)(((omega*180.0/PI-degree[1])*60.0-minute[1])*60.0); degree[2] = (int)(kappa*180.0/PI);minute[2] = (int)((kappa*180.0/PI-degree[2])*60.0);second[2] = (int)(((kappa*180.0/PI-degree[2])*60.0-minute[2])*60.0); printf("phi = %d.%d%d(度.分秒)\n", degree[0],minute[0],second[0]); printf("omega = %d.%d%d(度.分秒)\n", degree[1],minute[1],second[1]); printf("kappa = %d.%d%d(度.分秒)\n", degree[2],minute[2],second[2]);printf("\n单位权中误差为:m0 = %.10f\n", m0);printf("\n六个外方位元素的中误差为:\n");for (i=0; i<6; i++)printf("m%d = %.10f\n", i+1,m0*sqrt(C[i*6+i]));printf("\n旋转矩阵R为:\n");for (i=0; i<3; i++)printf("%.5f ", a[i]);printf("\n");for (i=0; i<3; i++)printf("%.5f ", b[i]);printf("\n");for (i=0; i<3; i++)printf("%.5f ", c[i]);printf("\n\n");printf("迭代次数为:nCount = %d\n", nCount);}。
单张影像空间后方交会程序解读
![单张影像空间后方交会程序解读](https://img.taocdn.com/s3/m/8a494b500b1c59eef8c7b49d.png)
摄影测量实习报告-----单张影像空间后方交会程序实习时间2013.5.20-2013.5.24学生班级10测绘(1)班学生姓名房新明学生学号1072143138所在院系矿业工程学院指导老师张会战邵亚琴一.实习目的1.深入理解单张影像空间后方交会的原理,体会在有多余观测情况下,用最小二乘平差方法编程实现解求影像外方位元素的过程。
2.利用Visual C++编写一个完整的单张影像空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并进行评定精度。
3.通过编写程序实现单张影像空间后方交会计算,掌握非线性方程线性化的过程、相应数据读入与存储的方法以及迭代计算的特点,巩固各类基础课程及计算机课程的学习内容,培养上机调试程序的动手能力,通过对实验结果的分析,增强综合运用所学知识解决专业实际问题的能力。
4、掌握空间后方交会的定义和实现算法(1) 定义:空间后方交会是以单幅影像为基础,从该影像所覆盖地面范围内若干控制点的已知地面坐标和相应点的像坐标量测值出发,根据共线条件方程,解求该影像在航空摄影时刻的外方位元素Xs,Ys,Zs,φ,ω,κ。
(2) 算法:由于每一对像方和物方共轭点可列出2个方程,因此若有3个已知地面坐标的控制点,则可列出6个方程,解求6个外方位元素的改正数△Xs,△Ys,△Zs,△φ,△ω,△κ。
实际应用中为了提高解算精度,常有多余观测方程,通常是在影像的四个角上选取4个或均匀地选择更多的地面控制点,因而要用最小二乘平差方法进行计算。
5、了解空间后方交会的基本过程(1) 获取已知数据。
从摄影资料中查取影像比例尺1/m,平均摄影距离(航空摄影的航高)、内方位元素x0,y0,f;获取控制点的空间坐标Xt,Yt,Zt。
(2) 量测控制点的像点坐标并进行必要的影像坐标系统误差改正,得到像点坐标。
(3) 确定未知数的初始值。
单像空间后方交会必须给出待定参数的初始值,在竖直航空摄影且地面控制点大体对称分布的情况下,Xs0和Ys0为均值,Zs0为航高,φ、ω、κ的初值都设为0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (j!=k)
{
u=i*n+j;
a[u]=a[u]-a[i*n+k]*a[k*n+j];
}
for (i=0; i<=n-1; i++)
y_tmp[i]=-f/Z_assistance[i]*(R[0][1]*(X[i]-Xs)+R[1][1]*(Y[i]-Ys)+R[2][1]*(Z[i]-Zs));
}
for (i=0;i<4;i++)
{
A[i*2][0]=(R[0][0]*f+R[0][2]*(x[i]))/Z_assistance[i];//计算各点相应线性系数
{
u=k*n+j;
v=js[k]*n+j;
p=a[u];
a[u]=a[v];
a[v]=p;
}
if (is[k]!=k)
for (i=0; i<=n-1; i++)
{
u=i*n+k;
v=i*n+is[k];
{
R[0][0]=cos(Fai)*cos(Kab)-sin(Fai)*sin(Omg)*sin(Kab);//计算旋转矩阵
R[0][1]=-cos(Fai)*sin(Kab)-sin(Fai)*sin(Omg)*cos(Kab);
R[0][2]=-sin(Fai)*cos(Omg);
for (j=k; j<=n-1; j++)
{
l=i*n+j;
p=fabs(a[l]);
if (p>d)
{
d=p; is[k]=i; js[k]=j;}
}
if (d+1.0==1.0) { free(is);
#include <math.h>
//#include <stdlib.h>
#include <iostream>
using namespace std;
double Average(double const *Data,int num)//求均值
{
double sum=0;
for (int i=0;i<num;i++)
}
if (js[k]!=k)
for (i=0; i<=n-1; i++)
{
u=i*n+k;
v=i*n+js[k];
p=a[u];
a[u]=a[v];
a[v]=p;
}
l=k*n+k;
free(js);
return(0);
}
if (is[k]!=k)
for (j=0; j<=n-1; j++)
{
u=k*n+j;
v=is[k]*n+j;
p=a[u];
a[u]=a[v];
a[v]=p;
p=a[u];
a[u]=a[v];
a[v]=p;
}
}
free(is);
free(js);
return(1);
}
void main()
{
const double x[4]={-0.08615,-0.0534,-0.01478,0.01046},//已知数据
cout<<"迭代阈值条件:\nfabs(X_correction[0])<0.000001\nfabs(X_correction[1])<0.000001\nfabs(X_correction[2])<0.000001\nfabs(X_correction[3])<0.001\nfabs(X_correction[4])<0.001\nfabs(X_correction[5])<0.001\n"<<endl<<endl;
A[i*2][1]=(R[1][0]*f+R[1][2]*(x[i]))/Z_assistance[i];
A[i*2][2]=(R[2][0]*f+R[2][2]*(x[i]))/Z_assistance[i];
A[i*2][3]=y[i]*sin(Omg)-cos(Omg)*(x[i]/f*(x[i]*cos(Kab)-y[i]*sin(Kab))+f*cos(Kab));
for (int j=0;j<c;j++)
{
*(Result+c*i+j)=0;
for (int k=0;k<b;k++)
*(Result+c*i+j)+=(*(A+i*b+k))*(*(B+k*c+j));
}
}
int brinv(double a[], int n) //矩阵求逆,来自网络
{
sum+=*(Data+i);
}
return sum/num;
}
void MatrixMultiply(double const *A,double const *B,double *Result,int a,int b,int c)//矩阵相乘
{
for (int i=0;i<a;i++)
A[i*2][4]=-f*sin(Kab)-x[i]/f*(x[i]*sin(Kab)+y[i]*cos(Kab));
A[i*2][5]=y[i];
A[i*2+1][0]=(R[0][1]*f+R[0][2]*(y[i]))/Z_assistance[i];
A[i*2+1][1]=(R[1][1]*f+R[1][2]*(y[i]))/Z_assistance[i];
R[2][2]=cos(Fai)*cos(Omg);
for (int i=0;i<4;i++)
{
Z_assistance[i]=(R[0][2]*(X[i]-Xs)+R[1][2]*(Y[i]-Ys)+R[2][2]*(Z[i]-Zs));
x_tmp[i]=-f/Z_assistance[i]*(R[0][0]*(X[i]-Xs)+R[1][0]*(Y[i]-Ys)+R[2][0]*(Z[i]-Zs));//计算像点坐标近似值
A[i*2+1][5]=-x[i];
}
double At[6][8];
for (i=0;i<8;i++)
for (int j=0;j<6;j++)
At[j][i]=A[i][j];//计算A的转置At
MatrixMultiply(&(At[0][0]),&(A[0][0]),&(A_assistance[0][0]),6,8,6);//计算辅助矩阵(At*A)
cout<<"------------------------------------------------------------"<<endl;
for (int T=1;
fabs(X_correction[0])>0.000001||
fabs(X_correction[1])>0.000001||
fabs(X_correction[2])>0.000001||
fabs(X_correction[3])>0.001||
fabs(X_correction[4])>0.001||
fabs(X_correction[5])>0.001
;T++)
if (i!=k)
{
u=i*n+k;
a[u]=-a[u]*a[l];
}
}
for (k=n-1; k>=0; k--)
{
if (js[k]!=k)
for (j=0; j<=n-1; j++)
R[1][0]=sin(Kab)*cos(Omg);
R[1][1]=cos(Kab)*cos(Omg);
R[1][2]=-sin(Omg);
R[2][0]=sin(Fai)*cos(Kab)+cos(Fai)*sin(Omg)*sin(Kab);
R[2][1]=-sin(Fai)*sin(Kab)+cos(Fai)*sin(Omg)*cos(Kab);
y[4]={-0.06899,0.08221,-0.07663,0.06443},
X[4]={36589.41,37631.08,39100.97,40426.54},
Y[4]={25273.32,31324.51,24934.98,30319.81},
Z[4]={2195.17,728.69,2386.5,757.31},
A[i*2+1][2]=(R[2][1]*f+R[2][2]*(y[i]))/Z_assistance[i];
A[i*2+1][3]=-x[i]*sin(Omg)-cos(Omg)*(y[i]/f*(x[i]*cos(Kab)-y[i]*sin(Kab))-f*sin(Kab));