mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 01:20:25 +08:00
export: output intensity channel with RGB when --cam_projection and --scan options are set (PDAL required)
This commit is contained in:
@@ -36,8 +36,8 @@ namespace rtabmap {
|
||||
std::string getPDALSupportedWriters();
|
||||
|
||||
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZ> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false);
|
||||
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZRGB> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false);
|
||||
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZRGBNormal> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false);
|
||||
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZRGB> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false, const std::vector<float> & intensities = std::vector<float>());
|
||||
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZRGBNormal> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false, const std::vector<float> & intensities = std::vector<float>());
|
||||
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZI> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false);
|
||||
int savePDALFile(const std::string & filePath, const pcl::PointCloud<pcl::PointXYZINormal> & cloud, const std::vector<int> & cameraIds = std::vector<int>(), bool binary = false);
|
||||
|
||||
|
||||
@@ -143,14 +143,40 @@ int savePDALFile(const std::string & filePath,
|
||||
int savePDALFile(const std::string & filePath,
|
||||
const pcl::PointCloud<pcl::PointXYZRGB> & cloud,
|
||||
const std::vector<int> & cameraIds,
|
||||
bool binary)
|
||||
bool binary,
|
||||
const std::vector<float> & intensities)
|
||||
{
|
||||
UASSERT_MSG(cameraIds.empty() || cameraIds.size() == cloud.size(),
|
||||
uFormat("cameraIds=%d cloud=%d", (int)cameraIds.size(), (int)cloud.size()).c_str());
|
||||
UASSERT_MSG(intensities.empty() || intensities.size() == cloud.size(),
|
||||
uFormat("intensities=%d cloud=%d", (int)intensities.size(), (int)cloud.size()).c_str());
|
||||
|
||||
pdal::PointTable table;
|
||||
|
||||
if(!cameraIds.empty())
|
||||
if(!intensities.empty() && !cameraIds.empty())
|
||||
{
|
||||
table.layout()->registerDims({
|
||||
pdal::Dimension::Id::X,
|
||||
pdal::Dimension::Id::Y,
|
||||
pdal::Dimension::Id::Z,
|
||||
pdal::Dimension::Id::Red,
|
||||
pdal::Dimension::Id::Green,
|
||||
pdal::Dimension::Id::Blue,
|
||||
pdal::Dimension::Id::PointSourceId,
|
||||
pdal::Dimension::Id::Intensity});
|
||||
}
|
||||
else if(!intensities.empty())
|
||||
{
|
||||
table.layout()->registerDims({
|
||||
pdal::Dimension::Id::X,
|
||||
pdal::Dimension::Id::Y,
|
||||
pdal::Dimension::Id::Z,
|
||||
pdal::Dimension::Id::Red,
|
||||
pdal::Dimension::Id::Green,
|
||||
pdal::Dimension::Id::Blue,
|
||||
pdal::Dimension::Id::Intensity});
|
||||
}
|
||||
else if(!cameraIds.empty())
|
||||
{
|
||||
table.layout()->registerDims({
|
||||
pdal::Dimension::Id::X,
|
||||
@@ -186,6 +212,10 @@ int savePDALFile(const std::string & filePath,
|
||||
{
|
||||
view->setField(pdal::Dimension::Id::PointSourceId, i, cameraIds.at(i));
|
||||
}
|
||||
if(!intensities.empty())
|
||||
{
|
||||
view->setField(pdal::Dimension::Id::Intensity, i, (unsigned short)intensities.at(i));
|
||||
}
|
||||
}
|
||||
bufferReader.addView(view);
|
||||
|
||||
@@ -219,14 +249,46 @@ int savePDALFile(const std::string & filePath,
|
||||
int savePDALFile(const std::string & filePath,
|
||||
const pcl::PointCloud<pcl::PointXYZRGBNormal> & cloud,
|
||||
const std::vector<int> & cameraIds,
|
||||
bool binary)
|
||||
bool binary,
|
||||
const std::vector<float> & intensities)
|
||||
{
|
||||
UASSERT_MSG(cameraIds.empty() || cameraIds.size() == cloud.size(),
|
||||
uFormat("cameraIds=%d cloud=%d", (int)cameraIds.size(), (int)cloud.size()).c_str());
|
||||
UASSERT_MSG(intensities.empty() || intensities.size() == cloud.size(),
|
||||
uFormat("intensities=%d cloud=%d", (int)intensities.size(), (int)cloud.size()).c_str());
|
||||
|
||||
pdal::PointTable table;
|
||||
|
||||
if(!cameraIds.empty())
|
||||
if(!intensities.empty() && !cameraIds.empty())
|
||||
{
|
||||
table.layout()->registerDims({
|
||||
pdal::Dimension::Id::X,
|
||||
pdal::Dimension::Id::Y,
|
||||
pdal::Dimension::Id::Z,
|
||||
pdal::Dimension::Id::Red,
|
||||
pdal::Dimension::Id::Green,
|
||||
pdal::Dimension::Id::Blue,
|
||||
pdal::Dimension::Id::NormalX,
|
||||
pdal::Dimension::Id::NormalY,
|
||||
pdal::Dimension::Id::NormalZ,
|
||||
pdal::Dimension::Id::PointSourceId,
|
||||
pdal::Dimension::Id::Intensity});
|
||||
}
|
||||
else if(!intensities.empty())
|
||||
{
|
||||
table.layout()->registerDims({
|
||||
pdal::Dimension::Id::X,
|
||||
pdal::Dimension::Id::Y,
|
||||
pdal::Dimension::Id::Z,
|
||||
pdal::Dimension::Id::Red,
|
||||
pdal::Dimension::Id::Green,
|
||||
pdal::Dimension::Id::Blue,
|
||||
pdal::Dimension::Id::NormalX,
|
||||
pdal::Dimension::Id::NormalY,
|
||||
pdal::Dimension::Id::NormalZ,
|
||||
pdal::Dimension::Id::Intensity});
|
||||
}
|
||||
else if(!cameraIds.empty())
|
||||
{
|
||||
table.layout()->registerDims({
|
||||
pdal::Dimension::Id::X,
|
||||
@@ -271,6 +333,10 @@ int savePDALFile(const std::string & filePath,
|
||||
{
|
||||
view->setField(pdal::Dimension::Id::PointSourceId, i, cameraIds.at(i));
|
||||
}
|
||||
if(!intensities.empty())
|
||||
{
|
||||
view->setField(pdal::Dimension::Id::Intensity, i, (unsigned short)intensities.at(i));
|
||||
}
|
||||
}
|
||||
bufferReader.addView(view);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user