全数字摄影测量实习报告

全数字摄影测量实习报告

          号:          

名:                     

级:                

业:              

课程名称:     数字摄影测量学  

指导老师:             

2013   1

一、目的和要求

了解全数字摄影测量的作业步骤。

二、资料及用具

1、VirtuoZo全数字摄影测量系统一套;

2、外业控制点资料一套:外业控制点成果及相对应的控制点位图

3、相机参数数据一套:应该提供相机主点理论坐标X0Y0,相机焦距f0,框标距或框标点标

4、航片扫描数据:符合VirtuoZo图像格式及成图要求扫描分辨率的扫描影像数据。VirtuoZo可接受多种图像格式:如TIFF、BMP、JPG等。一般选TIFF格式。

三、实验步骤

⒈  建立测区与模型的参数设置

⑴  数据准备完善后,进入VIrtuoZo主界面,首先要新建一个测区,通过文件à打开测区,新建一个名为hammer的测区,系统默认后缀名为blk,默认保存在系统盘下的Virlog文件夹里。*.blk文件其实只是个索引文件,它最终指向的是设置测区里的测区主目录文件夹。*.blk文件建立好之后,系统会自动弹出设置测区的对话框,按照原始数据提供的信息填写相应的内容,之后保存退出。如图一所示

控制点文件选择:hamer.grd

加密点文件选择:hamer.grd

相机检校文件选择rm30.cmr。

摄影比例尺:1:15000。

航带数:2。

影像类型:量测相机。

⑵  数据准备

1. 建立自己的文件夹,可选择D盘,D:\***。

2. ⑴将D:\VirtuoZo\Example\hamer\images文件夹中的下列文件拷贝到D:\xiaotaiye\images文件

夹中:①01-155_50mic.tif等6个tif影像文件,

②hamerIndex.html 和hamerIndex文件夹。注:此文件为测区分布及控制点分布文件。

⑵将D:\VirtuoZo\Example\hamer文件夹中的hamer.grd 和rc30.cmr 两个文件拷贝到D:\***。

第四步,参数设置完成之后,还需要对影像文件进行转换,将各种影像文件转换成VirtuoZo支持的影像格式(VirtuoZo系统有其自有的影像格式,文件格式为*.vz,后文简称该文件为VZ影像)。进入文件à引入à影像文件,进入输入影像对话框,按 增加 按钮选择需转化格式的tif影像(可选择多幅影像),按处理 按钮将影像格式转换为后缀为vz 的影像。

⑴像素大小(mm):0.1

⑵加载要引入的影像

如图二所示

⒊模型的设置

现以156和155两张影像为例,介绍模型的创建过程:通过文件à打开模型,可以建立一个新模型,命名为57-55,默认后缀名为mdl,建立好56-55模型后,程序自动弹出模型参数设置对话框,按照该模型的基本情况设置该对话框,主要设置左、右影像,其它可按程序默认参数设置,之后保存退出。如图三所示

以上是VirtoZoNT的作业基础,有了测区和模型以后,就可以重构三维信息了。

⒉航片的内定向、相对定向和绝对定向

第一步,调用内定向程序(处理à定向à内定向),建立框标模板(若模板已建立,则进入左影像的内定向),建立框标模板如图13所示:

不同型号的相机有着不同的框标模板。一般一个测区是使用同一相机摄影,所以只需在测区内选择一个模型建立框标模板并进行内定向,其他模型内定向就不再需要重新建立框标模板,直接进入内定向处理。本实习数据是使用同一相机。

左边的窗口显示了当前模型的影像,它的四角和四边上的框标被小白框围住。右边的小窗口显示了某框标的放大影像。若小白框没有围住框标,则可在框标上单击,小白框将自动围住框标。这样来调整小白框的位置,尽量使框标位于小白框的中心。然后单击接受按钮,完成框标定位。

系统读入影像,同时显示读影像进度条,影像读入完成后,显示如下窗口:

左边窗口的中心是按钮面板,每个方块按钮对应于一个框标。单击其中一个按钮,则右边微调窗口中将放大显示其对应的框标影像。左边窗口的四周是框标影像窗口,每个小窗口显示一个框标。

右边窗口的上边是IO 参数显示/修改窗口,可在此微调框标坐标。上半部的参数显示窗口,用来显示各框标的像片坐标、残差、内定向变换矩阵和中误差。下半部显示当前框标的放大影像。

4. 微调框标坐标

为使内定向的精度满足作业要求,应尽量使白色的十字丝对准框标的中心。这时,要使用到框标的放大影像。具体操作是通过方块按钮选择第一个框标,然后利用右边窗口中的按钮,进行微调,直到框标放大影像中的白色十字丝对准相机的框标中心,如图11。

