首先得有像点坐标和对应物方点坐标,顺序和数量没要求
与航空摄影不同,这里的坐标系需要转换,故读进来的XYZ有变化。
误差方程式:V=At+CX+DX-L
import numpy as np
from math import *
# 读数据方法2
s = np.loadtxt('right.txt')
# 记得手动删除像点坐标文件里的重复点,
# 懒得写了
q = np.loadtxt('控制点坐标.txt')
# 点号,x,y
Pxy = []
for i in range(len(s)):
if s[i][0] > 100:
Pxy.append([s[i][0], s[i][1], s[i][2]])
print(len(Pxy))
# X,Y,Z,与Pxy相对应
ground_list = []
# 用来存点号的
temp = [0]*len(q)
for i in range(len(q)):
temp[i] = q[i][0]
temp_2 = []
for i in range(len(Pxy)):
position = temp.index(Pxy[i][0])
ground_list.append([q[position][2], q[position][3], -q[position][1]])
# print(ground_list)
# x,y
image_list = []
for i in range(len(Pxy)):
image_list.append([Pxy[i][1], Pxy[i][2]])
# 初值设定
# 内外方位元素(9)+畸变系数(4)
phi = 0.0
omega = 0.0
kappa = 0.0
Xs = 4500
Ys = -150
Zs = -800
# 单位mm
f = 36.0
x0 = 0.0
y0 = 0.0
k1 = 0.0
k2 = 0.0
p1 = 0.0
p2 = 0.0
# 迭代次数
num_ite = 0
# 方程内的矩阵
rotate = np.mat(np.zeros((3, 3)))#旋转矩阵
A = np.mat(np.zeros((len(image_list)*2, 9+4)))
# LL:V=(AX+CX2+DXad-L)=(AX-L),L
L = np.mat(np.zeros((len(image_list)*2,1)))
# 存改正数的
delta = [0]*(9+4)
# 存中误差
m = [0]*(9+4)
# 开始处理
while (True):
# 旋转矩阵
a1 = cos(phi)*cos(kappa)-sin(phi)*sin(omega)*sin(kappa)
a2 = (-1.0) * cos(phi) * sin(kappa) - sin(phi) * sin(omega) * cos(kappa)
a3 = (-1.0) * sin(phi) * cos(omega)
b1 = cos(omega) * sin(kappa)
b2 = cos(omega) * cos(kappa)
b3 = (-1.0) * sin(omega)
c1 = sin(phi) * cos(kappa) + cos(phi) * sin(omega) * sin(kappa)
c2 = (-1.0)