单片空间后方交会 python实现
空间后方交会 python实现
在学校上摄影测量课时,老师给了c的代码来实现后方交会
自己也闲暇时间在学习python,所以自己编程实现空间后方交会求解六个外方位元素(三个线元素,三个角元素)
就用书上的例题得数据,存成了csv格式:
没有设置精度标准,但是可以自己定义迭代次数,需要精度评定的话可以加在循环里。
例题里是四个像点和地面控制点,但写程序得时候没有针对四个点编,如果有更多的点位也是可以的。才疏学浅,应有很多效率更高的法,日后学习了,再多多改进。
题中应用的空间后方交会公式:
共线方程结算外方位元素公式:
进行线性化后:
系数阵元素:
像片倾角小于3°,所以外方位角元素近似取为0,近似后如下:
通过公式进行平差计算:
代码如下:
import numpy as np
from math import*
print('请将数据命名为坐标数据并保存为CSV格式\n')
original_data=np.loadtxt(open('坐标数据.csv'),delimiter=",",skiprows=0)
#读取数据为矩阵形式
print('原始数据如下(x,y,X,Y,Z):\n',original_data)
m=eval(input("请输入比例尺(m):"))
f=eval(input("请输入主距(m):"))
x0,y0=eval(input("请输入x0,y0(以逗号分隔):"))
num=eval(input('请输入迭代次数:'))
xy=[]
XYZ=[]
fi,w,k=0,0,0 #一般相片倾角小于3°所以外方位元素近似取φ,ω,κ=0
#读取影像坐标,存到xy列表,相应地面点坐标存到XYZ列表
for i in range(len(original_data)):xy.append([original_data[i][0]/1000,original_data[i][1]/1000])XYZ.append([original_data[i][2],original_data[i][3],original_data[i][4]])
#定义系数矩阵A,常数项矩阵L
A = np.mat(np.zeros((len(xy*2),6)))
L = np.mat(np.zeros((len(xy*2),1)))
#将xy和XYZ列表转化为矩阵
xy=np.mat(xy)
XYZ=np.mat(XYZ)
XYZ_CHA=np.mat(np.zeros((len(xy),3))) #便于推到偏导数建立的矩阵
sum_X=0
sum_Y=0
#Xs0 Ys0 取四个角上控制点坐标的平均值 Zs0=H=mf
for i in range(len(original_data)): sum_X=original_data[i][2]+sum_Xsum_Y=original_data[i][3]+sum_Y
Xs0=0.25*sum_X
Ys0=0.25*sum_Y
Zs0=m*f
diedai=0
while(diedai<num):#旋转矩阵a1=cos(fi)*cos(k)-sin(fi)*sin(w)*sin(k)a2=(-1.0) * cos(fi) * sin(k) - sin(fi) * sin(w) * cos(k)a3=(-1.0) * sin(fi) * cos(w)b1=cos(w) * sin(k)b2=cos(w) * cos(k)b3=(-1.0) * sin(w)c1=sin(fi) * cos(k) + cos(fi) * sin(w) * sin(k)c2=(-1.0) * sin(fi) * sin(k) + cos(fi) * sin(w) * cos(k)c3=cos(fi) * cos(w)xuanzhuan=np.mat([[a1,a2,a3],[b1,b2,b3],[c1,c2,c3]])for i in range(len(XYZ)):XYZ_CHA[i,0]=XYZ[i,0]-Xs0XYZ_CHA[i,1]=XYZ[i,1]-Ys0XYZ_CHA[i,2]=XYZ[i,2]-Zs0XYZ_=xuanzhuan.T*XYZ_CHA.Tfor i in range(len(XYZ)):
#系数阵:A[i*2,0]=-f/(Zs0-XYZ[i,2])A[i*2,1]=0A[i*2,2]=-xy[i,0]/(Zs0-XYZ[i,2])A[i*2,3]=-f*(1+pow(xy[i,0],2)/pow(f,2))A[i*2,4]=-(xy[i,0]*xy[i,1])/fA[i*2,5]=xy[i,1]A[i*2+1,0]=0A[i*2+1,1]=-f/(Zs0-XYZ[i,2])A[i*2+1,2]=-xy[i,1]/(Zs0-XYZ[i,2])A[i*2+1,3]=-(xy[i,0]*xy[i,1])/fA[i*2+1,4]=-f*(1+pow(xy[i,1],2)/pow(f,2))A[i*2+1,5]=-xy[i,0]
#常数项:L[i * 2,0]=xy[i,0]+f*(XYZ_[0,i]/XYZ_[2,i])L[i * 2 + 1,0] =xy[i,1]+f*(XYZ_[1,i]/XYZ_[2,i])
#结果:Result=((A.T*A).I)*A.T*LXs0+=Result[0]Ys0+=Result[1]Zs0+=Result[2]fi+=Result[3]w+=Result[4]k+=Result[5]diedai=diedai+1
a1=cos(fi)*cos(k)-sin(fi)*sin(w)*sin(k)
a2=(-1.0) * cos(fi) * sin(k) - sin(fi) * sin(w) * cos(k)
a3=(-1.0) * sin(fi) * cos(w)
b1=cos(w) * sin(k)
b2=cos(w) * cos(k)
b3=(-1.0) * sin(w)
c1=sin(fi) * cos(k) + cos(fi) * sin(w) * sin(k)
c2=(-1.0) * sin(fi) * sin(k) + cos(fi) * sin(w) * cos(k)
c3=cos(fi) * cos(w)
rotate=np.mat([[a1,a2,a3],[b1,b2,b3],[c1,c2,c3]])
print('计算结果\n',Xs0,'\n',Ys0,'\n',Zs0,'\n')
print('旋转矩阵\n',rotate)
print('迭代次数为:',diedai)
input()
运行结果:
刚学习python,边学边编,兴许有漏洞,算法还有改进空间,也参考了老师给的c代码得一些思路。仍有不足,还望读者多多包含。
参考文献:
[1]杨可明. 摄影测量学基础[M]. 北京:中国电力出版社,2011:38-50
单片空间后方交会 python实现相关推荐
- 单片空间后方交会程序设计(代码共享)
单片空间后方交会程序设计 1 目的 用程序设计语言(VC或者VB)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并评定精度.本实验的目的在于让学生深入理解单片空 ...
- 以下python语言关键字在异常处理_【单选题】以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( )...
问题:[单选题]以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( ) 更多相关问题 进程从运行状态变为等待的原因可能是() 进程调度主要负责() 在下列叙述中,错误的一 ...
- python循环体执行的次数与其他不同的是_【单选题】下面Python循环体执行的次数与其他不同的是( )...
[单选题]下面Python循环体执行的次数与其他不同的是( ) 更多相关问题 [判断题] 对频率百分数资料进行方差分析前,应该对资料数据作反正弦转换. [单选] ()是利用可燃气体与氧气混合燃烧的火焰 ...
- 下列python保留字中不用于表示分支结构_【单选题】下列Python保留字中,不用于表示分支结构的是...
[单选题]下列Python保留字中,不用于表示分支结构的是 更多相关问题 A.butB.whileC.asD.although A.floatedB.bubbledC.driftedD.submerg ...
- 单向空间后方交会C++代码实现
摄影测量作业 空间后方交会的代码 各位小伙伴要用的话 只需修改main函数里边的像点地面点坐标,摄影比例尺分母,焦距等这些已知元素就行. #include<iostream> #inclu ...
- 关于python文件打开模式的描述_【单选题】关于Python文件打开模式的描述,以下选项中描述错误的是
A. 覆盖写模式w B. 追加写模式a C. 创建写模式n D. 只读模式r...
[单选题]关于Python文件打开模式的描述,以下选项中描述错误的是 A. 覆盖写模式w B. 追加写模式a C. 创建写模式n D. 只读模式r 更多相关问题 [单选,A2型题,A1/A2型题] 上 ...
- 空间后方交会前方交会 MFC实现 CSU 摄影测量学
空间后方交会前方交会 MFC 实现 CSU 摄影测量学 空间后方交会前方交会 MFC 实现 CSU 摄影测量学 摄影测量学基础 一. 实验目的 二.实验内容与要求 三.设计与实现: 3.1设计思路 3 ...
- 空间后方交会c++程序和matlab(可直接运行)
本文不详细说明空间后方交会的原理,只着重说明空间后方交会的程序,并附带一个样例. 样例来源:<摄影测量学>(第二版)武汉大学出版社,张剑清,潘励,王树根. 空间后方交会的误差方程式: 可以 ...
- 使用几何光学实现空间相对定位(python+opencv)
我从2019年3月份开始学习python,在有一定的基础后,我看到学校有一个物理实验竞赛:北京联合大学第十二届物理实验竞赛,其中有一个题目是空间定位,即利用物理原理,自行搭建实验装置,实现物体的空间定 ...
- 表操作,数据操作,单表查询,python操作数据库
1.表操作 创建 create table 删除 drop table 查看表结构 desc 表/show create table 表 修改 alter table 表名 rename 新表名 al ...
最新文章
- lodash 提取前N个元素 take
- 使用Pandas进行变量衍生
- 使用结构体的形式使一个函数返回多个数据
- SAP Spartacus 服务器端渲染编程规范
- 使用npm安装TypeScript
- How to connect iOS simulator to Chrome for debugging
- c语言用栈实现计算器加法运算,请问,用c语言做一个计算器 包括+-*/()的运算 用栈 该怎么做...
- vba循环通过键盘某个按键按下退出循环_[VBA]For Next与Do Loop循环
- c语言c程序由函数构成 每个函数完成相对独立的功能,17秋学期(1709)《C语言程序设计》在线作业 满分...
- win7中安装redis
- membercache java_Java开发中的Memcache原理及实现
- Android9王者荣耀卡顿,王者荣耀卡顿掉帧?教你如何让王者荣耀流畅爆表
- c语言手机程序代码,C语言必背18个经典程序(示例代码)
- 面试被问自己的“优点和缺点”如何机智应答
- php 清楚浏览器缓存,如何清除浏览器缓存
- 美图android手机刷机教程,美图手机如何刷机
- 鸿蒙1004鸿蒙,第1004章 【两成】
- 实践:手把手教你写滴滴打车 APP
- Qt 编程 keySight 34401A 万用表(串口232编程)
- 汉字如何应用在平面设计中