• PCL可视化只有顶点彩色信息的OBJ文件


    正常的OBJ文件,应该附带一个MLT文件来记录各种材质信息,包括彩色信息。PCL提供两个函数pcl::io::loadPolygonFileOBJ()pcl::io::loadOBJFile() 从这种OBJ文件中读取信息到数据类型pcl::TextureMesh,然后在viewer中使用addTextureMesh进行可视化

    但是在某些情况下,只有一个OBJ文件,而颜色信息是记录在每个顶点上的(即x y z r g b),例如

    v -1.285637 -0.170000 0.930000 0.568627 0.611765 0.584314
    v -1.280000 -0.170000 0.931465 0.568627 0.611765 0.584314
    v -1.280000 -0.168779 0.930000 0.568627 0.611765 0.584314
    ...
    f 3 2 1
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    解决的大致方法如下:

    • 用pcl的接口读取mesh信息(不带颜色)
    • 自己从obj文件中读取顶点信息(包含颜色)放到pcl的点云数据结构中
    • 将mesh中的顶点替换成上一步的点云

    C++代码如下:

    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    // pcl::io::loadOBJFile(const std::string &file_name, pcl::PointCloud & cloud) 不能加载顶点颜色,于是我就自己实现了
    bool LoadOBJFile(const string &filepath, pcl::PointCloud &cloud){
      ifstream fin;
      fin.open(filepath,ios::in);
      if (!fin)  return false;
      string str;
      float num_r,num_g,num_b;
      pcl::PointXYZRGB point;
      while(fin>>str){
        if(str[0] == 118){  //判断是否是点的数据 118是v的ASCII
          fin>>point.x>>point.y>>point.z>>num_r>>num_g>>num_b;
          point.r = (int)(num_r*255);  //OBJ提供的rgb范围是0-1,pcl中的RGB是0-255
          point.g = (int)(num_g*255);
          point.b = (int)(num_b*255);
          cloud.points.push_back(point);
        }else if(str[0] == 146) break;  // 如果是f的话直接退出
      }
      fin.close();
      return true;
    }
    
    
    int main(){
      string filepath = "test.obj";
       STEP1: 读取mesh信息(不带颜色)
      pcl::PolygonMesh mesh;
      if (pcl::io::loadPolygonFile(filepath, mesh)==-1) {
        fprintf(stderr, " [ERROE] Could not read mesh from file %s\n", filepath.c_str());
        exit(1);
      }
       STEP2: 读取点云信息(带颜色)
      pcl::PointCloud cloud;
      if (!LoadOBJFile(filepath, cloud)) {
        fprintf(stderr, " [ERROE] Could not read cloud from file %s\n", filepath.c_str());
        exit(1);
      }
       STEP3: 将mesh中的顶点替换成点云
      pcl::toPCLPointCloud2(cloud, mesh.cloud);
       STEP4: 可视化
      pcl::visualization::PCLVisualizer::Ptr viewer_(new pcl::visualization::PCLVisualizer("results"));
      viewer_->setBackgroundColor(0,0,0);
      viewer_->addCoordinateSystem(1.0);
      viewer_->initCameraParameters();
      viewer_->addPolygonMesh(mesh, "mesh");
      viewer_->spin();
      return 0;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Linux常用命令—find命令大全
    yolov7添加注意力机制
    小程序长期订阅
    【C# 基础精讲】文件流和文本处理
    隧道精确定位系统硬件设备部署方案
    车辆管理新纪元:智驭未来,驾驭无忧
    算法笔记-第九章-平衡二叉树
    DHorse系列文章之操作手册
    MyBatis - 关闭 Log 日志的两种方式
    JavaScript能否实现在线Excel附件的上传与下载?
  • 原文地址:https://blog.csdn.net/OTZ_2333/article/details/126442099