pcl 保存点云.ply 格式 or .pcd格式

本文描述了在Windows上使用PCL库时遇到的问题,当尝试将点云数据保存为PLY格式时,程序会在Visual Studio中崩溃。尽管保存为PCD格式没有问题,但作者需要PLY格式以便在MeshLab中打开。提供了用于生成点云并尝试保存的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://www.pcl-users.org/pcl-io-savePLYFile-crashing-in-Visual-studio-td4042792.html

I installed pcl on windows machine today as i intend to use it in a mex function for my matlab project and wanted a working windows version of pcl. i ran a sample code shown below to generate 50 points and save them in a PCD and PLY file. However, for some reaosn savePLYFILE is crashing my program while savePCDFILE works fine. I am at a loss to epxlain this ( i do need my PC in ply format so i can open them in meshlab).  Here is the code: 

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/impl/point_types.hpp>
#include <pcl/point_cloud.h>


int  main (int argc, char** argv) 
{ 
  pcl::PointCloud<pcl::PointXYZ> cloud; 
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ptr = pcl::PointCloud<pcl::PointXYZ>::Ptr (new pcl::PointCloud<pcl::PointXYZ>); 
  // Fill in the cloud data 
  cloud.width    = 50; 
  cloud.height   = 1; 
  cloud.is_dense = false; 
  cloud.points.resize (cloud.width * cloud.height); 
  
  cloud_ptr->width = cloud.width ; 
  cloud_ptr->height = cloud.height; 
  cloud_ptr->is_dense = cloud.is_dense; 
 // cloud_ptr->points.resize (cloud.width * cloud.height); 

  for (size_t i = 0; i < cloud.points.size (); ++i) 
  { 
   // cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f); 
   // cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f); 
   // cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f); 

        pcl::PointXYZ p; 
        p.x = 1024 * rand () / (RAND_MAX + 1.0f); 
        p.y = 1024 * rand () / (RAND_MAX + 1.0f); 
        p.z = 1024 * rand () / (RAND_MAX + 1.0f); 
        cloud.points[i].x = p.x; 
        cloud.points[i].y = p.y; 
        cloud.points[i].z = p.z; 

        cloud_ptr->points.push_back(p); 
  } 
  std::cerr << "Saving to pcd file " << std::endl; 
  pcl::io::savePCDFileASCII ("test_pcd0.pcd", cloud); 
  pcl::io::savePCDFile ("test_pcd1.pcd", *cloud_ptr); 
  std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl; 

  std::cerr << "Saving to ply file " << std::endl; 
  pcl::io::savePLYFile ("test_ply.ply", cloud); 

  for (size_t i = 0; i < cloud.points.size (); ++i){ 
  //  std::cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl; 
          std::cerr << "    " << cloud_ptr->points[i].x << " " << cloud_ptr->points[i].y << " " << cloud_ptr->points[i].z << std::endl; 
  } 

  return (0); 
} 

 

### 将PCLPLY格式转换为PCD格式的C++方法 在处理点数据时,通常会遇到不同文件格式之间的转换需求。对于将PLY格式的点文件转换为PCD格式的任务,可以利用Point Cloud Library (PCL) 提供的功能来实现。 以下是基于PCL库的一个完整的C++代码示例[^2]: ```cpp #include <pcl/io/pcd_io.h> #include <pcl/io/ply_io.h> #include <pcl/point_types.h> int main(int argc, char** argv) { // 定义点类型 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 加载PLY文件到点对象中 if (pcl::io::loadPLYFile<pcl::PointXYZ>("input.ply", *cloud) == -1) { std::cerr << "无法加载PLY文件." << std::endl; return (-1); } // 保存点对象为PCD文件 if (pcl::io::savePCDFileASCII("output.pcd", *cloud) == -1) { std::cerr << "无法保存PCD文件." << std::endl; return (-1); } std::cout << "成功完成PLYPCD的转换!" << std::endl; return (0); } ``` #### 解析说明 上述代码实现了从PLY文件读取点并将其存储为PCD文件的核心功能。具体解析如下: - 使用`pcl::io::loadPLYFile`函数加载PLY文件中的点数据[^4]。 - 创建了一个`pcl::PointCloud<pcl::PointXYZ>`类型的指针用于存储点数据。 - 调用了`pcl::io::savePCDFileASCII`函数将点数据保存为ASCII编码的PCD文件[^3]。 如果需要二进制格式PCD文件,则可以用`pcl::io::savePCDFileBinary`替代`pcl::io::savePCDFileASCII`。 为了编译此程序,需确保链接了PCL库,并设置正确的构建配置。例如,在CMakeLists.txt中添加以下内容[^1]: ```cmake find_package(PCL REQUIRED) include_directories(${PCL_INCLUDE_DIRS}) link_libraries(${PCL_LIBRARIES}) add_executable(ply_to_pcd ply_to_pcd.cpp) target_link_libraries(ply_to_pcd ${PCL_LIBRARIES}) ``` 通过以上步骤即可完成从PLYPCD的转换过程。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值