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
...

解决的大致方法如下:

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

C++代码如下:

#include <string>
#include <iostream>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/point_cloud.h>
using namespace std;

// pcl::io::loadOBJFile(const std::string &file_name, pcl::PointCloud<PointT> & cloud) 不能加载顶点颜色,于是我就自己实现了
bool LoadOBJFile(const string &filepath, pcl::PointCloud<pcl::PointXYZRGB> &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<pcl::PointXYZRGB> 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;
}


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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将txt文件存入MySQL再查询出用pcl,首先需要将txt文件中的数据导入到MySQL数据库中。可以使用MySQL的LOAD DATA INFILE命令将txt文件的数据导入到数据库中的一个表中。假设txt文件中的每一行数据表示一个数据点,每个数据点包含x、y、z三个坐标值,那可以创建一个表来存储这些数据,表的字段包括id、x、y、z四个列。然后执行命令导入txt文件的数据,例如: ``` LOAD DATA INFILE '路径/文件名.txt' INTO TABLE 表名 FIELDS TERMINATED BY '分割符' LINES TERMINATED BY '换行符' ``` 其中,路径/文件名.txt是txt文件的路径和文件名,表名是要导入的目标表名,分割符是txt文件中各列数据的分隔符,换行符是txt文件数据的换行符。 导入完成后,可以使用MySQL的SELECT语句对表中的数据进行查询。根据需要,可以使用WHERE子句来筛选特定的数据点。 接下来是使用pcl查询结果。pcl(Point Cloud Library)是一个开源的点云库,可以处理和可点云数据。可以使用pcl中的PointCloud类来表示和操作点云数据。 首先,需要连接到MySQL数据库,并执行查询语句获取数据。可以使用MySQL Connector/C++库来实现与MySQL数据库的连接和查询。 然后,使用查询结果构建pcl中的PointCloud对象,将从MySQL数据库中获取的坐标数据添加到PointCloud中。 最后,使用pcl库进行可,可以将PointCloud对象渲染成点云的形式。可以使用pcl_visualization库中的PCLVisualizer类来实现点云的可,设置相应的参数和角即可。 通过以上步骤,就可以将txt文件存入MySQL数据库并通过pcl进行可了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值