# ***1. 绘制原始数据图像L001line.npy*** # L001line,npy是001数据提取后的点云集,.npy中放着点云的坐标值
loadData = np.load('L001line.npy')
index=np.zeros(len(loadData))
indexData=np.c_[loadData,index] # 带标签的原始数据
# 绘图
X=loadData[:,0]
Xm=X.max()+1 # 横坐标中的最大值+1
Y=loadData[:,1]
Ym=Y.max()+1 # 纵坐标中的最大值+1
images=np.zeros((Xm,Ym),dtype=np.uint8) # 申明一个Xm行Ym列的0矩阵images,数据类型是uint8,即存储为8位图像
for i in range(len(loadData)):
images[loadData[i][0]][loadData[i][1]]=155 # 将点云坐标输入至矩阵images中,用于后续图示
# cv2.imwrite('OrigImage.png',images) # 将图片存至“原始图片.png”
img = cv2.imread('OrigImage.png')
# plt.imshow(img)
# plt.show()
经过霍夫变换检测到的直线加判断,使得相近的直线合并为一根
epsilon=1 # K的判别
delta=100 # B的判别
for i in range(len(klist)):
length=len(klist)
j=i+1
while(j
#根据点到直线的距离提取符合阈值的电力线
def distance_from_line(point, line_point1, line_point2): # 点到线的距离
x, y = point
x1, y1 = line_point1
x2, y2 = line_point2
numerator = abs((y2 - y1) * x - (x2 - x1) * y + x2 * y1 - y2 * x1)
denominator = math.sqrt((y2 - y1) ** 2 + (x2 - x1) ** 2)
return numerator / denominator
def distance_to_line(points, line_point1, line_point2):
distances = []
for point in points:
distance = distance_from_line(point, line_point1, line_point2)
distances.append(distance)
return distances
dis=[]
num=[] # 储存每根线的点云个数
n=1
for i in range(len(klist)):
P=(50,klist[i]*50+blist[i])
Q=(100,klist[i]*100+blist[i])
distances=distance_to_line(loadData[:,:2],P,Q)
for j in range(len(distances)):
if distances[j] < 15:
dis.append(loadData[j])
indexData[j][3]=n
n=n+1
num.append(len(dis))
#将筛选后得到的电力线点保存
dis=np.round(np.array(dis))
exline=np.array(dis)
np.save('exline.npy',exline)
ts=np.load("exline.npy")
#npy转ply
st=o3d.geometry.PointCloud()
st.points=o3d.utility.Vector3dVector(ts)
o3d.io.write_point_cloud("exline.ply",st)
pcd=o3d.io.read_point_cloud("exline.ply")
o3d.visualization.draw_geometries([pcd]) #可视化