使用 C++ 读取点云 .bin 文件

问题描述

我正在尝试读取 .bin 点云文件。我发现 this link 建议我可以转换为 C++ 的 python 代码。 我想出了以下代码,但与我在上面链接中运行 python 代码得到的结果相比,浮点数的精度是不同的。我注意到中间的一些坐标值完全丢失了,或者换句话说,python产生的浮点值的数量比C++代码的多:

{"name": "Jack","age": 25}

这是我试图阅读的 bin 文件链接https://www.dropbox.com/s/m6gney49lmr5vg9/001984.zip?dl=0

此外,使用上述 C++ 代码显示标题字符串。我的代码可能有什么问题?如何改进?

解决方法

下面的代码产生与 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 循环。这比您对文件结束条件的测试要好得多,后者通常是不正确的。
  • 因此,您将最后一项打印了两次