【问题标题】:Reading Point Cloud .bin file using C++使用 C++ 读取点云 .bin 文件
【发布时间】:2021-01-04 22:47:13
【问题描述】:

我正在尝试读取 .bin 点云文件。我发现this link 建议了一个可以转换为 C++ 的 python 代码。 我想出了以下代码,但浮点数的精度与我在上述链接中运行 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++ 代码没有显示标题字符串。我的代码可能有什么问题?如何改进?

【问题讨论】:

  • 你文件的前四个字节是F0 A7 92 41,其中三个不可打印;你确定你可以cout他们吗?您的过度类型转换是可疑的。您能否尝试直接阅读您的花车:file &gt;&gt; item;
  • 前 4 个字节不可打印。每次我计算它们时,我都会得到一个不同的字符,有时是 'C' 或 'p',.... 当我尝试 file >> item 时,我得到一系列零而不是我之前得到的小数点值.
  • 链接显示“基本上我们采用了一个 .pcd 文件,删除了标题并以二进制格式保存了数据。”所以我不确定你为什么认为有一个标题。该文件中有很多零。该链接表示它们以 5 个为一组,最后一个未使用的索引,但零与第 5 个值不匹配。 耸耸肩
  • 您正在打印header 数组的地址,类型转换为char。垃圾进——垃圾出……

标签: c++ point-clouds bin


【解决方案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 循环的。这比您对文件结尾条件的测试要好得多,这通常是不正确的。
  • 因此,您将最后一项打印了两次

【讨论】:

  • 非常感谢@zkoza 的全面回答。真的很感激。
  • 尊敬的@zkoza 教授,您能帮我解决另一个关于 .las 文件的问题吗?我完全被这个问题困扰了好几个星期,真的需要帮助。这是问题的链接:link
猜你喜欢
  • 2021-02-10
  • 2021-01-31
  • 1970-01-01
  • 2019-10-23
  • 2023-03-13
  • 1970-01-01
  • 2018-11-22
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多