空间后方交会 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. 单片空间后方交会程序设计(代码共享)

    单片空间后方交会程序设计 1 目的 用程序设计语言(VC或者VB)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并评定精度.本实验的目的在于让学生深入理解单片空 ...

  2. 以下python语言关键字在异常处理_【单选题】以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( )...

    问题:[单选题]以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( ) 更多相关问题 进程从运行状态变为等待的原因可能是() 进程调度主要负责() 在下列叙述中,错误的一 ...

  3. python循环体执行的次数与其他不同的是_【单选题】下面Python循环体执行的次数与其他不同的是( )...

    [单选题]下面Python循环体执行的次数与其他不同的是( ) 更多相关问题 [判断题] 对频率百分数资料进行方差分析前,应该对资料数据作反正弦转换. [单选] ()是利用可燃气体与氧气混合燃烧的火焰 ...

  4. 下列python保留字中不用于表示分支结构_【单选题】下列Python保留字中,不用于表示分支结构的是...

    [单选题]下列Python保留字中,不用于表示分支结构的是 更多相关问题 A.butB.whileC.asD.although A.floatedB.bubbledC.driftedD.submerg ...

  5. 单向空间后方交会C++代码实现

    摄影测量作业 空间后方交会的代码 各位小伙伴要用的话 只需修改main函数里边的像点地面点坐标,摄影比例尺分母,焦距等这些已知元素就行. #include<iostream> #inclu ...

  6. 关于python文件打开模式的描述_【单选题】关于Python文件打开模式的描述,以下选项中描述错误的是 A. 覆盖写模式w B. 追加写模式a C. 创建写模式n D. 只读模式r...

    [单选题]关于Python文件打开模式的描述,以下选项中描述错误的是 A. 覆盖写模式w B. 追加写模式a C. 创建写模式n D. 只读模式r 更多相关问题 [单选,A2型题,A1/A2型题] 上 ...

  7. 空间后方交会前方交会 MFC实现 CSU 摄影测量学

    空间后方交会前方交会 MFC 实现 CSU 摄影测量学 空间后方交会前方交会 MFC 实现 CSU 摄影测量学 摄影测量学基础 一. 实验目的 二.实验内容与要求 三.设计与实现: 3.1设计思路 3 ...

  8. 空间后方交会c++程序和matlab(可直接运行)

    本文不详细说明空间后方交会的原理,只着重说明空间后方交会的程序,并附带一个样例. 样例来源:<摄影测量学>(第二版)武汉大学出版社,张剑清,潘励,王树根. 空间后方交会的误差方程式: 可以 ...

  9. 使用几何光学实现空间相对定位(python+opencv)

    我从2019年3月份开始学习python,在有一定的基础后,我看到学校有一个物理实验竞赛:北京联合大学第十二届物理实验竞赛,其中有一个题目是空间定位,即利用物理原理,自行搭建实验装置,实现物体的空间定 ...

  10. 表操作,数据操作,单表查询,python操作数据库

    1.表操作 创建 create table 删除 drop table 查看表结构 desc 表/show create table 表 修改 alter table 表名 rename 新表名 al ...

最新文章

  1. lodash 提取前N个元素 take
  2. 使用Pandas进行变量衍生
  3. 使用结构体的形式使一个函数返回多个数据
  4. SAP Spartacus 服务器端渲染编程规范
  5. 使用npm安装TypeScript
  6. How to connect iOS simulator to Chrome for debugging
  7. c语言用栈实现计算器加法运算,请问,用c语言做一个计算器 包括+-*/()的运算 用栈 该怎么做...
  8. vba循环通过键盘某个按键按下退出循环_[VBA]For Next与Do Loop循环
  9. c语言c程序由函数构成 每个函数完成相对独立的功能,17秋学期(1709)《C语言程序设计》在线作业  满分...
  10. win7中安装redis
  11. membercache java_Java开发中的Memcache原理及实现
  12. Android9王者荣耀卡顿,王者荣耀卡顿掉帧?教你如何让王者荣耀流畅爆表
  13. c语言手机程序代码,C语言必背18个经典程序(示例代码)
  14. 面试被问自己的“优点和缺点”如何机智应答
  15. php 清楚浏览器缓存,如何清除浏览器缓存
  16. 美图android手机刷机教程,美图手机如何刷机
  17. 鸿蒙1004鸿蒙,第1004章 【两成】
  18. 实践:手把手教你写滴滴打车 APP
  19. Qt 编程 keySight 34401A 万用表(串口232编程)
  20. 汉字如何应用在平面设计中

热门文章

  1. Sql Server 2008 配置服务器,并让客户端连接
  2. Python字符串地常规操作:取值,切片,查找,替换,分割,拼接,转义
  3. java获取中文首字母
  4. 【VirtualBoxUbuntu】VirtualBox中Ubuntu虚拟机磁盘碎片整理并压缩磁盘空间
  5. 常用软件的替代软件 (免费和自由软件)
  6. 2021-7-28-自动化运维Ansible
  7. 如何一次将蓝牙耳机连接到多个设备
  8. Spring-Aop及jdbc总结
  9. mysql联合主键及用法
  10. java集合根据条件筛选数据