#include "ExamplePointCloudAlgorithm.h"
#include <ImFusion/Base/MeshToPointCloudAlgorithm.h>
#include <ImFusion/Base/PointCloud.h>
#include <ImFusion/Base/SharedImageSet.h>
#include <ImFusion/IO/PointCloudIoAlgorithm.h>
#include <ImFusion/Mesh/PoissonSurfaceReconstructionAlgorithm.h>
#include <ImFusion/Vision/PointCloudFilteringAlgorithm.h>
{
: m_inputPointCloud(pc)
{
configureDefaults();
}
ExamplePointCloudAlgorithm::ExamplePointCloudAlgorithm()
: m_inputPointCloud(nullptr)
{
configureDefaults();
}
ExamplePointCloudAlgorithm::~ExamplePointCloudAlgorithm() {}
bool ExamplePointCloudAlgorithm::createCompatible(const DataList& data, Algorithm** a)
{
auto pointClouds = data.getPointClouds();
if (pointClouds.size() == 0)
{
if (a)
*a = new ExamplePointCloudAlgorithm();
return true;
}
if (pointClouds.size() == 1)
{
if (data.size() == 1)
{
if (a)
*a = new ExamplePointCloudAlgorithm(pointClouds[0]);
return true;
}
}
return false;
}
void ExamplePointCloudAlgorithm::compute()
{
if (m_inputPointCloud)
computePointCloudProcessing();
else
computePointCloudImport();
}
OwningDataList ExamplePointCloudAlgorithm::takeOutput()
{
if (m_outputPointCloud)
{
OwningDataList res(std::move(m_outputPointCloud));
if (m_outputMesh)
res.add(std::move(m_outputMesh));
return res;
}
else if (m_outputMesh)
return OwningDataList(std::move(m_outputMesh));
else
return OwningDataList();
}
void ExamplePointCloudAlgorithm::configure(const Properties* p)
{
if (!p)
return;
if (m_inputPointCloud)
{
p->param("normalRadius", m_normalRadius);
p->param("noiseStdDeviation", m_noiseStdDeviation);
}
else
{
p->param("filePath", m_filePath);
}
}
void ExamplePointCloudAlgorithm::configuration(Properties* p) const
{
if (!p)
return;
if (m_inputPointCloud)
{
p->setParam("normalRadius", m_normalRadius, 0.0);
p->setParam("noiseStdDeviation", m_noiseStdDeviation, 0.0);
}
else
{
p->setParam("filePath", m_filePath, "");
p->setParamType("filePath", Properties::ParamType::Path);
}
}
void ExamplePointCloudAlgorithm::computePointCloudImport()
{
m_status = Status::InvalidInput;
PointCloudIoAlgorithm importAlgo;
importAlgo.setLocation(m_filePath);
importAlgo.compute();
if (importAlgo.status() != Status::Success)
return;
m_outputPointCloud = importAlgo.takeOutput().extractFirst<PointCloud>();
if (!m_outputPointCloud)
return;
vec3 bbMax = -bbMin;
vec3 com = vec3::Zero();
int numValid = 0;
for (const vec3& v : m_outputPointCloud->points())
{
bbMin = bbMin.cwiseMin(v);
bbMax = bbMax.cwiseMax(v);
com += v;
++numValid;
}
com *= (1.0 / static_cast<double>(numValid));
m_outputPointCloud->setMatrix(Eigen::Affine3d(Eigen::Translation3d(-com)).matrix() * m_outputPointCloud->matrix());
const vec3 diameter = bbMax - bbMin;
LOG_INFO(
"Point Cloud dimensions: " << diameter[0] <<
" x " << diameter[1] <<
" x " << diameter[2]);
m_status = Status::Success;
}
void ExamplePointCloudAlgorithm::computePointCloudProcessing()
{
m_status = Status::Error;
if (!m_inputPointCloud)
{
m_status = Status::IncompleteInput;
return;
}
PointCloudFilteringAlgorithm processing({m_outputPointCloud.get()});
processing.setCreateNewPointCloud(false);
if (!m_outputPointCloud->hasNormals())
{
processing.setMode(PointCloudFilteringAlgorithm::FilteringMode::NORMAL_COMPUTATION);
processing.setNormalRadius(m_normalRadius);
processing.compute();
}
processing.setMode(PointCloudFilteringAlgorithm::FilteringMode::ADDITIVE_NOISE_FILTER);
processing.setNoiseStandardDeviation(m_noiseStdDeviation);
processing.compute();
m_status = Status::Success;
}
}
Data structure for point clouds.
Definition PointCloud.h:24
#define LOG_INFO(...)
Emits a log message of Log::Level::Info, optionally with a category.
Definition Log.h:247
Namespace of the ImFusion SDK.
Definition Assert.h:7