对其他的框标用同样的方法进行调整,将所有的白色十字丝对相机准框标中心,然后选择保存退出,左影像内定向完成。重复以上步骤对模型中的右影像做内定向操作。完成模型的内定向,进入相对定向。

退出内定向程序模块;

注意:对于已做过内定向处理的模型,当在 VirtuoZo 标准版界面上单击处理à模型定向à内定向菜单项时,系统会弹出上次的内定向处理结果并询问是否重新进行内定向处理。

第二步相对定向

调用相对定程序(处理à定向à相对定向),程序界面如图所如上图所示,在相对定向界面点鼠标右键,选择自动相对定向,程序将自动寻找同名点,进行相对定向。完成后,影像上显示相对定向点(红十字丝)。

第三步绝对定向   绝对定向前,要以手工的方式在当前模型的左右影像上准确的定位一些控制点(单模型至少要四个或四个以上的控制点)。

打开 hamerIndex.html 文件,查看测区的控制点分布情况,在航片上点击控制点,会出现放大图像,是量测控制点的依据。量测控制点是在相对定向的界面下进行的。见图13,按右键,在弹出的菜单上选全局显示,在相对定向的界面中出现整张的左\右影像上,如图15 所示,参照给出的控制点点位图,寻找相应的控制点,找到后在点位附近点击,系统会弹出一放大的影像的小窗口,在该小窗口中,将光标对准该控制点,单击鼠标左键,程序将自动匹配出右\左影像上的同名点,也以一放大的影像的小窗口显示,同时有一个调整点位的对话框出现,

当量测三个控制点后(三个控制点不能位于一条线上),系统会预测该模型其余控制点的位置。影像上显示出几个蓝色小圈,即系统预测的待测控制点的近似位置。

进入普通方式的绝对定向(在相对定向界面点击鼠标右键,选择绝对定向à普通方式),程序进行绝对定向计算,可以得到如下图所示的界面:在定向结果窗中显示绝对定向的中误差及每个控制点的定向误差。同时弹出控制点微调窗,窗中显示当前控制点的坐标,且设置了立体下的微调按钮。

根据控制点残差显示可知绝对定向的精度如何,若某控制点残差过大,则可进行微调。其微调方法与步骤如下:

在定向结果窗中对某控制点误差行单击鼠标左键,选中该点,弹出该控制点的微调窗。

立体影像微调(必须在支持立体显示的计算机上才可以用此功能):

选中另一个需调整的点,进行微调。

所需调整的点均完成后,选择控制点微调窗中的确定按钮,程序返回相对定向界面。

至此,绝对定向完成。

⒊   生成核线影像

直接在VirtuoZo 主界面中单击处理菜单下的核线重采样菜单项,系统将自动生成当前模型的核线影像。

⒋    影像匹配

生成核线影像后,即可进行影像匹配,选择菜单处理→影像匹配,系统将自动进行影像匹配。匹配过程中,会显示出匹配的进度。

⒌单模型的DEM的生成

完成模型的影像匹配和匹配结果的编辑之后,可生成数字高程模型DEM。单模型的DEM是指使用一个单模型的数据,生成的位于该单模型区域内的DEM。一般情况下生成的DEM都是单模型的DEM。

单模型透视景观:建立数字地面模型后,在系统主菜单中,选择显示à立体显示à透示显示项,,进入显示界面,屏幕显示当前模型的数字地面模型,如图所示

四、实验总结

           通过本次实验,初步掌握了数字摄影测量中的内定向,相对定向和绝对定向以及数字DEM的建立与表示,了解了VirtuoZo软件的基本操作,但还不够熟练,对于软件的应用与概念的理解还有待加强。

 

第二篇:摄影测量实习报告翟智佳

摄影测量实习报告

——单张影像空间后方交会程序设计

实习时间 2013.5.20-2013.5.24

学生班级 学生姓名

学生学号所在院系 矿业工程学院

指导教师

一、实习目的

1.深入理解单片空间后方交会的原理,体会在有多余观测情况下,用最小二乘平差方法编程实现解求影像外方位元素的过程。

2.利用Visual C++或者Matlab(或其他熟悉的计算机语言)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并进行评定精度。

3.通过编写程序实现单张影像空间后方交会计算,掌握非线性方程线性化的过程、相应数据读入与存储的方法以及迭代计算的特点,巩固各类基础课程及计算机课程的学习内容,培养上机调试程序的动手能力,通过对实验结果的分析,增强综合运用所学知识解决专业实际问题的能力。

