PCL入门系列 —— 加载ply格式mesh模型、点云数据并作可视化展示

PCL入门系列 —— 加载ply格式mesh模型、点云数据并作可视化展示


前言

随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。

为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。

后续会逐步扩增与工业机器视觉相关的一些其它内容,如:

项目案例剖析场景数据分析基础算法模块相机评测 等;

如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。

在这里插入图片描述


程序说明

加载ply格式数据并作可视化展示(点云、mesh模型);

输出结果

在这里插入图片描述

代码示例

/*
 * @File: load_ply.cpp
 * @Brief: pcl course
 * @Description: 展示ply格式数据的加载和可视化效果
 * @Version: 0.0.1
 * @Author: MuYv
 */
#include <iostream>
#include <string>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>



int main(int argc, char** argv){
    if(argc != 2){
        std::cout<<"Usage: exec cloud_file_path"<<std::endl;
        return -1;
    }
    const std::string kPlyFilePath = argv[1];     // ../clouds/room/room_scannet_mesh.ply

    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_src(new pcl::PointCloud<pcl::PointXYZRGB>());
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_tmp(new pcl::PointCloud<pcl::PointXYZ>());

    // 将ply格式数据加载为点云
    // 成功返回0,失败返回-1
    if(-1 == pcl::io::loadPLYFile(kPlyFilePath,*cloud_src)){
        std::cout<<"load ply file failed. please check it."<<std::endl;
        return -2;
    }

    // 将ply格式数据加载为PolygonMesh对象
    pcl::PolygonMesh poly_mesh;
    // 成功返回0,失败返回-1
    if(-1 == pcl::io::loadPLYFile(kPlyFilePath, poly_mesh)){
        std::cout<<"load ply file failed. please check it."<<std::endl;
        return -2;
    }

    // 创建可视化对象
    pcl::visualization::PCLVisualizer viewer("viewer");

    // 将当前窗口,拆分成横向的2个可视化窗口,以viewport区分(v1/v2)
    int v1; 
    int v2;
    //窗口参数分别对应 x_min, y_min, x_max, y_max, viewport
    viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1);  
    viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);

    // 添加2d文字标签
    viewer.addText("v1", 10,10, 20, 1,0,0, "viewport_v1", v1);
    viewer.addText("v2", 10,10, 20, 0,1,0, "viewport_v2", v2);

    // 添加坐标系
    viewer.addCoordinateSystem(0.5);    // 单位:m

    // 设置可视化窗口背景色
    viewer.setBackgroundColor(0.2,0.2,0.2);     // r,g,b  0~1之间

    // 向v1窗口中添加点云
    viewer.addPointCloud(cloud_src,"cloud_src",v1);

    // 向v2窗口中添加PolygonMesh对象
    viewer.addPolygonMesh(poly_mesh, "mesh_src",v2);

    // // 设置可视化窗口内的所有mesh为线框模式,部分情况下,便于可视化debug
    // viewer.setRepresentationToWireframeForAllActors();

    // 关闭窗口则退出
    while(!viewer.wasStopped()){
        viewer.spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }

    return 0;
}

总结

ply格式也常用于点云数据的存储,自动化流程加载中,要主要传入数据的具体数据内容;
在定位抓取项目中,所提供的刚体工件模型,可能是ply/obj/stl格式的mesh模型文件;


注:部分测试所用点云数据来源于网络,如有侵权,请联系博主删除,谢谢。

