江西理工大学应用科学学院
摄 影 测 量 实 验 报 告
班级:测绘101班 姓名:邬志刚
学号:08090110125
一、实验目的:
掌握空间后方交会和前方交会的原理,根据所给控制点的地面物方坐标以及相应的像点在像平面坐标系中的坐标和同名像点在左右像片上的坐标,利用计算机编程语言实现空间后方交会、前方交会的过程,完成所给立体像对中两张像片各自的6个外方位元素的解求和所给立体像对上5对同名点对应的地面物方点的坐标计算。
二、实验原理:
如图所示,物点A和摄影中心S在地面摄影测量坐标系中的坐标
依次是(X,Y,Z)、(XS,YS,ZS);像点a在像空间坐标系中的坐标是(x,y,-f)。
那么由共线条件方程可知:
a(X Xs)) b(Y Ys)) cc(Z Zs))1(X X1(Y Y1(Z Za b 1s1s1sx x0 f
x x0 f(X X) b(Y Y) c(Z Z)
3(X Xs) b3(Y Ys) c3(Z Zs)a
3s3s3s
a(X Xs)) b(Y Ys)) cc(Z Zs))2(X X2(Y Y2(Z Za b 2s2s2syy 0 f yy0 fa(X Xs)) b(Y Ys)) cc(Z Zs))3(X X3(Y Y3(Z Z a b 3s3s3s
其中ai,bi,ci是只含三个独立参数ψ,ω,κ的九个方向余弦。
在方程中共有6个未知参数Xs,Ys,Zs, , , ,所以有三个不在一条直
线上的已知地面点坐标就可以求出像片的这六个外方位元素。由于共线条件方程是非线性方程,为了便于迭代计算,需要把方程用泰勒级
数展开,取一次项得到线型表达式
,
如下:
x (x)
d d d dXs dYs dZs Xs Ys Zs
y y y y y y
y (y) d d d dXs dYs dZs
Xs Ys Zs
用新的符号表示各偏导数后为
x x x x x x
x (x) a11dXs a12dYs a13dZs a14d a15d a16d
y (y) a21dXs a22dYs a23dZs a24d a25d a26d
其中(x)、(y)是函数近似值,d ,d ,d ,dXs,dYs,dZs是外方位元素
近似值的改正数,它们的系数为函数的偏导数。为了便于推导,令:
X=a1(XY=a2(XZ=a3(X
Xs) b1(Y Ys) c1(Z Zs)
Xs) b2(Y Ys) c2(Z Zs) Xs) b3(Y Ys) c3(Z Zs)
那么有
X Y Z a1 a2 a3
b1b2b3
c1 X Xs X Xs T c2Y Ys RY Ys
c3 Z Zs Z Zs
x Xs
对于系数,其严密算法(以
,
x
为例)如下:
x X
s
1
fZ
2
(
X X
s
Z X
Z X
s
X) 1
fZ
2
( a1Z a3X)
a11
a
21于直影言,
a14a24
a1f a3(x x0) (a1f fa3)
ZZZ
fx ,a12 0,a13
HH
fy
0,a22 ,a23
HH 2
xxy f(1 2),a15 ,a16 y
ff
2 xyy
,a25 f(1 2),a26 x
ff
对竖摄而像
片的角方位元素都是小值,因而各系数的近似值为:
x
fZ
(
X
X ZZ
)
f X
(b1Y b2X) b2Z b3Y
Z Z b2f b3f
YZ
f
XZ
(b1
YZ
b2
XZ
)
fcos cos (y y0)sin (x x0) (y y0) (x x0)
cos sin cos cos
ff (x x0)
(y y0)sin
f
(x x0)cos
fcos cos (y y0)sin
为了提高精度和可靠性,通常需要测量四个或更多的地面控制点和对应的像点坐标,采用最小二乘平差方法解算。此时像点坐标(x,y)作为观测值,加入相应的偶然误差改正数vx,vy,可列出每个点的误差方程式:
vx a11dXvy a21dX
ss
a12dYs a13dZs a14d a15d a16d lx a22dYs a23dZs a24d a25d a26d ly
用矩阵表示为:
具体的
a11
A
a21 vx V ,
vy
Xs Ys Zs x ,
a12a22
a13a23
a14a24
x0 x
l 0
y y
流程图框:
a15a25
a16 a26
四、实验源程序:
#include<iostream> #include<cmath> using namespace std; const int N=4;
const int n=6;
/*---------------矩阵相乘---------------------*/
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;
/*---------------矩阵求逆---------------------*/
void inverse(double c[n][n]) { int i,j,h,k; double p; double q[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; else
q[i][j]=0;}
for(h=k=0;k<n-1;k++,h++)//消去对角线以下的数据 for(i=k+1;i<n;i++) {if(q[i][h]==0) continue; p=q[k][h]/q[i][h]; for(j=0;j<12;j++) { q[i][j]*=p;
q[i][j]-=q[k][j];
} }
for(h=k=n-1;k>0;k--,h--) // 消去对角线以上的数据 for(i=k-1;i>=0;i--) {if(q[i][h]==0) continue;
p=q[k][h]/q[i][h]; for(j=0;j<12;j++) {q[i][j]*=p; q[i][j]-=q[k][j];}}
for(i=0;i<n;i++)//将对角线上数据化为1 { p=1.0/q[i][i]; for(j=0;j<12;j++) q[i][j]*=p;}
for(i=0;i<n;i++) //提取逆矩阵 for(j=0;j<n;j++) c[i][j]=q[i][j+6];
/*---------------矩阵转置---------------------*/
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;
int main()
{
double Xs,Ys,Zs,q …… 此处隐藏:4498字,全部文档内容请下载后查看。喜欢就下载吧 ……