STL与PLY格式转化

一、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

cpp 复制代码
#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 mesh


def 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, faces


def 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 file
    cube.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数据格式展示

相关推荐
金銀銅鐵4 小时前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li6 小时前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
见过夏天8 小时前
C++ 基础入门完全指南
c++
小九九的爸爸10 小时前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
阿耶同学11 小时前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
花酒锄作田1 天前
Pydantic校验配置文件
python
hboot1 天前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络
ZhengEnCi2 天前
P2M-Matplotlib折线图完全指南-从数据可视化到趋势分析的Python绘图利器
python·matlab·数据可视化
ZhengEnCi2 天前
P2L-Matplotlib饼图完全指南-从数据可视化到图表定制的Python绘图利器
python·matlab
曲幽2 天前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry