单片空间后方交会C#源代码
【武汉大学-摄影测量学-单张相片解析】3.5.5单片空间后方交会

cos
0
s
in
0 0 1 0 0 0
1 0 0
X
YZ
R 1 R
R1
X
Y
Z
Xs
Ys Zs
0 R1 0
1
0 0 0
1X X s
0 0
Y Z
Ys Zs
武汉大学
摄影测量基础
偏导数-2-2
X
YZ
R 1
0 0
1
0 0 0
1 X
0 0
R
YZ
c1
X s
X)
f Z 2 (a1Z a3 X )
1
X
Z
(a1 f
f
Z
a3 )
1 Z
a1 f
a3 (x
x0 )
武汉大学
摄影测量基础
偏导数-1
x X s
1 Z
a1 f
a3(x x0 )
x Ys
1 Z
b1 f
b3(x x0 )
x Z s
1 Z
c1 f
c3(x x0 )
y X s
1 Z
c2 c3
0 0 0
a1 a1
a2 a3
bc11
a2 b2 c2
a3 b3 c3
X Y Z
0
aa23cc11
a1c2 a1c3
a1c2 a2c1 0
a3c2 a2c3
a1c3 a2c3
0
a3c1 a3c2
X
YZ
0 bb32
b3 0
b1
b2 b1
0
X
武汉大学
摄影测量基础
误差方程的建立
☺ 已知值 x0 , y0 , f , m, X, Y, Z ☺ 观测值 x, y
单像空间后方交会名词解释

单像空间后方交会名词解释
单像空间后方交会是摄影测量学中的一个重要概念,它是指利用单个影像进行地物测量和定位的方法。
在单像空间后方交会中,通过对单张影像进行分析,可以确定地面上物体的位置和形状。
这个过程涉及到对影像中的特征点进行识别和匹配,然后利用相机内外参数以及影像上的像点坐标来计算地物的三维坐标。
单像空间后方交会的过程包括以下几个步骤,首先是对影像进行预处理,包括去畸变、影像配准等操作;然后是特征点的提取和匹配,这一步是通过计算机视觉算法来实现的,可以利用角点、边缘等特征来进行匹配;接下来是相机内外参数的标定,这一步是为了将像素坐标转换为实际世界坐标而进行的;最后是利用已知的相机参数和像点坐标来计算地物的三维坐标。
单像空间后方交会在航空摄影、遥感影像解译和地图制图等领域有着广泛的应用。
它可以通过对单张影像的处理,实现对地物的测量和定位,为地理信息系统和地图制图提供了重要的数据基础。
同时,随着计算机视觉和图像处理技术的不断发展,单像空间后方交会的精度和效率也在不断提高,为各种应用领域提供了更加可靠和精确的地物信息。
空间后方交会程序设计

单片空间后方交会程序设计专业:测绘工程班级:测绘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。
第五讲 单片空间后方交会

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) 解算法方程,迭代求得未知数的改正数。 ) 解算法方程,迭代求得未知数的改正数。
单片空间后方交会程序设计

单片空间后方交会程序设计
1 目的
用程序设计语言(VC或者VB)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并评定精度。
本实验的目的在于让学生深入理解单片空间后方交会的原理,体会在有多余观测情况下,用最小二乘平差方法编程实现解求影像外方位元素的过程。
通过上机调试程序加强动手能力的培养,通过对实验结果的分析,增强学生综合运用所学知识解决实际问题的能力。
2. 内容
利用一定数量的地面控制点,根据共线条件方程求解像片外方位元素。
3. 数据准备
已知航摄仪的内方位元素:f
k =153.24mm,x
=y
=0.0mm,摄影比例尺为1:50000;
4个地面控制点的地面坐标及其对应像点的像片坐标:
4. 操作步骤
上机调试程序并打印结果。
单张像片的空间后方交会原理

