单像空间后方交会编程实现

文中有详细注释,根据《摄影测量学(第三版)》(武汉大学出版)进行编写

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

有不好的地方,还请各位看官指正批评!

你可能感兴趣的:(测绘专业相关编程,python,numpy,开发语言,pycharm,职场和发展)