3D电力线点云学习笔记

# ***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]) #可视化

你可能感兴趣的:(3D点云处理,学习,笔记,python)