二、实习环境

1.硬件环境:Window操作系统

2.软件环境:VC++或Matlab或其他计算机语言

三、实习内容

利用一定数量的地面控制点,根据共线条件方程求解像片外方位元素并进行精度评定。

四、实习原理

1.共线方程

x??fa1(X?Xs)?b1(Y?Ys)?c1(Z?Zs)

a3(X?Xs)?b3(Y?Ys)?c3(Z?Zs)

a(X?Xs)?b2(Y?Ys)?c2(Z?Zs)y??f2

a3(X?Xs)?b3(Y?Ys)?c3(Z?Zs)

2.精度评定

mi?m0?ii 其中m0?? VV2n?6

五、实习数据

1.模拟像片一对:左片号23 右片号24

2.像片比例尺: 1/30000

3.航摄机主距:f=150mm

4.每张像片有4个控制点

5.点位略图

摄影测量实习报告翟智佳

摄影测量实习报告翟智佳

摄影测量实习报告翟智佳

摄影测量实习报告翟智佳

6.各片像点坐标及其地面坐标

六、验证数据

1.已知航摄仪内方位元素f=153.24mm,Xo=Yo=0。 2.已知4对点的影像坐标和地面坐标

3.解算结果

?0.997710.067530.00399??? YS?27476.46m R??-0.067530.99772-0.00221??ZS?7572.69m?-0.004120.001840.9999??0XS?39795.45m

七、程序过程框图:

摄影测量实习报告翟智佳

八.实现程序

#include "iostream.h"

#include"stdio.h"

#include "stdlib.h"

#include<math.h>

#define N 4

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;

}

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);

}

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 main()

