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数据格式展示

相关推荐
闻哥18 小时前
深入理解 Spring @Conditional 注解:原理与实战
java·jvm·后端·python·spring
茉莉玫瑰花茶18 小时前
C++ 17 详细特性解析(4)
开发语言·c++·算法
小鸡吃米…18 小时前
机器学习 - 堆叠集成(Stacking)
人工智能·python·机器学习
青春不朽51219 小时前
Scikit-learn 入门指南
python·机器学习·scikit-learn
进击的小头19 小时前
FIR滤波器实战:音频信号降噪
c语言·python·算法·音视频
欧阳x天19 小时前
STL详解(九)—— stack和queue的模拟实现
开发语言·c++
乔江seven19 小时前
【python轻量级Web框架 Flask 】2 构建稳健 API:集成 MySQL 参数化查询与 DBUtils 连接池
前端·python·mysql·flask·web
dgaf19 小时前
【疯狂的往左】用 C 语言播放《下山》
c语言·c++
卷卷的小趴菜学编程19 小时前
项目篇----仿tcmalloc的内存池设计(central cache篇)
c++·tcmalloc·内存池·central cache
2301_8107301019 小时前
python第四次作业
数据结构·python·算法