单像空间后方交会原理非常简单,稍稍懂一点线性代数和微分学知识就很容易理解。
但它的意义很大,所有的基于视觉技术的定位(测量)都是从它扩展来的,没有它就没有后面的复杂算法的演进,以面向更复杂的场景以及需求。
这块内容一般来说就是在已知地面上若干点的地面坐标以后,反求该相应摄影光束的外参数,当用以作摄影机的标定时,还可借以同时求出摄影的内参数。
具体的说就是一个多元线性模型,根据不同的需求可以基于它进一步构建各种平差模型。
单像空间后方交会实验报告(c++版)

单像空间后方交会实验报告(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,有四对点的像点坐标与相应的地面坐标如下表。
五上、数字摄影测量学单片空间后方交会

总误差方程
法方程
V Ax L
x (AT A) 1 (AT L)
X s Ys V1 A1 l1 Z V2 A2 l2 s V , A , L , x , Vn An ln T T li xi ( xi ) yi ( yi ) , Vi v xi v yi a11 a12 a13 a14 a15 a16 Ai a21 a22 a23 a24 a25 a26
已知点必须多余点, 数据处理方法采用 最小二乘法!
这是所有测量的一个统一的基本原则! 摄影测量也不例外。
二、误差方程与法方程
已知值 x0 , y0 , f ,m, X, Y, Z 观测值 x , y 相应改正数 vx,vy 未知数 Xs, Ys, Zs, , , 泰勒级数展开
四、空间后方交会的精度
求解各未知数的精度可以通过法方程系数矩阵 求逆的方法,解出相应的权倒数 Qii
mi m0 Qii 按下式计算第i未知数的中误差:
式中,m0为单位权中误差,计算公式 为: m [VV ] 0 2n 6 ,其中n为控制点的点数。
空间后方交会用到的已知点越多,空间后方交会 的精度越高,此外空点的分布也空间后方交会计算 的精度。空间后方交会使用的控制点应当避免位于 一个圆柱面上,否则,会出现解不唯一的情况。
偏导数 1
x f X Z 2 ( Z X) X s Z X s X s f 2 ( a1Z a3 X ) Z 1 X (a1 f f a3 ) Z Z 1 (a1 f a3 x) Z
偏导数 2
x f X Z 2 ( Z X) Z
单像空间后方交会

(x)、(y)——函数x、y在展开点(未知数近 似值处)的近似值; ——外方位元素(未知数)的改正数。 dX s ......, dκ
返回目录
第三章 单张航摄像片解析
§3-7 单像空间后方交会
• • • • • 每次迭代计算过程中,给定未知数(即外 方位元 素)的近似值后,即可计算得到展开式中未知数的 dX s ......, dκ 偏导系数值,从而组成线性方程组解算 。 偏导系数表达示例: X x = − f Z 设
V = ∂y dX + ∂y dY + ∂y dZ + ∂y dφ + ∂y dω + ∂y dκ −[ y − ( y)] •y s s s ∂Xs ∂Ys ∂Zs ∂φ ∂ω ∂κ
返回目录
第三章 单张航摄像片解析
§3-7 单像空间后方交会
• 也可写成(设有n个控制点) + d dφ + e dω + f dκ −l Vx1 = a11dXs + b11dYs + c11dZs 11 11§3-7 单像空间后方交会
• 一、空间后方交会的基本公式 空间后方交会的基本公式 后方交会
x = − f y = − f a1 ( X − X s ) + b (Y − Ys ) + c1 (Z − ZS ) 1 a3 ( X − X s ) + b3 (Y − Ys ) + c3 (Z − Zs ) a2 ( X − X s ) + b2 (Y − Ys ) + c2 (Z − Zs ) a3 ( X − X s ) + b3 (Y − Ys ) + c3 (Z − Zs )
y = − f Y Z
网上搜的摄影测量题目

《摄影测量》课程期末统一考试题(卷)[B]一、名词解释(20分,每个4分)1、单片空间后方交会:在摄影之后,利用一定数量的地面控制点,根据共线方程条件方程式反求像片的外方位元素。
P502、同名核线:同一核面与左、右两像片相交的两条核线称为同名核线。
P723、影像匹配:4、影像的外方位元素:在恢复内方位元素(即恢复了摄影光束)的基础上,确定摄影光束在摄影瞬间的空间位置和姿态的参数,称为外方位元素,一张像片的外方位元素包括六个参数,其中三个是直线元素,用于描述摄影中心的空间坐标值;另外三个是角元素,用于描述像片的空间姿态。
P375、解析相对定向:根据同名光线对对相交这一立体像对对内在的几何关系,通过测量的像点坐标,用解析计算的方法解求相对定向元素,建立于地面相似的立体模型,确认模型点的三维坐标。
P77(相对定向与像片的绝对位置无关,不需要地面控制点)二、填空题(20分,每空1分)1、表示航摄像片的外方位角元素可以采用、和三种转角系统。
2、航摄像片是所覆盖地物的中心投影投影,地形图是所表示内容的正射投影投影。
3、摄影测量加密按数学模型可分为航带法、独立模型法和光束法三种方法。
4、摄影测量中常用的坐标系有像平面坐标系、像空间坐标系、像空间辅助坐标系、摄影测量坐标系、地面摄影测量坐标系和地面测量坐标系。
5、要将地物点在摄影测量坐标系中的模型坐标转换到地面摄影测量坐标系,最少需要个和个地面控制点。
6、摄影测量的发展经历了模拟摄影测量、解析摄影测量和数字摄影测量三个阶段。
三、简答题(30分)1、请说明实现自动相对定向的方法原理和关键技术2、什么是数字高程模型?并说明DEM的几种常用的表示形式及特点。
四、综合题(30分)1、推导摄影中心点、像点与其对应物点三点位于一条直线上的共线条件方程,说明式中各符号的意义,用图示意航摄像片的内、外方位元素,并简要叙述以上方程在摄影测量中的主要用途。
2、简述一种框幅式航空影像制作其核线影像的方法。
单像空间后方交会原理

单像空间后方交会原理你知道单像空间后方交会吗?这可是摄影测量里一个超有趣的概念呢!咱们先来说说啥是单像空间后方交会。
想象一下,你拿着相机拍了一张照片,这张照片里有好多好多的景物。
那单像空间后方交会呢,就是通过这一张照片里的信息,去算出拍摄这张照片的时候,相机在空间里的位置和姿态。
比如说,照片里有一座山,还有一条河,还有几棵大树。
那咱们怎么通过这些东西来知道相机当时在哪,朝哪个方向呢?这就用到单像空间后方交会啦!这当中有几个关键的东西哦。
一个是控制点,就好像是我们的“小帮手”。
这些控制点是我们事先知道它们在空间里准确位置的点。
比如说,有个特别明显的大石头,我们知道它在地球上的坐标是多少。
然后呢,还有像片的内方位元素。
这就像是相机的“小秘密”,比如说相机的焦距啦等等。
那怎么通过这些来算出相机的位置和姿态呢?这就像是一个解谜的过程!咱们得先把照片上控制点的像点坐标找出来,这就像是在照片里给这些控制点“定位”。
然后呢,根据一些数学公式和算法,把这些坐标啊、内方位元素啊、控制点的空间坐标啊等等都放到一起,就像是把一堆拼图的碎片拼起来。
这个过程可不容易哦,得算好多好多的数学式子。
但是别担心,咱们聪明的科学家们早就想出了办法,有各种软件和工具能帮咱们完成这些复杂的计算。
你可能会想,这有啥用啊?用处可大啦!比如说,我们要做地图,要对一个地方进行测量,单像空间后方交会就能帮我们得到相机的位置和姿态,这样就能更准确地知道照片里的东西在实际空间里的位置啦。
而且哦,现在科技越来越发达,单像空间后方交会的精度也越来越高。
这就像是我们的眼睛越来越厉害,能看得更清楚,更准确!想象一下,如果没有单像空间后方交会,那我们看到的照片就只是一张好看的图片,没办法知道那么多背后的信息。
但是有了它,一张照片就像是一个装满了秘密的宝盒,我们可以一点点地解开,发现更多有趣的东西。
怎么样,是不是觉得单像空间后方交会很神奇很有趣呀?希望我讲得能让你明白这个有点复杂但又超级酷的原理!。
摄影测量实习报告-单片空间后方交会.doc

摄影测量实习报告实习内容:单片空间后方交会编程实习者:李友兵学号:0810050121指导老师:张金平老师实习时间:2011.05.30——2011.06.03一、实习目的与任务此次摄影测量实习主要是要自主编程实现单像空间后方交会,通过已知的内方位元素和控制点像点坐标和地面坐标求解六个外方位元素,在此过程中深入理解单像空间后方交会的原理和对编程的熟悉和理解(我用的是C语言编程),和对时间的合理运用,对知识的综合运用,培养理论的实际运用能力,任务是在一个星期内自主完成。
二、单片空间后方交会理论基础单像空间后方交会:是通过以像点平面坐标为观测值,以控制点坐标为已知值,利用共线条件方程和最小二乘原理,运用间接平差方法,通过迭代求解6个外方位元素。
程序设计的思路与流程三、程序设计的思路与流程(编程框架和步骤)1、根据内方位元素和已知的数据将控制点的框标坐标转换为像平面坐标系坐标:x=x′-x0,y=y′-y02、确定未知数的初始值:角元素初始值κ0=ω0=Φ0=0;线元素初始值Zs0=H=mf,Xs0=(X1+X2+X3+X4)/4,Ys0=(Y1+Y2+Y3+Y4)/43、利用角元素初始值计算方向余弦值组成旋转矩阵Ra1=cosΦ*cosκ-sinΦ*sinω*sinκ,a2=-cosΦ*sinκ-sinΦ*sin ω*cosκ,a3=-sinΦ*cosωb1=cosω*sinκ,b2=cosω*cosκ,b3=-sinωc1=sinΦ*cosκ+cosΦ*sinω*sinκ,c2=-sinΦ*sinκ+cosΦ*sin ω*cosκ,c3=cosΦ*cosω4、逐点计算控制点的像点坐标的近似值,共线方程为:x=(-f*(a1*(X-Xs)+b1*(Y-Ys)+c1*(Z-Zs)))/(a3*(X-Xs)+b3*(Y-Ys) +c3*(Z-Zs))y=(-f*(a2*(X-Xs)+b2*(Y-Ys)+c2*(Z-Zs)))/(a3*(X-Xs)+b3*(Y-Ys)+c3*(Z-Zs))(x)=(-f*(a1*(X-Xs)+b1*(Y-Ys)+c1*(Z-Zs)))/(a3*(X-Xs)+b3*(Y-Y s)+c3*(Z-Zs))(y)=(-f*(a2*(X-Xs)+b2*(Y-Ys)+c2*(Z-Zs)))/(a3*(X-Xs)+b3*(Y-Y s)+c3*(Z-Zs))5、组成误差方程:Vx=a11*dXs+a12*dYs+a13*dZs+a14*dΦ+a15*dω+a16*dκ+(x)-xVy=a21*dXs+a22*dYs+a23*dZs+a24*dΦ+a25*dω+a26*dκ+(y)-y系数求解(是共线方程分别外方位元素求导,是共线方程线性化的系数):变量代换A= a1*(X-Xs)+b1*(Y-Ys)+c1*(Z-Zs)B= a2*(X-Xs)+b2*(Y-Ys)+c2*(Z-Zs)C= a3*(X-Xs)+b3*(Y-Ys)+c3*(Z-Zs)a11=(a1*f+a3*x)/C,a12=(b1*f+b3*x)/C,a13=(c1*f+c3*f)/C,a14=y *sinω-((x*(x*cosκ-y*sinκ))/f+f*cosκ)cosω,a15=-f*sin κ-(x*(x*sinκ+y*cosκ)/f),a16=ya21=(a2*f+a3*x)/C,a22=(b2*f+b3*x)/C,a23=(c2*f+c3*x)/C,a24=-xsinω-((x*(x*cosκ-y*sinκ))/f-f*sinκ)cos ω,a25=-f*cosκ-(y*(x*sinκ+y*cosκ)/f),a26 =-x 误差方程的常系数(是像点坐标观测值与计算的近似值的差值):lx=x-(x) ,ly=y-(y)6、组成法方程,解求外方位元素改正数X=(A T A)-1A T L(A为误差方程的系数矩阵,L为误差方程的常系数矩阵,通过步骤5求得,此处先求A T A再求矩阵的逆矩阵,解得的改正数加上相应的近似值得到外方位元素新的近似值)7、检查计算是否收敛:将求得的外方位元素改正数与规定的限差比较,大于限差继续迭代,小于限差则终止。
单片空间后方交会

单片空间后方交会
定义:根据影像覆盖范围内一定数量的分布合理的地面控制点(已知其像点和地面点的坐标),利用共线条件方程求解像片外方位元素。
有定义可知道,有已知值x0 , y0 , f , m, X, Y, Z;观测值x,y;未知数Xs, Ys, Zs, ?0?1, ω, κ。
首先我们还是先看误差方程,就是前面所讲的共线方程进行泰勒级数展开。
好吧,泰勒级数还要学习一下,基本都忘了。
其实吧,看到这个公式,还是不太懂的,还需回去学习测量平差。
对于这个公式,就是把共线条件方程进行了线性化,然后进行求解。
关键的是现在要算出公式中的偏导数,计算过程就不写了,有点长。
关键是先把共线方程的分子和分母先看做一个整体,计算过程还用到正交矩阵的性质:即正交矩阵的每一个元素等于它的代数余子式。
计算结果如下:
好吧,我也理解得不太清楚,下来补补测量平差、最小二乘法等知识。
总结一下计算过程:
?0?9获取已知数据m, x0 , y0 , f, Xtp, Ytp, Ztp
?0?9量测控制点像点坐标x,y
?0?9确定未知数初值Xs0, Ys0, Zs0, ?0?10, ω0, κ0
?0?9组成误差方程式并法化
?0?9解求外方位元素改正数
?0?9检查迭代是否收敛
嗯,要掌握单张空间后方交会,就应该用编程去实现,去恶补一下知识。
摄影测量程序汇总(后方交会+前方交会+单模型光束法平差)

程序运行环境为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.单模型光束法严密平差缺少已知数据进行验证,因此如果有已知数据请代入已知数据进行验证。
单张像片空间后方交会

外方位元素的计算
当一张像片上至少有三个控制点时, 当一张像片上至少有三个控制点时,误差方程矩阵形式
V = Ax − l
x = ( A T A ) −1 ( A T l )
x , l = y a 14 a 15 a 24 a 25
σ
0
=
V TV 2n − 6
∆ X s ∆Ys ∆Z vx V = x = ∆ ϕs , v y ∆ω ∆κ a 12 a 13 a A = 11 a 22 a 23 a 21
X X −Xs Y = R−1 Y −Y s Z −Z Z s
a 1 a1 a 2 b1 a 3 c1
0 = a 2 c1 − a1 c 2 a c − a c 1 3 3 1 0 = b3 − b 2 − b3 0 b1
在竖直摄影情况 误差方程系 数的近似值
f a11 = − , H
ϕ =ω =κ = 0
Z − Z
s
= H
x a12 = 0, a13 = − H f y a21 = 0, a22 = − , a23 = − H H 2 x xy a14 = − f (1+ 2 ), a15 = − , a16 = y f f xy y2 a24 = − , a25 = − f (1+ 2 ), a26 = −x f f
已知值 x0 , y0 , f , m, X, Y, Z 观测值 x,y 未知数 Xs, Ys, Zs, ϕ, ω, κ , 泰勒级数展开
按泰勒级数展开,取小值一次项
∂x ∂x ∂x ∂x x = (x) + ΔX + ∆Y + ∆Z + ∆ϕ ∂X ∂Y ∂Z ∂ϕ ∂x ∂x + ∆ω + ∆κ ∂ω ∂κ ∂y ∂y ∂y ∂y y = ( y) + ∆X + ∆Y + ∆Z + ∆ϕ ∂X ∂Y ∂Z ∂ϕ ∂y ∂y + ∆ω + ∆κ ∂ω ∂κ
摄影测量实习报告-单片空间后方交会

摄影测量实习报告实习内容:单片空间后方交会编程实习者:李友兵学号:**********指导老师:张金平老师实习时间:2011.05.30——2011.06.03一、实习目的与任务此次摄影测量实习主要是要自主编程实现单像空间后方交会,通过已知的内方位元素和控制点像点坐标和地面坐标求解六个外方位元素,在此过程中深入理解单像空间后方交会的原理和对编程的熟悉和理解(我用的是C语言编程),和对时间的合理运用,对知识的综合运用,培养理论的实际运用能力,任务是在一个星期内自主完成。
二、单片空间后方交会理论基础单像空间后方交会:是通过以像点平面坐标为观测值,以控制点坐标为已知值,利用共线条件方程和最小二乘原理,运用间接平差方法,通过迭代求解6个外方位元素。
程序设计的思路与流程三、程序设计的思路与流程(编程框架和步骤)1、根据内方位元素和已知的数据将控制点的框标坐标转换为像平面坐标系坐标:x=x′-x0,y=y′-y02、确定未知数的初始值:角元素初始值κ0=ω0=Φ0=0;线元素初始值Zs0=H=mf,Xs0=(X1+X2+X3+X4)/4,Ys0=(Y1+Y2+Y3+Y4)/43、利用角元素初始值计算方向余弦值组成旋转矩阵Ra1=cosΦ*cosκ-sinΦ*sinω*sinκ,a2=-cosΦ*sinκ-sinΦ*sin ω*cosκ,a3=-sinΦ*cosωb1=cosω*sinκ,b2=cosω*cosκ,b3=-sinωc1=sinΦ*cosκ+cosΦ*sinω*sinκ,c2=-sinΦ*sinκ+cosΦ*sin ω*cosκ,c3=cosΦ*cosω4、逐点计算控制点的像点坐标的近似值,共线方程为:x=(-f*(a1*(X-Xs)+b1*(Y-Ys)+c1*(Z-Zs)))/(a3*(X-Xs)+b3*(Y-Ys) +c3*(Z-Zs))y=(-f*(a2*(X-Xs)+b2*(Y-Ys)+c2*(Z-Zs)))/(a3*(X-Xs)+b3*(Y-Ys) +c3*(Z-Zs))(x)=(-f*(a1*(X-Xs)+b1*(Y-Ys)+c1*(Z-Zs)))/(a3*(X-Xs)+b3*(Y-Y s)+c3*(Z-Zs))(y)=(-f*(a2*(X-Xs)+b2*(Y-Ys)+c2*(Z-Zs)))/(a3*(X-Xs)+b3*(Y-Y s)+c3*(Z-Zs))5、组成误差方程:Vx=a11*dXs+a12*dYs+a13*dZs+a14*dΦ+a15*dω+a16*dκ+(x)-xVy=a21*dXs+a22*dYs+a23*dZs+a24*dΦ+a25*dω+a26*dκ+(y)-y系数求解(是共线方程分别外方位元素求导,是共线方程线性化的系数):变量代换A= a1*(X-Xs)+b1*(Y-Ys)+c1*(Z-Zs)B= a2*(X-Xs)+b2*(Y-Ys)+c2*(Z-Zs)C= a3*(X-Xs)+b3*(Y-Ys)+c3*(Z-Zs)a11=(a1*f+a3*x)/C,a12=(b1*f+b3*x)/C,a13=(c1*f+c3*f)/C,a14=y *sinω-((x*(x*cosκ-y*sinκ))/f+f*cosκ)cosω,a15=-f*sin κ-(x*(x*sinκ+y*cosκ)/f),a16=ya21=(a2*f+a3*x)/C,a22=(b2*f+b3*x)/C,a23=(c2*f+c3*x)/C,a24=-xsinω-((x*(x*cosκ-y*sinκ))/f-f*sinκ)cos ω,a25=-f*cosκ-(y*(x*sinκ+y*cosκ)/f),a26 =-x 误差方程的常系数(是像点坐标观测值与计算的近似值的差值):lx=x-(x) ,ly=y-(y)6、组成法方程,解求外方位元素改正数X=(A T A)-1A T L(A为误差方程的系数矩阵,L为误差方程的常系数矩阵,通过步骤5求得,此处先求A T A再求矩阵的逆矩阵,解得的改正数加上相应的近似值得到外方位元素新的近似值)7、检查计算是否收敛:将求得的外方位元素改正数与规定的限差比较,大于限差继续迭代,小于限差则终止。
05单片空间后方交会

m, x0 , y0 , f , Xtp, Ytp, Ztp
量测控制点像点坐标 x,y
确定未知数初值
Xs0, Ys0, Zs0, 0, 0, 0
组成误差方程式并法化
解求外方位元素改正数
检查迭代是否收敛
本讲参考资料 教材
张剑清,潘励,王树根 编著,《摄影测量学》,武汉大学出版社
内定向问题需要借助影像的框标来解决
内定向通常采用多项式变换公式,形式为:
X AX' t
其中: X’为量测的像点仪器坐标或扫描坐 标, X为变换后的像点坐标,A为变换矩阵, t为变换参数。
一、影像内定向
常用的变换公式有:
x
线性正形变换公式(4参数) y
a0 b0
a1x' a2 x'
Z s
x0
x
vy
y
y
y
y X s
X s
y Ys
Ys
y Z s
Z s
y0
y
若用 a11, a12...... 表示各项系数,则上式可写成:
vx a11X s a12Ys a13Zs a14s a15s a16s lx vy a21X s a22Ys a23Zs a24s a25s a26s ly
Ys ) c2 (Z Zs ) Ys ) c3 (Z Zs )
f
Y Z
X YZ
a1 aa32
b1 b2 b3
c1 X X s
单片空间后方交会C#源代码

