Gavin
2021-02-04 4e5aaefc7162b700b95c750caeff35e6323631d3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# 1.去掉重叠部分
# 2.将数据和标准数据对比,旋转角度和平移使之初步重合
 
import pandas as pd
import numpy as np
import scipy.linalg as linalg 
import scipy.spatial.distance as dis
import matplotlib.pyplot as plt
import math
import cv2
 
 
# 计算距离矩阵
def EuclideanDistances(A, B):
    BT = B.transpose()
    vecProd = A * BT
    SqA =  A.getA()**2
    sumSqA = np.matrix(np.sum(SqA, axis=1))
    sumSqAEx = np.tile(sumSqA.transpose(), (1, vecProd.shape[1]))    
    SqB = B.getA()**2
    sumSqB = np.sum(SqB, axis=1)
    sumSqBEx = np.tile(sumSqB, (vecProd.shape[0], 1))    
    SqED = sumSqBEx + sumSqAEx - 2*vecProd   
    ED = (SqED.getA())**0.5
    return np.matrix(ED)
 
 
standard = pd.read_csv("D:\\standard.csv")
standardArray = np.array(standard).transpose()
data = pd.read_csv("D:\\Level1.csv")
 
# **************************去掉重叠部分*******************************
A = np.matrix(np.array(data[(data["0"].index % 2 == 0) & (data["0"] > 4000) & (data["0"] <61000)])[:,1:4:2])
B = np.matrix(np.array(data[(data["0"].index % 2 == 1) & (data["0"] > 4000) & (data["0"] <61000)])[:,1:4:2])
C = np.matrix(np.array(data[(data["0"] <= 4000) | (data["0"] >=61000)])[:,1:4:2])
 
# 根据距离计算
#distanceMatrix = EuclideanDistances(A , B)
#print(distanceMatrix)
#print(distanceMatrix.shape)
#overlapIndex = np.argwhere(distanceMatrix.diagonal()<5)
 
# 根据Y方向偏差计算
if(A.shape[0] > B.shape[0]):
    A = np.delete(A,A.shape[0]-1,0)
else: 
    if(A.shape[0] < B.shape[0]):
         B = np.delete(B,B.shape[0]-1,0)
yoffset = (A - B)[:,1]
overlapIndex =np.argwhere(np.abs(yoffset)>2.5)[:,0]
A = np.delete(A,overlapIndex,0)
D = np.r_[A,B,C]
 
#plt.scatter(D[:,0].getA(),D[:,1].getA(),color='r')
#plt.grid()
#plt.show()
# *********************************************************************
 
 
#dataArray = np.array(data).transpose()[1:4:2,:]/1000
dataArray = np.array(D).transpose()/1000
mirroring = np.array([[1,0],[0,-1]])
dataMirroring = mirroring.dot(dataArray)
 
# 只取第一个数据x方向
mean_x = dataMirroring.mean(axis = 1)[0]
mean_x_s = standardArray.mean(axis = 1)[0]
dataFrameMirroring  = pd.DataFrame(dataMirroring.transpose())
dataLine = np.array(dataFrameMirroring[(dataFrameMirroring[0] > 20) & (dataFrameMirroring[0] < 50)]).transpose()
dataLine_s = np.array(standard[(standard['0'] > 260) & (standard['0'] < 290)]).transpose()
 
# 只取y方向
mean_y = dataLine.mean(axis =1)[1]
mean_y_s = dataLine_s.mean(axis = 1)[1]
 
p = np.poly1d(np.polyfit(dataLine[0,:],dataLine[1,:],1))
yval = p(dataLine[0,:])
p_s = np.poly1d(np.polyfit(dataLine_s[0,:],dataLine_s[1,:],1))
 
phi = math.atan(p[1])*180/math.pi
rotateMatrix = cv2.getRotationMatrix2D((mean_x,mean_y),phi,1)
dataTrans1 = rotateMatrix.dot(np.r_[dataMirroring,np.ones(dataMirroring.shape[1]).reshape(1,dataMirroring.shape[1])])
transMatrix = np.array([[1,0,mean_x_s - mean_x],[0,1,mean_y_s - mean_y]])
dataTrans2 = transMatrix.dot(np.r_[dataTrans1,np.ones(dataTrans1.shape[1]).reshape(1,dataTrans1.shape[1])])
 
dataFrameTrans2 = pd.DataFrame(dataTrans2.transpose())
dataFrameTrans2[dataFrameTrans2[1]>443.71].to_csv("D:\\Level1Trans.csv")
 
plt.figure()
 
plt.scatter(dataTrans2[0,:] , dataTrans2[1,:])
plt.plot(standardArray[0,:] , standardArray[1,:],color='r')
 
plt.show()