单像空间后方交会(python实现)
原理:空间后方交会是以单幅影像为基础,从该影像所覆盖地面范围内若干控制点的已知地面坐标和相应点的像坐标量测值出发,根据共线条件方程,解求该影像在航空摄影时刻的外方位元素Xs,Ys,Zs,φ,ω,κ。
算法:由于每一对像方和物方对应点可列出2个方程,因此若有3个已知地面坐标的控制点,则可列出6个方程,解求6个外方位元素的改正数△Xs,△Ys,△Zs,△φ,△ω,△κ。实际应用中为了提高解算精度,常有多余观测方程,通常是在影像的四个角上选取4个或均匀地选择更多的地面控制点,因而要用最小二乘平差方法进行计算。
在不考虑控制点误差和内方位元素误差、像点观测值视为等权的情况下,视、、、φ,ω,κ为待定参数(未知数),列出线性化误差方程式如下:
步骤:
1)获取数据。
2)确定Xs、Ys、Zs、φ,ω,κ的初值。
3)计算旋转矩阵R。
4)逐点计算像点坐标的近似值、。
5)逐点计算误差方程式的系数和常数项。
6)计算法方程的系数和常数项。
7)解求未知数Xs、Ys、Zs、φ,ω,κ的改正数。
8)检查计算是否收敛。
将所求得的外方位元素的改正数与规定的限差比较,通常对φ,ω,κ的改正数△φ,△ω,△κ给予限差,通常为0.000001弧度,当3个改正数均小于0.000001弧度时,迭代结束。否则用近似值加上改正数作为新的近似值,重复3)至7)步的计算。如果迭代次数超过某一规定的次数,则停止迭代,认为不收敛,输出中间结果和出错信息。
9)评定精度,计算单位权中误差,其中v为观测值的残差。
示例代码:
# -*- coding: utf-8 -*- import numpy as np
import math as m
##示例数据
X=[36589.41,37631.08,39100.97,40426.54]
Y=[25273.32,31324.51,24934.98,30319.81]
Z=[2195.17, 728.69, 2386.50, 757.31] x=[-86.15,-53.40,-14.78,10.46]
y=[-68.99,82.21,-76.63,64.43] fo = wo = ko = 0
xo = yo = 0
f = 153.24
Zsum = 0
Xsum=0
Ysum=0
for i in [0,1,2,3]:
###Zsum =Zsum + Z[i]
Xsum =Xsum + X[i]
Ysum =Ysum + Y[i] Zos = 7200
Xos = Xsum/4.
Yos = Ysum/4. def r_mat(f,w,k):
Rf = np.mat([[m.cos(f), 0, -m.sin(f)],
[0, 1, 0],
[m.sin(f), 0, m.cos(f)]]) Rw = np.mat([[1, 0, 0],
[0, m.cos(w), -m.sin(w)],
[0, m.sin(w), m.cos(w)]]) Rk = np.mat([[m.cos(k), -m.sin(k), 0],
[m.sin(k), m.cos(k), 0],
[0, 0, 1]]) R = Rf*Rw*Rk return R def xy_approximate(X,Y,Z,x,y,Xs,Ys,Zs,R):
x_apxm = [0,0,0,0]
y_apxm = [0,0,0,0] for i in [0,1,2,3]:
x_apxm[i] =x[i] - (xo - f*((R[0,0]*(X[i]-Xs)+R[1,0]*(Y[i]-Ys)+R[2,0]*(Z[i]-Zs))
/(R[0,2]*(X[i]-Xs)+R[1,2]*(Y[i]-Ys)+R[2,2]*(Z[i]-Zs))))
y_apxm[i] =y[i] - (yo - f*((R[0,1]*(X[i]-Xs)+R[1,1]*(Y[i]-Ys)+R[2,1]*(Z[i]-Zs))
/(R[0,2]*(X[i]-Xs)+R[1,2]*(Y[i]-Ys)+R[2,2]*(Z[i]-Zs)))) return x_apxm,y_apxm def a_parameter(X,Y,Z,Xs,Ys,Zs,x,y,w,k,R):
parameter = np.zeros((2,6))
mean = np.zeros((3,1))
minus = np.zeros((3,1)) minus = np.array([[X-Xs],
[Y-Ys],
[Z-Zs]])
mean = R.T * np.mat(minus) parameter[0][0] = (R[0,0]*f+R[0,2]*(x-xo))/mean[2]
parameter[0][1] = (R[1,0]*f+R[1,2]*(x-xo))/mean[2]
parameter[0][2] = (R[2,0]*f+R[2,2]*(x-xo))/mean[2]
parameter[1][0] = (R[0,1]*f+R[0,2]*(y-yo))/mean[2]
parameter[1][1] = (R[1,1]*f+R[1,2]*(y-yo))/mean[2]
parameter[1][2] = (R[2,1]*f+R[2,2]*(y-yo))/mean[2] parameter[0][3] = (y-yo)*m.sin(w)-(((x-xo)/f)*((x-xo)*m.cos(k)-(y-yo)*m.sin(k))+f*m.cos(k))*m.cos(w)
parameter[0][4] = -f*m.sin(k)-((x-xo)/f)*((x-xo)*m.sin(k)+(y-yo)*m.cos(k))
parameter[0][5] = y-yo
parameter[1][3] = -(x-xo)*m.sin(w)-(((y-yo)/f)*((x-xo)*m.cos(k)-(y-yo)*m.sin(k))-f*m.cos(k))*m.cos(w)
parameter[1][4] = -f*m.cos(k)-((y-yo)/f)*((x-xo)*m.sin(k)+(y-yo)*m.cos(k))
parameter[1][5] = -(x-xo) return parameter x_apxm = [0,0,0,0]
y_apxm = [0,0,0,0] R = np.mat(np.zeros((3,3)))
L = np.mat(np.zeros((8,1)))
A = np.mat(np.zeros((8,6))) f_cor=w_cor=k_cor = 1
flag = 0 while (abs(f_cor)>0.000001) | (abs(w_cor)>0.000001) | (abs(k_cor)>0.000001):
R = r_mat(fo,wo,ko)
x_apxm,y_apxm = xy_approximate(X,Y,Z,x,y,Xos,Yos,Zos,R) for i in [0,1,2,3]:
L[2*i] = x_apxm[i]
L[2*i+1] = y_apxm[i] for i in [0,1,2,3]:
A[2*i:2*i+2,:] = a_parameter(X[i],Y[i],Z[i],Xos,Yos,Zos,x[i],y[i],wo,ko,R) X_mat = np.mat(np.zeros((6,1)))
X_mat = (A.T*A).I*A.T*L f_cor = X_mat[3,0]
w_cor = X_mat[4,0]
k_cor = X_mat[5,0] Xos = Xos + X_mat[0,0]
Yos = Yos + X_mat[1,0]
Zos = Zos + X_mat[2,0]
fo = fo + X_mat[3,0]
wo = wo + X_mat[4,0]
ko = ko + X_mat[5,0] flag += 1
if flag <= 100:
print("第 %d 次迭代:f_cor = %f,w_cor = %f,k_cor = %f" %(flag,f_cor,w_cor,k_cor))
else :
print("级数不收敛,中间结果为:")
break if flag <= 100:
print("级数收敛,最终结果为:")
print(" Xs=%f,\n Ys=%f,\n Zs=%f,\n f=%f,\n w=%f,\n k=%f" %(Xos,Yos,Zos,fo,wo,ko))
print(" R = ", end='')
print(R) V = np.mat(np.zeros((8,1)))
V = A*X_mat - L
errorValue = m.sqrt((V.T*V)/(2*4-6))
print("单位权中误差:%f" %errorValue)
单像空间后方交会(python实现)的更多相关文章
- 单链表的python实现
首先说下线性表,线性表是一种最基本,最简单的数据结构,通俗点讲就是一维的存储数据的结构. 线性表分为顺序表和链接表: 顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存 ...
- Python与数据结构[0] -> 链表/LinkedList[0] -> 单链表与带表头单链表的 Python 实现
单链表 / Linked List 目录 单链表 带表头单链表 链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速.下面将利 ...
- 用最容易的方式学会单链表(Python实现)
单链表与数组 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列也会有如下缺点: 一个动态数组的长度可能超过实际存储数组元素所需 ...
- 大学生可用来接单,利用Python实现教务系统扩容抢课!
最近一学期一次的抢课大戏又来了,几家欢乐几家愁.O(∩_∩)O哈哈~(l我每次一选就过了hah,我还是有欧的时候滴).看着他们盯着教务系统就着急,何况我们那教务系统,不想说什么.emmm 想周围的朋友 ...
- Ceres-Solver库入门
示例1:求极值 首先我们以Ceres库官网中的Hello World例子来进行说明.这里例子的目的是为了计算方程取得最小值时x的值.从这个方程很容易看出来当x=10时,f(x)取得最小值0.这个方程虽 ...
- Python学习之单继承与多继承
继承 面向对象编程语言的一个主要功能就是“继承”. 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. (1) 单继承:python同时支持类的继承 ...
- python算法与数据结构-单链表(38)
一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...
- Python之路【第六篇】python基础 之面向对象(一)
一.三大编程范式 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比 ...
- python _、__和__xx__的区别
python _.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家.英文原文地址:Difference between _, __ and __xx__ in Pytho ...
随机推荐
- CSS3 变形、过渡、动画、关联属性浅析
一.变形 transform:可以对元素对象进行旋转rotate.缩放scale.移动translate.倾斜skew.矩阵变形matrix.示例: transform: rotate(90deg) ...
- java常用类String
String: String类: 代表字符串 是一个final类,代表不可变的字符序列 字符串是常量,用双引号引起来表示.值在创建后不可更改 String对象的字符内容是存储在一个字符数组Value[ ...
- Java 导出数据库表信息生成Word文档
一.前言 最近看见朋友写了一个导出数据库生成word文档的业务,感觉很有意思,研究了一下,这里也拿出来与大家分享一波~ 先来看看生成的word文档效果吧 下面我们也来一起简单的实现吧 二.Java 导 ...
- u检验粗浅理解
假设检验是以小概率事件,在一次实验中是不可能发生为前提(事实上是有可能发生的,但不是这样说的话,就落入一个圈,不能继续玩了),来否认原假设. u检验的定义: 已知从正态母体N(u,σ2)中抽得容量为n ...
- 深度学习tensorflow实战笔记(1)全连接神经网络(FCN)训练自己的数据(从txt文件中读取)
1.准备数据 把数据放进txt文件中(数据量大的话,就写一段程序自己把数据自动的写入txt文件中,任何语言都能实现),数据之间用逗号隔开,最后一列标注数据的标签(用于分类),比如0,1.每一行表示一个 ...
- 4、Hibernate的查询方式
一.Hibernate的查询方式:OID查询 1.OID检索:Hibernate根据对象的OID(主键)进行检索 1-1.使用get方法 Customer customer = session.get ...
- 通俗易懂了解Vuex
1.前言 在使用Vue进行开发的时候,关于vue组件通信的方式,除了通俗易懂了解Vue组件的通信方式这篇博文谈到三种通信方式,其实vue更提倡我们使用vuex来进行组件间的状态管理以及通信问题.Vue ...
- IPv6笔记-地址结构与分类
1.地址基础 IPv6地址由被划分为8个16位块的128位组成. 然后将每个块转换为由冒号符号分隔的4位十六进制数字. 2001::3238:00E1:0063:0000:0000:FEFB 每一块多 ...
- ActiveMQ消息队列从入门到实践(1)—JMS的概念和JMS消息模型
1. 面向消息的中间件 1.1 什么是MOM 面向消息的中间件,Message Oriented Middleware,简称MOM,中文简称消息中间件,利用高效可靠的消息传递机制进行平台无关的数据交流 ...
- 什么情况用ArrayList or LinkedList呢?
ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类.ArrayList 和 LinkedList 都实现 List 接口.先对List做一个简单的了解: ...