使用 C++ 读取点云 .bin 文件
Reading Point Cloud .bin file using C++
我正在尝试读取 .bin 点云文件。我发现 this link 建议我可以将其转换为 C++ 的 python 代码。
我想出了下面的代码,但是浮点数的精度与我从上面 link 中的 运行 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 文件的 link:
https://www.dropbox.com/s/m6gney49lmr5vg9/001984.zip?dl=0
此外,header 字符串未使用上述 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 格式开始的,删除了 header,并将其他所有内容写为二进制,以五个浮点数为一组。
- 所以输入中没有header。
- 请注意我是如何组织
while
循环的。它比您对 end-of-file 条件的测试要好得多,后者通常是不正确的。
- 因此,您将最后一项打印了两次
我正在尝试读取 .bin 点云文件。我发现 this link 建议我可以将其转换为 C++ 的 python 代码。 我想出了下面的代码,但是浮点数的精度与我从上面 link 中的 运行 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 文件的 link: https://www.dropbox.com/s/m6gney49lmr5vg9/001984.zip?dl=0
此外,header 字符串未使用上述 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 格式开始的,删除了 header,并将其他所有内容写为二进制,以五个浮点数为一组。
- 所以输入中没有header。
- 请注意我是如何组织
while
循环的。它比您对 end-of-file 条件的测试要好得多,后者通常是不正确的。 - 因此,您将最后一项打印了两次