Чтение .bin-файла Point Cloud с помощью C ++

Я пытаюсь прочитать файлы облака точек .bin. Я нашел эту ссылку, предлагающую код Python, который я могу преобразовать на C ++. Я придумал следующий код, но точность чисел с плавающей запятой отличается от результатов, которые я получил при запуске кода Python в приведенной выше ссылке. Я заметил, что некоторые значения координат в середине полностью отсутствуют, или, другими словами, количество значений с плавающей запятой, полученных из python, больше, чем у кода C ++:

std::ifstream file("C:/Users/hedey/OneDrive/Documents/Research_papers/STDF/data_object_velodyne/training/velodyne/001984.bin", ios::in | std::ios::binary);

char header[4];
float item;
if (file.is_open())
{
    file.read((char*)&header, 4);
    cout << char(header) << endl;
    while (!file.eof())
    {
        file.read((char*)&item, 4);
        cout << float(item) << endl;
    }
    file.close();

}

Вот ссылка на bin-файл, который я пытался прочитать: https://www.dropbox.com/s/m6gney49lmr5vg9/001984.zip?dl=0

Кроме того, строка заголовка не отображается с использованием приведенного выше кода C ++. Что может быть не так с моим кодом? как это может быть улучшено?


person Mohamed Hedeya    schedule 04.01.2021    source источник
comment
Первые четыре байта вашего файла F0 A7 92 41, три из них не печатаются; ты уверен, что сможешь cout их? Ваше чрезмерное приведение типов вызывает подозрение. Не могли бы вы попробовать читать ваши поплавки напрямую: file >> item;?   -  person Vlad Feinstein    schedule 05.01.2021
comment
Первые 4 байта не печатаются. Каждый раз, когда я нахожу их, я получаю другой символ, иногда «C» или «p», .... Когда я пробовал файл ›› элемент, я получил серию нулей вместо значений десятичной точки, которые я получал раньше. .   -  person Mohamed Hedeya    schedule 05.01.2021
comment
В ссылке говорится, что по сути мы взяли файл .pcd, удалили заголовки и сохранили данные в двоичном формате. поэтому я не уверен, почему вы думаете, что есть заголовок. В этом файле много нулей. В ссылке говорится, что они находятся в группах по 5, причем последний - неиспользованный индекс, но нули не совпадают до этого 5-го значения. пожать плечами   -  person Retired Ninja    schedule 05.01.2021
comment
Вы печатаете адрес массива header, преобразованный в char. Мусор на входе - мусор на выходе ...   -  person Vlad Feinstein    schedule 05.01.2021


Ответы (1)


Вот код, который дает точно такой же результат, что и версия Python:

#include <iostream>
#include <fstream>
#include <cmath>

int main()
{
  std::ifstream file("1.pcd.bin", std::ios::in | std::ios::binary);
  if (!file) return EXIT_FAILURE;

  float item;
  while (file.read((char*)&item, 4))
  {
    std::cout << "[" << item;
    if (std::round(item) == item) std::cout << ".";
    std::cout  << "]\n";
  }
}

Итак, где вы ошиблись?

  • вы не искали в Интернете или не упомянули здесь, что такое на самом деле формат .pcd.bin. Я нашел определение истинного двоичного формата pcd здесь: https://pointclouds.org/documentation/tutorials/pcd_file_format.html, но это НЕ тот формат, с которым вы имеете дело
  • ну так вы формат не разобрались, отсюда и ваша проблема :-)
  • Ребята, которые изобрели pcd.bin, очевидно, начали с формата ASCII, удалили заголовок, а все остальное написали как двоичные, группами по пять чисел с плавающей запятой.
  • Итак, на входе нет заголовка.
  • Обратите внимание, как я организовываю цикл while. Это намного лучше, чем ваше тестирование на условие конца файла, которое обычно неверно.
  • По этой причине вы дважды распечатали последний элемент.
person zkoza    schedule 05.01.2021
comment
Большое спасибо @zkoza за исчерпывающий ответ. Действительно ценится. - person Mohamed Hedeya; 06.01.2021
comment
Уважаемый профессор @zkoza, не могли бы вы помочь мне с другим вопросом о файлах .las? Я полностью зациклен на этом вопросе на несколько недель, и мне действительно нужна помощь. Это ссылка на вопрос: ссылка - person Mohamed Hedeya; 01.02.2021