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

相关推荐
暴力袋鼠哥3 小时前
基于YOLO11的车牌识别分析系统
python
笺上山河梦3 小时前
文件操作(二进制文件)
开发语言·c++·学习·算法
虾球xz5 小时前
游戏引擎学习第221天:(实现多层次过场动画)
c++·学习·游戏引擎
满怀10155 小时前
【Python进阶】列表:全面解析与实战指南
python·算法
wuqingshun3141596 小时前
蓝桥杯 9. 九宫幻方
数据结构·c++·算法·职场和发展·蓝桥杯·深度优先
小小菜鸟,可笑可笑6 小时前
Python 注释进阶之Google风格
开发语言·python
upp6 小时前
[bug]langchain agent报错Invalid Format: Missing ‘Action Input:‘ after ‘Action:‘
javascript·python·langchain·bug
小技与小术6 小时前
代码随想录算法训练营day4(链表)
数据结构·python·算法·链表
云格~6 小时前
L1-5 吉老师的回归
开发语言·c++·人工智能·算法·职场和发展·数据挖掘·回归
前端开发张小七6 小时前
每日一练:4.有效的括号
前端·python