本文主要是介绍点云pcd保存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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);elsewrite_pcd_binary_compressed(fName, cld);arbit_set_value(dst, fName);return true;}
};
这篇关于点云pcd保存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!