如何使用PCL保存color-then-obj文件



pcl版本1.9.1我读取.txt文件,创建PointXYZRGB,设置x、y、z和rgb,如下所示:

#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/PolygonMesh.h>
#include <pcl/point_cloud.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/visualization/cloud_viewer.h>
using namespace std;
using namespace pcl;
int main()
{
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
std::string s;
while (cin >> s) {
ifstream input(s);
std::string line;
std::int32_t number = 0;
while (getline(input, line))
{
if (number % 10000 == 0) {
cout << "重置点数"<<number<<endl;
cloud->points.resize(number + 10100);
}
stringstream sstr(line);
string token;
int32_t tokennumber = 0;
while (getline(sstr, token, ','))
{
if (tokennumber == 0) {
cloud->points[number].x = atof(token.c_str());
}
else if (tokennumber == 1) {
cloud->points[number].y = atof(token.c_str());
}
else if (tokennumber == 2) {
cloud->points[number].z = atof(token.c_str());
}
else if (tokennumber == 3) {
int32_t num = std::stoi(token.substr(1), NULL, 16);
int32_t red = num >> 16 & 0xFF;
int32_t green = num >> 8 & 0xFF;
int32_t blue = num & 0xFF;
cloud->points[number].r = red;
cloud->points[number].g = green;
cloud->points[number].b = blue;
uint32_t rgb = (red << 16) | (green << 8) | (blue);
cloud->points[number].rgb = rgb;
}
tokennumber++;
}
number++;
}
pcl::PolygonMesh mesh;
pcl::toPCLPointCloud2(*cloud, mesh.cloud);
pcl::io::saveOBJFile("C:\Users\ASUS\Desktop\out_color2.obj", mesh);
cout << "文件保存完毕";`

但是当我读取.obj文件时,使用loadPolygonFileOBJ((,我发现PointXYZRGB没有rgb,它失去了颜色

#include <string>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/PolygonMesh.h>
#include <pcl/point_cloud.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/visualization/cloud_viewer.h>

using namespace pcl;
int main()
{
pcl::PolygonMesh mesh;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
std::string s = "C:\Users\ASUS\Desktop\out_color2.obj";
pcl::io::loadPolygonFileOBJ(s, mesh);
pcl::fromPCLPointCloud2(mesh.cloud, *cloud);
for (int i = 0; i < cloud->points.size(); i++) {
PointXYZRGB point = cloud->points[i];
cout << point.z << point.x << point.y<<endl;
cout << point.r << point.g << point.b << endl;
}
boost::shared_ptr<visualization::PCLVisualizer> viewer(new visualization::PCLVisualizer("3D viewer"));
viewer->addPointCloud<PointXYZRGB>(cloud, "sample cloud");
viewer->setBackgroundColor(255, 255, 255);
while (!viewer->wasStopped()) {
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(1000));
}
}
return 0;
}

在保存OBJFile((之前,viewer.showCloud((可以显示颜色但是当saveOBJFile((和loadPolygonFileOBJ((之后,颜色丢失obj文件包含颜色吗?还是出了什么问题?那么我如何保存颜色然后.obj文件

通常.obj文件不适合保存颜色。要在PCL中使用颜色,请改用ply文件。另一方面,其他一些应用程序(如Meshlab(支持带颜色的obj文件。

最新更新