Чтение облака точек ascii в формате x y z r g b - PullRequest
0 голосов
/ 30 октября 2018

У меня есть облако точек в текстовом файле, где каждая строка имеет вид:

x y z r g b

Как мне прочитать это в облаке точек XYZRGB в PCL? Читатель ascii или pcdreader в PCL ожидают, что формат будет иметь вид x y z rgb, где rgb - это одно значение, представляющее вместе каналы r g b.

Можно ли как-то прочитать облака точек в формате, который я упомянул выше, без необходимости изменять сами облака точек?

РЕДАКТИРОВАТЬ: Добавление моего текущего кода и некоторых строк из облака точек в ответ на комментарий

    pcl::ASCIIReader ptsReader;
    ptsReader.setSepChars(" ");
    ptsReader.read(m_pointCloudFilePath,*m_pointCloudRef);

, если m_pointCloudRef имеет тип: pcl::PointCloud<pcl::PointXYZRGB>::Ptr этот код не работает с сообщением об ошибке времени выполнения: Failed to find match for field 'rgb'.. Тот же код работает, если m_pointCloudRef имеет тип pcl::PointCloud<pcl::PointXYZ>::Ptr (что также означает, что я работаю с файлом ASCII, где каждая строка x y z)

Ниже приведены первые несколько строк облака точек, которые я использую:

0.792 9.978 12.769 234 220 209
0.792 9.978 12.768 242 228 217
0.794 9.978 12.771 241 227 214
0.794 9.978 12.770 247 231 218
0.793 9.979 12.769 234 217 207
0.793 9.979 12.768 238 224 213
0.794 9.979 12.767 239 227 215
0.795 9.978 12.772 230 221 206
0.795 9.978 12.771 243 229 216
0.795 9.979 12.770 242 226 213
0.795 9.979 12.769 235 218 208
0.795 9.979 12.768 235 221 210
0.795 9.979 12.767 240 228 216
0.795 9.979 12.766 240 230 218
0.795 9.979 12.765 240 230 218
0.795 9.978 12.763 244 234 222

1 Ответ

0 голосов
/ 07 ноября 2018

Если вы не хотите изменять способ хранения облаков на диске и нужно работать только с очень небольшим количеством типов облаков , вы можете просто прочитать их вручную.

 bool loadAsciCloud(std::string filename, pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud)
{
    std::cout << "Begin Loading Model" << std::endl;
    FILE* f = fopen(filename.c_str(), "r");

    if (NULL == f)
    {
        std::cout << "ERROR: failed to open file: " << filename << endl;
        return false;
    }

    float x, y, z;
    char r, g, b;

    while (!feof(f))
    {
        int n_args = fscanf_s(f, "%f %f %f %c %c %c", &x, &y, &z, &r, &g, &b);
        if (n_args != 6)
            continue;

        pcl::PointXYZRGB point;
        point.x = x; 
        point.y = y; 
        point.z = z;
        point.r = r;
        point.g = g;
        point.b = b;

        cloud->push_back(p);
    }

    fclose(f);

    std::cout << "Loaded cloud with " << cloud->size() << " points." << std::endl;

    return cloud->size() > 0;
}
...