from scipy.spatial import Delaunay
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
from numpy import *
import operator
from functools import reduce W = np.loadtxt('data.txt')
# print(W)
# print(W.data)
(m,n) = W.shape
matchedPoints1 = W[0:int(m/2),:].copy()
matchedPoints1 = double(matchedPoints1) #转为double
matchedPoints2=W[int(m/2 + 1):m,:].copy()#奇数时会丢失一个
matchedPoints2=double(matchedPoints2)
matchedPoints1 = mat(matchedPoints1)
matchedPoints2 = mat(matchedPoints2) # print(matchedPoints1)
# print(matchedPoints2)
k1=[[3483.7,-3.4942, 614.50],
[0.0000, 3485.2, 488.13],
[0.0000, 0.0000, 1.0000]
]
k1 = mat(k1) I=eye(3)
O=[[0],[0],[0]];
O = mat(O) k2=[[3464.6, -1.1771, 680.15],
[0.0000, 3462.7, 503.73],
[0.0000, 0.0000, 1.0000]
]
k2 = mat(k2)
R=[ [0.9989, 0.0002, -0.0476],
[-0.0008, 0.9999, -0.0120],
[0.0476, 0.0120, 0.9988]
]
R = mat(R) T=[ [279.48],
[-3.7650],
[1.9500]
]
T = mat(T) # test = hstack((I,O))
M1=k1*hstack((I,O))
M2=k2* hstack((R,T))
M1 = mat(M1)
M2 = mat(M2)
cameraMatrix1=double(M1).copy()
cameraMatrix2=double(M2).copy() fl=k1[0,0]
fr=k2[0,0]
Xl=matchedPoints1[:,0].copy()
Yl=matchedPoints1[:,1].copy()
# Xl=mat(Xl)
# Yl=mat(Yl)
Xr=matchedPoints2[:,0].copy()
Yr=matchedPoints2[:,1].copy() Tx=T[0]; #矩阵
Tz=T[2];
R1=R[0,0]
R2=R[0,1]
R3=R[0,2]
R7=R[2,0]
R8=R[2,1]
R9=R[2,2]
z = []
x = []
y = []
for k in range(0,int(m/2)):
zz = fl * (fr * Tx - Xr[k] * Tz)/(Xr[k] *(R7 * Xl[k] + R8 * Yl[k]
+ fl * R9) - fr * (R1 * Xl[k] + R2 * Yl[k] + fl * R3))
z.append(zz[0,0])
xx = z[k] * Xl[k] / fl;
x.append(xx[0,0])
yy = z[k] * Yl[k] / fl;
y.append(yy[0,0])
# print(k)
# z = mat(z)
# x = mat(x)
# y = mat(y)
# x=x.transpose()
# y=y.transpose()
# z=z.transpose()
# x = x[0,:].copy()
# y = y[0,:].copy()
# z = z[0,:].copy()
# x = [1.64546964617096,3.29082591875077,4.93606803026144]
# y = [3.29093929234191,3.29082591875077,3.29071202017429]
# z = [5732.32260636576,5732.12512657603,5731.92673234059]
print(x) #画图
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(x, y, z, linewidth=1, antialiased=True)
plt.show()