一、STL转化为PLY
利用PCL库中vtk_lib_io实现,#include <pcl/io/vtk_lib_io.h>,C++语言。
提供一个用于测试的数据:
通过网盘分享的文件:ply_stl
链接: https://pan.baidu.com/s/1xnO5s2kiUf0Cs35XVyfTHA?pwd=xmax 提取码: xmax
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <vector>
#include <iostream>using namespace pcl;
using namespace std;int main()
{// 读取STL文件vtkSmartPointer<vtkSTLReader> reader4 = vtkSmartPointer<vtkSTLReader>::New();reader4->SetFileName("mesh.stl");reader4->Update();// stl 格式 转出到 ply 格式vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();polydata = reader4->GetOutput();polydata->GetNumberOfPoints();// 保存ply数据vtkSmartPointer<vtkPLYWriter> plyWriter = vtkSmartPointer<vtkPLYWriter>::New();plyWriter->SetFileName("stl2plyData.ply");plyWriter->SetInputConnection(reader4->GetOutputPort());plyWriter->SetFileTypeToASCII();plyWriter->SetColorModeToOff();plyWriter->Update();plyWriter->Write();// 从 ply 格式 转为 pcd 格式PointCloud<PointXYZ>::Ptr cloudPcd(new PointCloud<PointXYZ>());io::vtkPolyDataToPointCloud(polydata, *cloudPcd);// 保存pcd数据io::savePCDFileASCII("ply2PcdData.pcd", *cloudPcd);visualization::PCLVisualizer vis("cloud visualization");vis.getRenderWindow()->GlobalWarningDisplayOff();vis.addCoordinateSystem(5.0);vis.addPointCloud(cloudPcd);while (!vis.wasStopped()){vis.spinOnce();}return 0;
}
二、PLY转化为STL
利用python语言,需要安装numpy-stl安装包。
提供一个用于测试的数据:
通过网盘分享的文件:ply_stl
链接: https://pan.baidu.com/s/1xnO5s2kiUf0Cs35XVyfTHA?pwd=xmax 提取码: xmax
python">import numpy as np
from stl import meshdef read_ply(file_path):with open(file_path, 'rb') as f:header = f.readline()while not header.startswith(b'element vertex'):header = f.readline()vertex_count = int(header.split()[-1])print("vertex_count = ", vertex_count)while not header.startswith(b'element face'):header = f.readline()face_count = int(header.split()[-1])print("face_count = ", face_count)while not header.startswith(b'end_header'):header = f.readline()# 读取顶点数据vertices = []for i in range(vertex_count):header = f.readline()header = header.split()[:3]for j in range(len(header)):vertices.append(float(header[j]))vertices = np.array(vertices).reshape(-1, 3)# 读取面数据faces = []for i in range(face_count):header = f.readline()header = header.split()[1:]for j in range(len(header)):faces.append(int(header[j]))faces = np.array(faces).reshape(-1, 3)return vertices, facesdef create_stl(vertices, faces, output_file):cube = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))for i, f in enumerate(faces):for j in range(3):cube.vectors[i][j] = vertices[f[j], :]# save stl filecube.save(output_file)if __name__ == '__main__':vertice, face = read_ply('mesh.ply')print(vertice.shape)print(face.shape)create_stl(vertice, face, 'mesh.stl')
ply数据格式展示