单片空间后方交会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类包含三个方法:矩阵乘法,矩阵转置,矩阵求逆///。
单像空间后方交会

单像空间后方交会测绘学院 成晓倩1 概述1.1 定义利用一定数量的地面控制点和对应像点坐标求解单张像片外方位元素的方法称为空间后方交会。
1.2 所需控制点个数与分布共线条件方程的一般形式为:⎪⎪⎩⎪⎪⎨⎧-+-+--+-+--=--+-+--+-+--=-)()()()()()()()()()()()(33322203331110S S S S S S S S S S S S Z Z c Y Y b X X a Z Z c Y Y b X X a f y y Z Z c Y Y b X X a Z Z c Y Y b X X a f x x (1)式中包含有六个外方位元素,即κωϕ、、、、、S S S Z Y X ,只有确定了这六个外方位元素的值,才能利用共线条件方程真正确定一张像片的任一像点与对应地面点的坐标关系。
个数:对任一控制点,我们已知其地面坐标)(i i i Z Y X 、、和对应像点坐标)(i i y x 、,代入共线条件方程可以列出两个方程式,因此,只少需要3个控制点才能解算出六个外方位元素。
在实际应用中,为了避免粗差,应有多余检查点,因此,一般需要4~6个控制点。
分布:为了最有效地控制整张像片,控制点应均匀分布于像片边缘,如下图所示。
由于共线条件方程是非线性的,直接答解十分困难,所以首先将共线方程改化为线性形式,然后再答解最为简单的线性方程组。
2 空间后方交会的基本思路分布合理 分布合理 分布不合理2.1 共线条件方程线性化的基本思路在共线条件方程中,令)()()()()()()()()(333222111S S S S S S S S S Z Z c Y Y b X X a Z Z Z c Y Y b X X a Y Z Z c Y Y b X X a X -+-+-=-+-+-=-+-+-= (2) 则共线方程变为⎪⎪⎩⎪⎪⎨⎧-=--=-ZY fy y Z Xf x x 00 (3) 对上式两侧同乘Z ,并移至方程同侧,则有⎩⎨⎧=-+=-+0)(0)(00Z y y Y f Z x x X f (4) 令⎩⎨⎧-+=-+=Z y y Y f Fy Zx x X f Fx )()(00 (5) 由于上式是共线方程的变形,因此,Fy Fx 、是κωϕ、、、、、S S S Z Y X 的函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主方法: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。