使用MeshLab软件处理pcd点云文件


前言

使用D435i相机跑ORB-SLAM2_RGBD_DENSE_MAP-master稠密建图的过程中,发现最终保存的点云上下颠倒,而且其他轴的角度也有问题,这对滤除地面以及将pcd点云文件转化成可用于路径规划的pgm文件造成了困难
在这里插入图片描述
看了ORB-SLAM2_RGBD_DENSE_MAP-master点云部分的代码,没有找到为啥3个轴会有角度偏离;调用pcl库对点云操作暂时没找到方法,就没有尝试。
系统是Ubuntu18.04


1.安装MeshLab软件

参考链接:高翔视觉SLAM十四讲(第二版)各种软件、库安装的以及报错解决方法

打开 Ubuntu软件中心 -> 图像与摄影 -> 按照名称排序 -> MeshLab -> 安装
​​​​在这里插入图片描述


2.利用pcl库将pcd文件转成ply文件

MeshLab支持的文件格式:STL,OFF,OBJ,PLY,PTX,V3D,PTS,APTS,XYZ,GTS,TRI,ASC,X3D,X3DV,VRML,ALN
打开终端

pcl_pcd2ply XXX.pcd XXX.ply

3.利用MeshLab旋转ply点云

参考链接:利用Meshlab旋转三维点云模型
将转化好的ply文件用MeshLab打开,选择Filters->Normals,Curvatures and Orientation ->Transform:Rotate,会出现如下图:
在这里插入图片描述
首先选择Y axis(Y轴)、barycenter(重心)、旋转角度16.5、最后点击apply(应用);接着选择X axis(X轴)、barycenter(重心)、旋转角度-98、最后点击apply(应用)
在这里插入图片描述
旋转后的结果为
在这里插入图片描述


4.将ply文件转为pcd文件

参考链接:https://github.com/qixuxiang/ply2pcd
首先将代码下载下来

git clone https://github.com/qixuxiang/ply2pcd.git

打开main.cpp,把下面两行路径改成自己的
在这里插入图片描述

注意修改ply2pcd/CMakeLists.txt中的PCL版本,查看已安装pcl版本命令dpkg -l | grep libpcl
在这里插入图片描述

然后开始编译

cd ply2pcd
mkdir build && cd build
cmake ..
make

接着运行程序

cd ply2pcd/build
./ply2pcd

在指定的路径就生成了转化好的pcd文件
在这里插入图片描述
接下来就可以将pcd点云文件转化成可用于路径规划的pgm文件

5.将ply文件转为pcd文件(添加读取配置文件版本)

参考链接:用C/C++读取配置文件的小例子
上述代码当要修改文件路径的时候需要重新编译,比较麻烦。将文件路径写进配置文件中,然后代码从配置文件中读取比较方便。当文件路径需要修改的时候,只需要修给配置文件即可,不需要重新编译。
新建一个文件夹,并且在文件夹里创建3个文件

mkdir ply2pcd
touch CMakeLists.txt config.txt main.cpp

三个文件内容分别为
main.cpp

#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace pcl;
using namespace pcl::io;
#define MAX_LINE_LENGTH 256

int main (int argc, char** argv)
{
    
    
  char line[MAX_LINE_LENGTH];
  char key[MAX_LINE_LENGTH];
  char value[MAX_LINE_LENGTH];
  char plyAddress[MAX_LINE_LENGTH];
  char pcdAddress[MAX_LINE_LENGTH];
  FILE *fp = fopen("../config.txt", "r");  // 打开配置文件
  if (fp == NULL) {
    
    
      printf("无法打开配置文件:config.txt\n");
      return 1;
  }
  while (fgets(line, MAX_LINE_LENGTH, fp) != NULL) {
    
      // 逐行读取配置文件
    if (line[0] == '#' || line[0] == '\n') {
    
      // 跳过注释和空行
      continue;
    }
    if (sscanf(line, "%s = %s", key, value) == 2) {
    
      // 解析配置项
      if (strcmp(key, "plyAddress") == 0) {
    
    
        printf("PLY文件地址:%s\n", value);
        strcpy(plyAddress, value);
      } else if (strcmp(key, "pcdAddress") == 0) {
    
    
        printf("PCD文件地址:%s\n", value);
        strcpy(pcdAddress, value);
      }
    }  
  }
  fclose(fp);

  pcl::PLYReader reader;
  pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
	
	reader.read<pcl::PointXYZRGBA>(plyAddress, *cloud);
  pcl::io::savePCDFileASCII(pcdAddress, *cloud );  // 指定文件后缀名为.pcd
  return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(ply2pcd)

set(CMAKE_CXX_STANDARD 11)
find_package(PCL 1.8 REQUIRED)

include_directories(${
    
    PCL_INCLUDE_DIRS})
link_directories(${
    
    PCL_LIBRARY_DIRS})
add_definitions(${
    
    PCL_DEFINITIONS})


add_executable(ply2pcd main.cpp)
target_link_libraries(ply2pcd ${
    
    PCL_LIBRARIES})

config.txt

#路径改成自己的
plyAddress = /XXX/XXX/.../XXX.ply
pcdAddress = /XXX/XXX/.../XXX.pcd

之后开始编译,运行

cd ply2pcd
#编译
mkdir build && cd build
cmake ..
make
#运行
./ply2pcd

猜你喜欢

转载自blog.csdn.net/m0_60355964/article/details/129816888
今日推荐