{

double Xs,Ys,Zs,q,w,k;

double a[3],b[3],c[3];

double x0,y0,f;

double x[N],y[N];

double X[N],Y[N],Z[N];

double x1[N],y1[N];

double m;

double L[2*N];

double XX[6];

double A[2*N][6];

double X0[N],Y0[N],Z0[N],At[6][2*N],result1[6][6],result2[6][1]; int i,n=0;

double sum=0,m0;

/*---------------输入点地面坐标---------------------*/

for(i=0;i<N;i++)

{

printf("请输入第%d个点的地面坐标:",i+1);

scanf("%lf%lf%lf",&X[i],&Y[i],&Z[i]);

}

/*---------------输入点像片坐标---------------------*/

for(i=0;i<N;i++)

{

printf("请输入第%d个点的像片坐标:",i+1);

scanf("%lf%lf",&x[i],&y[i]); } cout<<endl; /*-----------------设定外方位元素初始值--------------*/ x0=0;y0=0;f=150;m=30000; Xs=0;Ys=0;Zs=f*m/1000; q=0;w=0;k=0; XX[3]=1; /*------------------迭代计算--------------------------*/ while((XX[3]>0.00001 || XX[4]>0.00001 || XX[5]>0.00001)&&n<100) { /*----------------旋转矩阵R-----------------------*/ a[0]=cos(q)*cos(k)-sin(q)*sin(w)*sin(k); a[1]=-cos(q)*sin(k)-sin(q)*sin(w)*cos(k); a[2]=-sin(q)*cos(w); b[0]=cos(w)*sin(k); b[1]=cos(w)*cos(k); b[2]=-sin(w); c[0]=sin(q)*cos(k)+cos(q)*sin(w)*sin(k); c[1]=-sin(q)*sin(k)+cos(q)*sin(w)*cos(k); c[2]=cos(q)*cos(w); /*-----------------像点坐标计算值------------------*/ for(i=0;i<N;i++) { X0[i]=a[0]*(X[i]-Xs)+b[0]*(Y[i]-Ys)+c[0]*(Z[i]-Zs); Y0[i]=a[1]*(X[i]-Xs)+b[1]*(Y[i]-Ys)+c[1]*(Z[i]-Zs); Z0[i]=a[2]*(X[i]-Xs)+b[2]*(Y[i]-Ys)+c[2]*(Z[i]-Zs); x1[i]=x0-f*X0[i]/Z0[i]; y1[i]=y0-f*Y0[i]/Z0[i]; } /*-------------误差方程中各偏导数的值--------------*/ for(i=0;i<N;i++) { A[2*i][0]=((a[0]*f+a[2]*(x[i]-x0)))/Z0[i]; A[2*i][1]=((b[0]*f+b[2]*(x[i]-x0)))/Z0[i]; A[2*i][2]=((c[0]*f+c[2]*(x[i]-x0)))/Z0[i]; A[2*i][3]=(y[i]-y0)*sin(w)-((x[i]-x0)*((x[i]-x0)*cos(k)-y[i]*sin(k))/f+f*cos(k))

*cos(w);

A[2*i][4]=-f*sin(k)-(x[i]-x0)*((x[i]-x0)*sin(k)+(y[i]-y0)*cos(k))/f; A[2*i][5]=y[i]-y0;

L[2*i]=x[i]-x1[i];

A[1+2*i][0]=((a[1]*f+a[2]*(y[i]-y0)))/Z0[i];

A[1+2*i][1]=((b[1]*f+b[2]*(y[i]-y0)))/Z0[i];

A[1+2*i][2]=((c[1]*f+c[2]*(y[i]-y0)))/Z0[i];

A[1+2*i][3]=-(x[i]-x0)*sin(w)-((y[i]-y0)*((x[i]-x0)*cos(k)-(y[i]-y0)*sin(k))/f-f*sin(k))

*cos(w);

A[1+2*i][4]=-f*cos(k)-(y[i]-y0)*((x[i]-x0)*sin(k)+(y[i]-y0)*cos(k))/f;

A[1+2*i][5]=-x[i]+x0;

L[1+2*i]=y[i]-y1[i];

}

/*-------------------解法方程--------------------*/

transpose(&A[0][0],&At[0][0],2*N,6);

mult(&At[0][0],&A[0][0],&result1[0][0],6,2*N,6);

invers_matrix(&result1[0][0],6);

mult(&At[0][0],L,&result2[0][0],6,2*N,1);

mult(&result1[0][0],&result2[0][0],&XX[0],6,6,1);

Xs+=XX[0];

Ys+=XX[1];

Zs+=XX[2];

q+=XX[3];

w+=XX[4];

k+=XX[5];

n++;

}

/*----------------旋转矩阵R-----------------------*/

a[0]=cos(q)*cos(k)-sin(q)*sin(w)*sin(k);

a[1]=-cos(q)*sin(k)-sin(q)*sin(w)*cos(k);

a[2]=-sin(q)*cos(w);

b[0]=cos(w)*sin(k);

b[1]=cos(w)*cos(k);

b[2]=-sin(w);

c[0]=sin(q)*cos(k)+cos(q)*sin(w)*sin(k);

c[1]=-sin(q)*sin(k)+cos(q)*sin(w)*cos(k);

c[2]=cos(q)*cos(w);

cout<<"迭代次数为:"<<n<<endl;

printf("\n像片外方位元素的解\n");

} cout<<"航向顷角q:"<<q<<endl; cout<<"旁向倾角w:"<<w<<endl; cout<<"像片旋角k:"<<k<<endl; printf("Xs=%lf\t\tYs=%lf\t\tZs=%lf\n",Xs,Ys,Zs); cout<<endl; printf("旋转矩阵R:\n"); for(i=0;i<3;i++) printf("%lf\t",a[i]); printf("\n"); for(i=0;i<3;i++) printf("%lf\t",b[i]); printf("\n"); for(i=0;i<3;i++) printf("%lf\t",c[i]); printf("\n"); /*-------------------计算单位权中误差---------------*/ for(i=0;i<2*N;i++) sum+=L[i]*L[i]; m0=sqrt(sum/(2*N-6)); cout<<"单位权中误差m0="<<m0<<endl; cout<<"测量精度:"<<endl; cout<<"Xs的精度为:"<<m0*sqrt(result1[0][0])<<endl; cout<<"Ys的精度为:"<<m0*sqrt(result1[1][1])<<endl; cout<<"Zs的精度为:"<<m0*sqrt(result1[2][2])<<endl; cout<<"q的精度为:"<<m0*sqrt(result1[3][3])<<endl; cout<<"w的精度为:"<<m0*sqrt(result1[4][4])<<endl; cout<<"k的精度为:"<<m0*sqrt(result1[5][5])<<endl;

九、程序运行结果 23像片运行结果

摄影测量实习报告翟智佳

24号像片运行结果

摄影测量实习报告翟智佳

10.实习心得

通过一周的实习,让我感觉得到了自己摄影测量知识的欠缺

和编程方面的无措。不过最后在同学们的帮助下中雨完成了这次实习 而在编程里也学习了好多以前没见过的函数,mult是矩阵相乘的函数、invers_矩阵求逆函数、transpose矩阵转换函数。这对以后的学习是大有裨益的。

通过此次实习,才知道书到用时方恨少,同时下定决心好好学习,非常感谢老师给我们提供此次实习。

相关推荐