import pandas as pd import numpy as np import matplotlib.pyplot as plt import sklearn.neighbors as ne import math import cv2 import socket import sys # 计算距离矩阵 def euclidean_distances(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) # 拼接 # x,y,z,1 def joint(path): matrix12 = np.matrix([[ 0.999994, -2.30179e-005, -0.00338715, 22.9331], [2.30258e-005, 1.0, 2.28675e-006, 47.9336], [ 0.00338715, -2.36473e-006, 0.999994, -30.3661], [ 0.0, 0.0, 0.0, 1.0]]) matrix13 = np.matrix([[ 0.999988, -1.16345e-005, -0.00490587, 48.7739], [1.17334e-005, 1.0, 2.01129e-005, 91.5852], [ 0.00490587, -2.01702e-005, 0.999988, -71.2706], [ 0.0, 0.0, 0.0, 1.0]]) matrix14 = np.matrix([[ 0.999985, -2.39867e-005, -0.00554939, 74.1329], [2.41246e-005, 1.0, 2.47831e-005, 142.206], [ 0.00554939, -2.49166e-005, 0.999985, -113.294], [ 0.0, 0.0, 0.0, 1.0]]) matrix15 = np.matrix([[ 0.999981, -4.08954e-005, -0.00621533, 98.6007], [4.11151e-005, 1.0, 3.52216e-005, 192.034], [ 0.00621533, -3.54764e-005, 0.999981, -163.256], [ 0.0, 0.0, 0.0, 1.0]]) matrix16 = np.matrix([[ 0.999975, -6.00843e-005, -0.00709497, 129.069], [6.03902e-005, 1.0, 4.28944e-005, 236.579], [ 0.00709497, -4.33218e-005, 0.999975, -226.242], [ 0.0, 0.0, 0.0, 1.0]]) matrix17 = np.matrix([[ 0.999971, -7.82354e-005, -0.00755777, 154.855], [7.86353e-005, 1.0, 5.26223e-005, 282.774], [ 0.00755777, -5.32151e-005, 0.999971, -279.706], [ 0.0, 0.0, 0.0, 1.0]]) matrix18 = np.matrix([[ 0.999965, -0.000100226, -0.00832648, 184.996], [ 0.000100805, 1.0, 6.90642e-005, 323.342], [ 0.00832648, -6.99012e-005, 0.999965, -354.304], [ 0.0, 0.0, 0.0, 1.0]]) matrix22 = np.matrix([[ 0.872123, 0.000773, 0.489285, 4942.74], [-0.000745115, 1.0, -0.000251729, -2.8314], [ -0.489285, -0.000145035, 0.872124, -598.535], [ 0.0, 0.0, 0.0, 1.0]]) matrix32 = np.matrix([[ -0.869019, -0.00114372, -0.494777, 64430.3], [-0.000670692, -0.999994, 0.00348957, 186874.4], [ -0.494778, 0.00336434, 0.869013, -325.194], [ 0.0, 0.0, 0.0, 1.0]]) data12 = pd.read_csv(path + "12.csv") print("data12 load completed!") data13 = pd.read_csv(path + "13.csv") print("data13 load completed!") data14 = pd.read_csv(path + "14.csv") print("data14 load completed!") data15 = pd.read_csv(path + "15.csv") print("data15 load completed!") data16 = pd.read_csv(path + "16.csv") print("data16 load completed!") data17 = pd.read_csv(path + "17.csv") print("data17 load completed!") data18 = pd.read_csv(path + "18.csv") print("data18 load completed!") data22 = pd.read_csv(path + "22.csv") print("data22 load completed!") data32 = pd.read_csv(path + "32.csv") print("data32 load completed!") dataArray12 = np.c_[np.array(data12),np.ones(np.array(data12).shape[0])] dataArray13 = np.c_[np.array(data13),np.ones(np.array(data13).shape[0])] dataArray14 = np.c_[np.array(data14),np.ones(np.array(data14).shape[0])] dataArray15 = np.c_[np.array(data15),np.ones(np.array(data15).shape[0])] dataArray16 = np.c_[np.array(data16),np.ones(np.array(data16).shape[0])] dataArray17 = np.c_[np.array(data17),np.ones(np.array(data17).shape[0])] dataArray18 = np.c_[np.array(data18),np.ones(np.array(data18).shape[0])] dataArray22 = np.c_[np.array(data22),np.ones(np.array(data22).shape[0])] dataArray32 = np.c_[np.array(data32),np.ones(np.array(data32).shape[0])] dataTrans12 = matrix12.dot(dataArray12.transpose()) dataTrans13 = matrix13.dot(dataArray13.transpose()) dataTrans14 = matrix14.dot(dataArray14.transpose()) dataTrans15 = matrix15.dot(dataArray15.transpose()) dataTrans16 = matrix16.dot(dataArray16.transpose()) dataTrans17 = matrix17.dot(dataArray17.transpose()) dataTrans18 = matrix18.dot(dataArray18.transpose()) dataTrans22 = matrix22.dot(dataArray22.transpose()) dataTrans32 = matrix32.dot(dataArray32.transpose()) dataTrans = np.r_[dataTrans12.transpose(), dataTrans13.transpose(), dataTrans14.transpose(), dataTrans15.transpose(), dataTrans16.transpose(), dataTrans17.transpose(), dataTrans18.transpose(), dataTrans22.transpose(), dataTrans32.transpose()] return dataTrans # 读取一行 # x:筛选线中心x # y:筛选线中心y # a:筛选线角度,为弧度制 且在(-pi/2,pi/2)之间 # r:筛选线宽度 def read_row1(dataFrame,x0,y0,a,r): t1 = (dataFrame[1] > math.tan(a) * dataFrame[0] + math.tan(a) * x0 + y0 - math.cos(a) * r) t2 = (dataFrame[1] < math.tan(a) * dataFrame[0] + math.tan(a) * x0 + y0 + math.cos(a) * r) dataRow = dataFrame[t1 & t2] return dataRow # knn数据分层,目前有问题 def level(dataFrame,trainFile): knn = ne.KNeighborsClassifier(n_neighbors = 5) dataSort = dataFrame.sort_values(by=0) testArray = np.array(dataSort) dataTrain = pd.read_csv(trainFile) trainArray = np.array(dataTrain) knn.fit(trainArray[:,1:3],trainArray[:,3]) predict = knn.predict(testArray[:,0:3:2]) result = np.c_[testArray,predict] resultDataFrame = pd.DataFrame(result) dataReAnalyze = resultDataFrame[((resultDataFrame[3]==2) | (resultDataFrame[3]==3)) & (((resultDataFrame[0] > 6500) & (resultDataFrame[0] < 8500 )) | ((resultDataFrame[0] > 58500) & (resultDataFrame[0] < 60500 ))) ] for index in range(0,dataReAnalyze.shape[0]-2,1): deltaX = dataReAnalyze.iloc[index+1][0]-dataReAnalyze.iloc[index][0] deltaY = np.abs(dataReAnalyze.iloc[index+1][2]-dataReAnalyze.iloc[index][2]) if(deltaX < 1 and deltaY > 10): if(dataReAnalyze.iloc[index + 1][2] > dataReAnalyze.iloc[index][2]): resultDataFrame.loc[dataReAnalyze.index.tolist()[index],3] = 3 resultDataFrame.loc[dataReAnalyze.index.tolist()[index + 1],3] = 2 else: resultDataFrame.loc[dataReAnalyze.index.tolist()[index],3] = 2 resultDataFrame.loc[dataReAnalyze.index.tolist()[index + 1],3] = 3 level1 = resultDataFrame[resultDataFrame[4]==1] level2 = resultDataFrame[resultDataFrame[4]==2] level3 = resultDataFrame[resultDataFrame[4]==3] # 展示分层 plt.scatter(level1[0],level1[2],c='r') plt.scatter(level2[0],level2[2],c='b') plt.scatter(level3[0],level3[2],c='g') plt.grid() plt.show() return level1 # 方法2数据分层 # x,y,z,1 # dataFrame:输入数据帧 # levelRange:x向范围 # tempLen:小片段长度 # level:分层界限 def level_1(dataFrame,levelRange,tempLen,levelSpec): level1 = np.array([[0,0,0,0]]) level2 = np.array([[0,0,0,0]]) level3 = np.array([[0,0,0,0]]) for index in range(levelRange[0],levelRange[1],tempLen): datatemp = dataFrame[(dataFrame[0] > index) & (dataFrame[0] < index + tempLen-1)]# 数据分成250一段 if(datatemp.shape[0]==0): continue dataSortedZ = datatemp.sort_values(by = 2 ,ascending = False)# Z向排序 dataArray = np.array(dataSortedZ) array1 = dataArray[:,2] #z列数据 array2 = np.r_[dataArray[:,2][0],dataArray[:,2]] #z列数据后移一位 array2 = np.delete(array2,array2.shape[0] -1 ) #z列数据删除第一位 arrayMinus = array2 - array1 #错位相减 m = np.argwhere(arrayMinus > levelSpec) if(m.shape[0] == 0): level1 = np.r_[level1, dataArray] else: if(m.shape[0] == 1): level1 = np.r_[level1, dataArray[0:m[0][0]:1,:]] #(0,m[0][0]) level2 = np.r_[level2, dataArray[m[0][0]:dataArray.shape[0]:1,:]] #(m[0][0],m.len) else: level1 = np.r_[level1, dataArray[0:m[0][0]:1,:]] level2 = np.r_[level2, dataArray[m[0][0]:m[1][0]:1,:]] level3 = np.r_[level3, dataArray[m[1][0]:dataArray.shape[0]:1,:]] level1 = np.delete(level1,0,axis = 0) level2 = np.delete(level2,0,axis = 0) level3 = np.delete(level3,0,axis = 0) level1DataFrame = pd.DataFrame(level1) level2DataFrame = pd.DataFrame(level2) level3DataFrame = pd.DataFrame(level3) # 展示分层 """ plt.scatter(level1[:,0],level1[:,2],c='r') plt.scatter(level2[:,0],level2[:,2],c='b') plt.scatter(level3[:,0],level3[:,2],c='g') plt.grid() plt.show() """ return level1DataFrame # 线轮廓度初步计算 # x,y,z,1 def profile1(dataFrame): standard = pd.read_csv("D:\\standard.csv") standardArray = np.array(standard).transpose() dataFrame = dataFrame.sort_values(by = 0) dataFrame = dataFrame.reset_index(drop = True) # **************************去掉重叠部分******************************* A = np.matrix(np.array(dataFrame[(dataFrame[0].index % 2 == 0) & (dataFrame[0] > 4000) & (dataFrame[0] <61000)])[:,0:3:2]) B = np.matrix(np.array(dataFrame[(dataFrame[0].index % 2 == 1) & (dataFrame[0] > 4000) & (dataFrame[0] <61000)])[:,0:3:2]) A1 = np.matrix(np.array(dataFrame[(dataFrame[0].index % 2 == 0) & (dataFrame[0] > 2600) & (dataFrame[0] <4000)])[:,0:3:2]) B1 = np.matrix(np.array(dataFrame[(dataFrame[0].index % 2 == 1) & (dataFrame[0] > 2600) & (dataFrame[0] <4000)])[:,0:3:2]) A2 = np.matrix(np.array(dataFrame[(dataFrame[0].index % 2 == 0) & (dataFrame[0] > 61000) & (dataFrame[0] <66000)])[:,0:3:2]) B2 = np.matrix(np.array(dataFrame[(dataFrame[0].index % 2 == 1) & (dataFrame[0] > 61000) & (dataFrame[0] <66000)])[:,0:3:2]) C = np.matrix(np.array(dataFrame[(dataFrame[0] <= 2600) | (dataFrame[0] >=66000)])[:,0:3:2]) # 根据距离计算 #distanceMatrix = EuclideanDistances(A , B) #print(distanceMatrix) #print(distanceMatrix.shape) #overlapIndex = np.argwhere(distanceMatrix.diagonal()<5) # 根据Y方向偏差计算 #==============Part1====================== 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] overlapIndexA =np.argwhere(yoffset>2.5)[:,0] A = np.delete(A,overlapIndexA,0) overlapIndexB =np.argwhere(yoffset<-2.5)[:,0] B = np.delete(B,overlapIndexB,0) #==============Part2======================= if(A1.shape[0] > B1.shape[0]): A1 = np.delete(A1,A1.shape[0]-1,0) else: if(A1.shape[0] < B1.shape[0]): B1 = np.delete(B1,B1.shape[0]-1,0) yoffset = (A1 - B1)[:,1] overlapIndexA =np.argwhere(yoffset>5)[:,0] A1 = np.delete(A1,overlapIndexA,0) overlapIndexB =np.argwhere(yoffset<-5)[:,0] B1 = np.delete(B1,overlapIndexB,0) #=============Part3======================== if(A2.shape[0] > B2.shape[0]): A2 = np.delete(A2,A2.shape[0]-1,0) else: if(A2.shape[0] < B2.shape[0]): B2 = np.delete(B2,B2.shape[0]-1,0) yoffset = (A2 - B2)[:,1] overlapIndexA =np.argwhere(yoffset>5)[:,0] A2 = np.delete(A2,overlapIndexA,0) overlapIndexB =np.argwhere(yoffset<-5)[:,0] B2 = np.delete(B2,overlapIndexB,0) D = np.r_[A,A1,A2,B,B1,B2,C] #plt.scatter(D[:,0].getA(),D[:,1].getA(),color='r') #plt.grid() #plt.show() # ********************************************************************* #dataArray = np.array(data).transpose()[1:4:2,:]/1000 D = np.array(pd.DataFrame(D).sort_values(by = 0)) 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() return dataFrameTrans2[dataFrameTrans2[1] > 443.71] # 先轮廓度二分法精确计算 def profile2(dataFrame): standard = pd.read_csv("D:\\standard.csv") standard = standard[standard['0'].index % 2 == 0] # 标准抽样 standardMatrix = np.matrix(standard) dataFrameSample = dataFrame[dataFrame[0].index % 5 == 0] dataMatrix = np.matrix(dataFrame) dataMatrixSample = np.matrix(dataFrameSample) seedStartP = 2.0 seedStartN = -2.0 seedP = seedStartP seedN = seedStartN for index in range(0,11,1): dataMatrixP = np.c_[dataMatrixSample[:,0], dataMatrixSample[:,1] + seedP] distanceMatrix = euclidean_distances(dataMatrixP,standardMatrix) sumP = (distanceMatrix.min(1).getA()**2).sum() dataMatrixN = np.c_[dataMatrixSample[:,0], dataMatrixSample[:,1] + seedN] distanceMatrix = euclidean_distances(dataMatrixN,standardMatrix) sumN = (distanceMatrix.min(1).getA()**2).sum() print("sumP:") print(sumP) print("sumN:") print(sumN) print("========================================================") if(sumP < sumN): seedN = (seedP + seedN) / 2.0 else: seedP = (seedP + seedN) / 2.0 transZ = (seedP + seedN) / 2 seedP = seedStartP seedN = seedStartN for index in range(0,11,1): dataMatrixP = np.c_[dataMatrixSample[:,0]+ seedP, dataMatrixSample[:,1]] distanceMatrix = euclidean_distances(dataMatrixP,standardMatrix) sumP = (distanceMatrix.min(1).getA()**2).sum() dataMatrixN = np.c_[dataMatrixSample[:,0]+ seedN, dataMatrixSample[:,1]] distanceMatrix = euclidean_distances(dataMatrixN,standardMatrix) sumN = (distanceMatrix.min(1).getA()**2).sum() print("sumP:") print(sumP) print("sumN:") print(sumN) print("========================================================") if(sumP < sumN): seedN = (seedP + seedN) / 2.0 else: seedP = (seedP + seedN) / 2.0 transX = (seedP + seedN) / 2 dataMatrixCorrected = np.c_[dataMatrix[:,0] + transX, dataMatrix[:,1] + transZ] distance = np.zeros([15,1000]) for index in range(0,15,1): start = index * 1000 end = index * 1000 + 1000 if(start > dataMatrixCorrected.shape[0]): break; if(end > dataMatrixCorrected.shape[0]): dataMatrixTemp = dataMatrixCorrected[start:dataMatrixCorrected.shape[0]:1,:] else: dataMatrixTemp = dataMatrixCorrected[start:end:1,:] distanceMatrix = euclidean_distances(dataMatrixTemp,standardMatrix) distanceTemp = distanceMatrix.min(1).getA() if(distanceTemp.shape[0]==1000): distance[index] = distanceTemp[:,0] else: distance[index] = np.append(distanceTemp[:,0],np.zeros(1000 - distanceTemp[:,0].shape[0])) distance = distance.reshape(-1,1) result = np.c_[dataMatrix[:,0] + transX, dataMatrix[:,1] + transZ,distance[0:dataMatrix.shape[0]:1,:]] return pd.DataFrame(result) # 计算极性 def polarity(dataFrame): standard = pd.read_csv("D:\\standard.csv") dataArray = np.array(dataFrame)[:,0:2:1]*1000 standardArray = np.array(standard)*1000 polarity = np.array([0]) for index in range(0,dataArray.shape[0],1): temp = cv2.pointPolygonTest(standardArray.astype(int),tuple(dataArray[index,:]),False) polarity =np.r_[polarity,temp] polarity = np.delete(polarity.reshape(1,-1).transpose(),0,0) polarityDistance = np.array(dataFrame)[:,2] * polarity.reshape(1,-1) newData = np.array(dataFrame)[:,0:2:1] newData = np.c_[newData,polarityDistance.transpose()] polarityData = pd.DataFrame(newData).sort_values(by=0) return polarityData # 平面抽样 def planeSample(dataFrame): data_sortX = data.sort_values(by = 0) data_sampleX = data_sortX.iloc[0:data_sortX.shape[0]:10,:] data_sortY = data_sampleX.sort_values(by = 1) data_sample = data_sortY.iloc[0:data_sortY.shape[0]:10,:] return data_sample #data = joint(sys.argv[1]) data = joint("E:\\Test\\1#190110_150215\\") dataFrame = pd.DataFrame(data) dataSample = dataFrame.sample(frac = 0.01,axis = 0) dataSample.to_csv("D:\\test\\Sample.csv",index = False,header = False) """ dataRowFrame9 = read_row1(dataFrame,-1000,90000,0,50) dataRowFrame9.to_csv("D:\\test\\dataRowFrame9.csv",index = False) level1 = level_1(dataRowFrame9,[-1000,70000],250,80) level1.to_csv("D:\\test\\level1.csv",index = False) dataTrans = profile1(level1) dataTrans.to_csv("D:\\test\\trans9.csv",index = False) # dataTrans = pd.read_csv("D:\\test\\trans9.csv") result = profile2(dataTrans) result.to_csv("D:\\test\\result.csv",index = False) polarityResult = polarity(result) polarityResult.to_csv("D:\\test\\polarityResult.csv",index = False) """