<think>好的,我现在需要帮用户解决如何使用Python读取PLY点云文件、计算法向量并进行可视化的问题。首先,我得回忆一下用户提供的引用内容,看看有哪些库可以使用。 用户提到了四个引用,其中引用[1]是使用pclpy库读取PLY文件,引用[2]是Open3D的方法,引用[3]提到pyntcloud,引用[4]是优快云博客的一些资源。用户的问题集中在读取、计算法向量和可视化,所以需要比较这几个库的适用性。 首先,pclpy是PCL的Python绑定,功能强大,但安装可能复杂,尤其对新手不友好。Open3D安装简单,文档齐全,适合快速实现。pyntcloud可能适合处理多字段的点云,但用户的问题没有提到需要处理复杂字段,所以可能Open3D更合适。 然后,用户的问题步骤明确:读取PLY、计算法线、可视化。根据引用[2],Open3D可以直接实现这三个步骤。代码示例已经有了,可能需要详细解释参数,比如search_param的设置,KDTree的参数如何影响法向量计算。 另外,用户可能不知道如何安装这些库,需要给出安装命令。比如Open3D可以通过pip安装,而pclpy可能依赖系统库,安装麻烦。所以推荐Open3D作为首选方案。 还要考虑用户可能的错误,比如文件路径不正确,点云数据是否需要预处理。在代码示例中,需要提醒用户检查文件路径是否正确,是否需要转换点云格式,比如如果PLY文件是网格,可能需要先采样成点云,如引用[2]中的sample_points_poisson_disk。 对于计算法向量,需要解释参数的意义,比如radius和max_nn的作用,以及法向量估计的方法,比如使用协方差分析。可视化部分,Open3D的draw_geometries函数可以直接显示点云和法线,但可能需要调整法线显示的长度或密度。 另外,用户可能想比较不同库的优缺点,比如pclpy和Open3D在性能上的差异,或者是否需要其他库如pyntcloud处理特殊情况。但根据问题描述,用户的需求较为基础,Open3D应该足够。 最后,生成相关问题时要围绕点云处理,可能涉及其他格式、法向量应用、库的选择等,确保问题有针对性,帮助用户深入理解。</think>以下是用Python处理PLY点云文件的计算法向量及可视化的完整解决方案: ### 一、读取PLY点云文件 推荐使用`Open3D`和`pyntcloud`两种方式实现: #### 方法1:使用Open3D(推荐) ```python import open3d as o3d # 读取点云(支持直接读取PLY格式) pcd = o3d.io.read_point_cloud("input.ply") # 确保文件路径正确 # 如果读取失败,尝试三角网格转点云(适用于含网格的PLY文件) mesh = o3d.io.read_triangle_mesh("input.ply") pcd = mesh.sample_points_poisson_disk(number_of_points=5000) # 采样点数可调 ``` [^2] #### 方法2:使用pyntcloud(适合多属性数据) ```python from pyntcloud import PyntCloud cloud = PyntCloud.from_file("input.ply") points = cloud.points[['x','y','z']].values # 提取XYZ坐标 ``` ### 二、计算法向量 #### Open3D实现(内置高效算法) ```python # 参数设置 radius = 0.1 # 搜索半径,根据点云密度调整 max_nn = 30 # 最大近邻数 pcd.estimate_normals( search_param=o3d.geometry.KDTreeSearchParamHybrid( radius=radius, max_nn=max_nn ) ) ``` #### 算法原理: 通过计算每个点邻域内的协方差矩阵,对特征值分解得到法线方向。公式表示为: $$ \mathbf{C} = \frac{1}{k}\sum_{i=1}^{k}(\mathbf{p}_i - \mathbf{\bar{p}})(\mathbf{p}_i - \mathbf{\bar{p}})^T $$ 其中最小特征值对应特征向量即为法向量方向[^4]。 ### 三、可视化实现 #### 基础可视化 ```python o3d.visualization.draw_geometries([pcd]) ``` #### 带法向量的高级可视化 ```python # 创建法线箭头集合 normals = o3d.geometry.LineSet.create_from_point_cloud_orientation( pcd, scale=0.05, # 箭头长度 orientation=o3d.geometry.PointCloudOrientation.Normal ) o3d.visualization.draw_geometries([pcd, normals]) ``` ### 四、环境准备 安装所需库: ```bash pip install open3d # 基础3D处理 pip install pyntcloud # 多属性数据支持 ``` ### 五、注意事项 1. 点云密度影响参数选择,稀疏点云需增大`radius` 2. 法向量方向一致性可通过`pcd.orient_normals_consistent_tangent_plane()`优化 3. 工业级处理建议使用CUDA加速库如`cuPC`
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值