c ++如何以二进制格式输出ply文件
c++ how to output ply file in binary format
我正在尝试创建一个二进制 PLY 文件,具有以下 header:
ply
format binary_little_endian 1.0
element vertex 43000
property float x
property float y
property float z
property float nx
property float ny
property float nz
property uchar red
property uchar green
property uchar blue
end_header
我有以下重载函数可以写成二进制(用另一个例子验证):
inline void write_fbin(std::ofstream &out, float val) {
out.write(reinterpret_cast<char*>(&val), sizeof(float));
}
inline void write_fbin(std::ofstream &out, unsigned char val) {
out.write(reinterpret_cast<char*>(&val), sizeof(unsigned char));
}
我写的顶点信息如下:
write_fbin(ofstr, static_cast<float>(point.x));
write_fbin(ofstr, static_cast<float>(point.y));
write_fbin(ofstr, static_cast<float>(point.z));
write_fbin(ofstr, static_cast<float>(point.n_x));
write_fbin(ofstr, static_cast<float>(point.n_y));
write_fbin(ofstr, static_cast<float>(point.n_z));
write_fbin(ofstr, static_cast<unsigned char>(point.r));
write_fbin(ofstr, static_cast<unsigned char>(point.g));
write_fbin(ofstr, static_cast<unsigned char>(point.b));
其中 point
是类型
的结构
struct DensePoint {
float x, y, z;
float n_x, n_y, n_z;
unsigned char r, g, b;
};
这不起作用并生成无效的 ply 文件。但是,如果我使用相同的代码(更改 header)来生成 ASCII 版本,
ofstr
<< point.x << ' '
<< point.y << ' '
<< point.z << ' '
<< point.n_x << ' '
<< point.n_y << ' '
<< point.n_z << ' '
<< static_cast<int>(point.r) << ' '
<< static_cast<int>(point.g) << ' '
<< static_cast<int>(point.b) <<
'\n';
这非常有效。有什么问题吗?
也许我需要在二进制格式的每个顶点末尾引入一个换行符?
当将二进制数据写入/读取似乎与预期格式不匹配的文件时,可能存在 OS 级别的字符转换,将某些字节组合替换为其他字节组合(es 0x0C 变为 0x0C 0x0A)。
您很可能以文本模式(C++ 流的默认模式)打开文件,而文件本应是二进制文件,以使 OS 行为保持中性。
我正在尝试创建一个二进制 PLY 文件,具有以下 header:
ply
format binary_little_endian 1.0
element vertex 43000
property float x
property float y
property float z
property float nx
property float ny
property float nz
property uchar red
property uchar green
property uchar blue
end_header
我有以下重载函数可以写成二进制(用另一个例子验证):
inline void write_fbin(std::ofstream &out, float val) {
out.write(reinterpret_cast<char*>(&val), sizeof(float));
}
inline void write_fbin(std::ofstream &out, unsigned char val) {
out.write(reinterpret_cast<char*>(&val), sizeof(unsigned char));
}
我写的顶点信息如下:
write_fbin(ofstr, static_cast<float>(point.x));
write_fbin(ofstr, static_cast<float>(point.y));
write_fbin(ofstr, static_cast<float>(point.z));
write_fbin(ofstr, static_cast<float>(point.n_x));
write_fbin(ofstr, static_cast<float>(point.n_y));
write_fbin(ofstr, static_cast<float>(point.n_z));
write_fbin(ofstr, static_cast<unsigned char>(point.r));
write_fbin(ofstr, static_cast<unsigned char>(point.g));
write_fbin(ofstr, static_cast<unsigned char>(point.b));
其中 point
是类型
struct DensePoint {
float x, y, z;
float n_x, n_y, n_z;
unsigned char r, g, b;
};
这不起作用并生成无效的 ply 文件。但是,如果我使用相同的代码(更改 header)来生成 ASCII 版本,
ofstr
<< point.x << ' '
<< point.y << ' '
<< point.z << ' '
<< point.n_x << ' '
<< point.n_y << ' '
<< point.n_z << ' '
<< static_cast<int>(point.r) << ' '
<< static_cast<int>(point.g) << ' '
<< static_cast<int>(point.b) <<
'\n';
这非常有效。有什么问题吗?
也许我需要在二进制格式的每个顶点末尾引入一个换行符?
当将二进制数据写入/读取似乎与预期格式不匹配的文件时,可能存在 OS 级别的字符转换,将某些字节组合替换为其他字节组合(es 0x0C 变为 0x0C 0x0A)。
您很可能以文本模式(C++ 流的默认模式)打开文件,而文件本应是二进制文件,以使 OS 行为保持中性。