文中有详细注释,根据《摄影测量学(第三版)》(武汉大学出版)进行编写
import numpy as np
from numpy import *
from math import*
from numpy.linalg import inv
print('坐标数据并保存为CSV格式\n') # 读取数据为矩阵形式
original_data1 = np.loadtxt(open('Coordinat_Date.csv'), delimiter=",", skiprows=0)
# 输入计算参数,以数组的形式
print("请依次输入比例尺,主距,x0,y0,迭代次数,均以逗号隔开")
A1 = input(" 比例尺,主距,x0,y0,迭代次数: ").split()
B = list(map(int, A1))
print(B)
m = B[0]
f1 = B[1]
x01, y01 = B[2], B[3]
num1 = B[4]
# 建立后方交会的类,用于面向对象编程
class Resection():
# 初始化参数
def __init__(self):
self.original_data = original_data1
# 读取数据为矩阵形式
self.f = f1
self.x0, y0 = x01, y01
self.num = num1
self.xy = []
self.XYZ = []
self.fi, self.w, self.k = 0, 0, 0
# 《摄影测量学》P.78 一般相片倾角小于3°所以外方位元素近似取φ,ω,κ=0,书中原话
# 读取影像坐标,存到xy列表,相应地面点坐标存到XYZ列表
self.xuanzhuan = []
self.Xs0 = []
self.Ys0 = []
self.Zs0 = []
self.rotate = []
self.diedai = 0
# 建立转换方法函数 # 《摄影测量学》P.74
def coordinate(self, m):
for i in range(len(self.original_data)):
self.xy.append([self.original_data[i][0]/1000, self.original_data[i][1]/1000])
self.XYZ.append([self.original_data[i][2], self.original_data[i][3], self.original_data[i][4]])
# 定义系数矩阵A,常数项矩阵L
A = np.mat(np.zeros((len(self.xy*2), 6)))
L = np.mat(np.zeros((len(self.xy*2), 1)))
# 将xy和XYZ列表转化为矩阵
self.xy = np.mat(self.xy)
self.XYZ = np.mat(self.XYZ)
XYZ_CHA = np.mat(np.zeros((len(self.xy), 3))) # 便于推到偏导数建立的矩阵
sum_X = 0
sum_Y = 0
# Xs0 Ys0 取四个角上控制点坐标的平均值 Zs0=H=mf,# 《摄影测量学》P.78上方有详细说明
for i in range(len(self.original_data)):
sum_X = self.original_data[i][2]+sum_X
sum_Y = self.original_data[i][3]+sum_Y
self.Xs0 = 0.25*sum_X
self.Ys0 = 0.25*sum_Y
self.Zs0 = m * self.f
while(self.diedai
程序中的Coordinat_Date.csv格式如下:
-86.15,-68.99,36589.41,25273.32,2195.17
-53.4,82.21,37.63108,31324.51,728.69
-14.78,-76.63,39100.97,24934.98,2396.5
10.46,64.43,40426.54,30319.81,757.31
可以根据自己的需求使用不同的检验代码:表中数据每一行都以x,y,X,Y,Z的顺序排列
坐标数据并保存为CSV格式
请依次输入比例尺,主距,x0,y0,迭代次数,均以逗号隔开
比例尺,主距,x0,y0,迭代次数: 1200 1 1 1 20
[1200, 1, 1, 1, 20]
单位权中误差:
0.03808031015889729
对角线上外方位元素精度:
13.002322081468744
对角线上外方位元素精度:
205.3896722827482
对角线上外方位元素精度:
0.0346622511350548
对角线上外方位元素精度:
0.04088792697435863
对角线上外方位元素精度:
0.5470752369098285
原始数据如下(x,y,X,Y,Z):
[[-8.615000e+01 -6.899000e+01 3.658941e+04 2.527332e+04 2.195170e+03]
[-5.340000e+01 8.221000e+01 3.763108e+01 3.132451e+04 7.286900e+02]
[-1.478000e+01 -7.663000e+01 3.910097e+04 2.493498e+04 2.396500e+03]
[ 1.046000e+01 6.443000e+01 4.042654e+04 3.031981e+04 7.573100e+02]]
计算结果
[[5814720.85507374]]
[[-6723902.61979151]]
[[791.63275503]]
旋转矩阵
[[-0.94997338 0.30254713 0.07756161]
[-0.06446153 0.05306299 -0.99650842]
[-0.30560642 -0.95165621 -0.03090578]]
迭代次数为: 20
Process finished with exit code 0
有不好的地方,还请各位看官指正批评!