pcl中保存点云的接口是 savePCDFileASCII、savePCDFileBinaryCompressed。
一般为了节省空间,我是用 二进制压缩模式比较多。
实现的效果如下:
保存为 二进制
保存为压缩二进制
实际内容如下:
文本模式
二进制模式
二进制压缩模式
实现klib的插件代码如下:
bool write_pcd(const std::string& fileName, const KArbit& cloud)
{
if (auto d = a2T<PointCloudXYZPtr>(&cloud)) return io::savePCDFile(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZIPtr>(&cloud)) return io::savePCDFile(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZRGBPtr>(&cloud)) return io::savePCDFile(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZRGBAPtr>(&cloud)) return io::savePCDFile(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZLPtr>(&cloud)) return io::savePCDFile(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZRGBLPtr>(&cloud)) return io::savePCDFile(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZNormalPtr>(&cloud)) return io::savePCDFile(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZRGBNormalPtr>(&cloud)) return io::savePCDFile(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZINormalPtr>(&cloud)) return io::savePCDFile(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZLNormalPtr>(&cloud)) return io::savePCDFile(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloud2Ptr>(&cloud)) return io::savePCDFile(fileName, *(*d)) >= 0;
return false;
}
bool write_pcd_binary(const std::string & fileName, const KArbit &cloud)
{
if (auto d = a2T<PointCloudXYZPtr>(&cloud)) return io::savePCDFile(fileName, *(*d), true) >= 0;
if (auto d = a2T<PointCloudXYZIPtr>(&cloud)) return io::savePCDFile(fileName, *(*d), true) >= 0;
if (auto d = a2T<PointCloudXYZRGBPtr>(&cloud)) return io::savePCDFile(fileName, *(*d), true) >= 0;
if (auto d = a2T<PointCloudXYZRGBAPtr>(&cloud)) return io::savePCDFile(fileName, *(*d), true) >= 0;
if (auto d = a2T<PointCloudXYZLPtr>(&cloud)) return io::savePCDFile(fileName, *(*d), true) >= 0;
if (auto d = a2T<PointCloudXYZRGBLPtr>(&cloud)) return io::savePCDFile(fileName, *(*d), true) >= 0;
if (auto d = a2T<PointCloudXYZNormalPtr>(&cloud)) return io::savePCDFile(fileName, *(*d), true) >= 0;
if (auto d = a2T<PointCloudXYZRGBNormalPtr>(&cloud)) return io::savePCDFile(fileName, *(*d), true) >= 0;
if (auto d = a2T<PointCloudXYZINormalPtr>(&cloud)) return io::savePCDFile(fileName, *(*d), true) >= 0;
if (auto d = a2T<PointCloudXYZLNormalPtr>(&cloud)) return io::savePCDFile(fileName, *(*d), true) >= 0;
if (auto d = a2T<PointCloud2Ptr>(&cloud)) return pcl::PCDWriter().writeBinary(fileName, *(*d)) >= 0;
return false;
}
bool write_pcd_binary_compressed(const std::string & fileName, const KArbit &cloud)
{
if (auto d = a2T<PointCloudXYZPtr>(&cloud)) return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZIPtr>(&cloud)) return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZRGBPtr>(&cloud)) return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZRGBAPtr>(&cloud)) return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZLPtr>(&cloud)) return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZRGBLPtr>(&cloud)) return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZNormalPtr>(&cloud)) return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZRGBNormalPtr>(&cloud)) return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZINormalPtr>(&cloud)) return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloudXYZLNormalPtr>(&cloud)) return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;
if (auto d = a2T<PointCloud2Ptr>(&cloud)) return pcl::PCDWriter().writeBinaryCompressed(fileName, *(*d)) >= 0;
return false;
}
struct KPclOutCldPcd : KPlugBase
{
bool skipEmpty = true;
string saveType = "pcd_binary_compressed";
KPclOutCldPcd()
{
addProp("modelFile").setType(PropTypeSaveFile).setFileFilter("(*.pcd);;(*.*)").setEmptyIndex(1);
addProp("saveType").setType(PropTypeSelect).setValueAddr(&saveType).setItems({ "pcd","pcd_binary","pcd_binary_compressed" });
addProp("skipEmpty").setType(PropTypeBool).setValueAddr(&skipEmpty);
}
int __exec(const KArbit& src, KArbit& dst) override
{
auto& aL = a2list(src);
auto& cld = aL[0];
CastType(fName, string, aL[1]);
if (!skipEmpty && cld.empty())
return false;
if (saveType == "pcd")
write_pcd(fName, cld);
else if (saveType == "pcd_binary")
write_pcd_binary(fName, cld);
else
write_pcd_binary_compressed(fName, cld);
arbit_set_value(dst, fName);
return true;
}
};