Skip to content

Commit

Permalink
Merge pull request #251 from PDAL/issue/250-no-pcd-offsets
Browse files Browse the repository at this point in the history
as referenced in #250, do not apply offsets in conversion to PCD, but pa...
  • Loading branch information
chambbj committed Feb 26, 2014
2 parents 4dbd5df + 6bf5fa5 commit d8d8401
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 51 deletions.
63 changes: 17 additions & 46 deletions include/pdal/PCLConversions.hpp
Expand Up @@ -76,23 +76,11 @@ void PCDtoPDAL(CloudT &cloud, PointBuffer& data)

data.setNumPoints(cloud.points.size());

typename CloudT::PointType testPoint = cloud.points[0];

bool has_x = false;
bool has_y = false;
bool has_z = false;
float x_val = 0.0f;
float y_val = 0.0f;
float z_val = 0.0f;
pcl::for_each_type<FieldList> (pcl::CopyIfFieldExists<typename CloudT::PointType, float> (testPoint, "x", has_x, x_val));
pcl::for_each_type<FieldList> (pcl::CopyIfFieldExists<typename CloudT::PointType, float> (testPoint, "y", has_y, y_val));
pcl::for_each_type<FieldList> (pcl::CopyIfFieldExists<typename CloudT::PointType, float> (testPoint, "z", has_z, z_val));

const pdal::Dimension &dX = buffer_schema.getDimension("X");
const pdal::Dimension &dY = buffer_schema.getDimension("Y");
const pdal::Dimension &dZ = buffer_schema.getDimension("Z");

