как я могу сохранить цвет, а затем файл .obj , с помощью PCL - PullRequest
0 голосов
/ 08 мая 2020

pcl версии 1.9.1 Я читаю файл .txt , и создаю PointXYZRGB , set 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;
}

перед saveOBJFile (), viewer.showCloud () может отображать цвет, но когда saveOBJFile () и loadPolygonFileOBJ () после, потерян цвет. Этот файл .obj содержит цвет? Или что-то не так? так как я могу сохранить цвет тогда .obj файл

1 Ответ

0 голосов
/ 24 июня 2020

Обычно файл .obj не подходит для хранения цветов. Чтобы использовать цвет в PCL, используйте вместо него файл ply. Некоторые другие приложения, такие как Meshlab, с другой стороны, поддерживают файл obj с цветом.

...