if (has_x && has_y && has_z)
if (pcl::traits::has_xyz<typename CloudT::PointType>::value)
{
boost::uint32_t size = dX.getByteSize();
switch (dX.getInterpretation())
Expand All @@ -111,7 +99,8 @@ void PCDtoPDAL(CloudT &cloud, PointBuffer& data)
data.setField<boost::int16_t>(dX, i, dX.removeScaling<boost::int16_t>(cloud.points[i].x));
if (size == 4)
for (size_t i = 0; i < cloud.points.size(); ++i)
data.setField<boost::int32_t>(dX, i, dX.removeScaling<boost::int32_t>(cloud.points[i].x));
data.setField<boost::int32_t>(dX, i, cloud.points[i].x/dX.getNumericScale());
//data.setField<boost::uint16_t>(dX, i, dX.removeScaling<boost::uint16_t>(cloud.points[i].x));
if (size == 8)
for (size_t i = 0; i < cloud.points.size(); ++i)
data.setField<boost::int64_t>(dX, i, dX.removeScaling<boost::int64_t>(cloud.points[i].x));
Expand Down Expand Up @@ -154,7 +143,8 @@ void PCDtoPDAL(CloudT &cloud, PointBuffer& data)
data.setField<boost::int16_t>(dY, i, dY.removeScaling<boost::int16_t>(cloud.points[i].y));
if (size == 4)
for (size_t i = 0; i < cloud.points.size(); ++i)
data.setField<boost::int32_t>(dY, i, dY.removeScaling<boost::int32_t>(cloud.points[i].y));
data.setField<boost::int32_t>(dY, i, cloud.points[i].y/dY.getNumericScale());
//data.setField<boost::int32_t>(dY, i, dY.removeScaling<boost::int32_t>(cloud.points[i].y));
if (size == 8)
for (size_t i = 0; i < cloud.points.size(); ++i)
data.setField<boost::int64_t>(dY, i, dY.removeScaling<boost::int64_t>(cloud.points[i].y));
Expand Down Expand Up @@ -197,7 +187,8 @@ void PCDtoPDAL(CloudT &cloud, PointBuffer& data)
data.setField<boost::int16_t>(dZ, i, dZ.removeScaling<boost::int16_t>(cloud.points[i].z));
if (size == 4)
for (size_t i = 0; i < cloud.points.size(); ++i)
data.setField<boost::int32_t>(dZ, i, dZ.removeScaling<boost::int32_t>(cloud.points[i].z));
data.setField<boost::int32_t>(dZ, i, cloud.points[i].z/dZ.getNumericScale());
//data.setField<boost::int32_t>(dZ, i, dZ.removeScaling<boost::int32_t>(cloud.points[i].z));
if (size == 8)
for (size_t i = 0; i < cloud.points.size(); ++i)
data.setField<boost::int64_t>(dZ, i, dZ.removeScaling<boost::int64_t>(cloud.points[i].z));
Expand Down Expand Up @@ -227,12 +218,10 @@ void PCDtoPDAL(CloudT &cloud, PointBuffer& data)

boost::optional<pdal::Dimension const &> dI = buffer_schema.getDimensionOptional("Intensity");

bool has_i = false;
float i_val = 0.0f;
pcl::for_each_type<FieldList> (pcl::CopyIfFieldExists<typename CloudT::PointType, float> (testPoint, "intensity", has_i, i_val));

if (has_i && dI)
if (pcl::traits::has_intensity<typename CloudT::PointType>::value && dI)
{
bool has_i = true;

for (size_t i = 0; i < cloud.points.size(); ++i)
{
float v;
Expand Down Expand Up @@ -264,45 +253,27 @@ void PDALtoPCD(PointBuffer& data, CloudT &cloud)
cloud.is_dense = false;
cloud.points.resize(cloud.width);

typename CloudT::PointType testPoint = cloud.points[0];

bool has_x = false;
bool has_y = false;
bool has_z = false;
float x_val = 0.0f;
float y_val = 0.0f;
float z_val = 0.0f;
pcl::for_each_type<FieldList> (pcl::CopyIfFieldExists<typename CloudT::PointType, float> (testPoint, "x", has_x, x_val));
pcl::for_each_type<FieldList> (pcl::CopyIfFieldExists<typename CloudT::PointType, float> (testPoint, "y", has_y, y_val));
pcl::for_each_type<FieldList> (pcl::CopyIfFieldExists<typename CloudT::PointType, float> (testPoint, "z", has_z, z_val));

const pdal::Dimension &dX = buffer_schema.getDimension("X");
const pdal::Dimension &dY = buffer_schema.getDimension("Y");
const pdal::Dimension &dZ = buffer_schema.getDimension("Z");

if (has_x && has_y && has_z)
if (pcl::traits::has_xyz<typename CloudT::PointType>::value)
{
for (size_t i = 0; i < cloud.points.size(); ++i)
{
float xd = data.applyScaling(dX, i);
float yd = data.applyScaling(dY, i);
float zd = data.applyScaling(dZ, i);
float xd = data.getField<int32_t>(dX, i) * dX.getNumericScale();
float yd = data.getField<int32_t>(dY, i) * dY.getNumericScale();
float zd = data.getField<int32_t>(dZ, i) * dZ.getNumericScale();

typename CloudT::PointType p = cloud.points[i];
pcl::for_each_type<FieldList> (pcl::SetIfFieldExists<typename CloudT::PointType, float> (p, "x", xd));
pcl::for_each_type<FieldList> (pcl::SetIfFieldExists<typename CloudT::PointType, float> (p, "y", yd));
pcl::for_each_type<FieldList> (pcl::SetIfFieldExists<typename CloudT::PointType, float> (p, "z", zd));
p.x = xd; p.y = yd; p.z = zd;
cloud.points[i] = p;
}
}

boost::optional<pdal::Dimension const &> dI = buffer_schema.getDimensionOptional("Intensity");

bool has_i = false;
float i_val = 0.0f;
pcl::for_each_type<FieldList> (pcl::CopyIfFieldExists<typename CloudT::PointType, float> (testPoint, "intensity", has_i, i_val));

if (has_i && dI)
if (pcl::traits::has_intensity<typename CloudT::PointType>::value && dI)
{
for (size_t i = 0; i < cloud.points.size(); ++i)
{
Expand Down
22 changes: 17 additions & 5 deletions src/filters/PCLBlock.cpp
Expand Up @@ -58,6 +58,8 @@ namespace filters
boost::uint32_t
PCLBlock::processBuffer(PointBuffer& srcData, std::string& filename, PointBuffer& dstData) const
{
boost::uint32_t numPointsAfterFiltering = srcData.getNumPoints();

#ifdef PDAL_HAVE_PCL
bool logOutput = log()->getLevel() > logDEBUG1;
if (logOutput)
Expand Down Expand Up @@ -113,18 +115,28 @@ PCLBlock::processBuffer(PointBuffer& srcData, std::string& filename, PointBuffer
pcl::Pipeline<pcl::PointNormal> pipeline;
pipeline.setInputCloud(cloud);
pipeline.setJSON(filename);
pipeline.setOffsets(dX.getNumericOffset(), dY.getNumericOffset(), dZ.getNumericOffset());
pipeline.filter(*cloud_f);

pdal::PCDtoPDAL(*cloud_f, dstData);
if (cloud_f->points.size() > 0)
{
pdal::PCDtoPDAL(*cloud_f, dstData);

log()->get(logDEBUG2) << cloud->points.size() << " before, " << cloud_f->points.size() << " after" << std::endl;

log()->get(logDEBUG2) << cloud->points.size() << " before, " << cloud_f->points.size() << " after" << std::endl;
log()->get(logDEBUG2) << dstData.getNumPoints() << std::endl;

log()->get(logDEBUG2) << dstData.getNumPoints() << std::endl;
log()->get(logDEBUG2) << dstData.applyScaling(dX, 0) << ", " << dstData.applyScaling(dY, 0) << ", " << dstData.applyScaling(dZ, 0) << std::endl;
}
else
{
log()->get(logDEBUG2) << "Filtered cloud has no points!" << std::endl;
}

log()->get(logDEBUG2) << dstData.applyScaling(dX, 0) << ", " << dstData.applyScaling(dY, 0) << ", " << dstData.applyScaling(dZ, 0) << std::endl;
numPointsAfterFiltering = cloud_f->points.size();
#endif

return srcData.getNumPoints();
return numPointsAfterFiltering;
}

PCLBlock::PCLBlock(Stage& prevStage, const Options& options)
Expand Down

0 comments on commit d8d8401

Please sign in to comment.