10 #include <Utils/PCLCloud.h>
11 #include <Utils/cc2sm.h>
12 #include <Utils/sm2cc.h>
14 #include "PclUtils/PCLModules.h"
15 #include "Tools/Common/ecvTools.h"
25 #include <QMainWindow>
32 PointCloudT::Ptr cloudRemained,
33 std::vector<PointCloudT::Ptr>& cloudExtractions,
36 float minRadiusLimits,
37 float maxRadiusLimits,
38 float distanceThreshold,
41 float normalDisWeight,
42 float maxRemainingRatio,
43 bool exportExtraction,
44 bool recursive =
false,
49 tr(
"SAC Segmentation"),
50 tr(
"SAC Segmentation"),
51 tr(
"SAC Segmentation from clouds"),
52 ":/toolbar/PclAlgorithms/icons/SAC_Segmentation.png")),
54 m_distanceThreshold(0.01f),
55 m_normalDisWeight(0.1f),
57 m_minRadiusLimits(0.01f),
58 m_maxRadiusLimits(10.0f),
62 m_exportExtraction(true),
63 m_exportRemaining(true),
64 m_maxRemainingRatio(0.3f),
65 m_recursiveMode(false),
66 m_useVoxelGrid(false),
77 if (have_cloud != 1)
return -11;
100 static_cast<float>(
m_dialog->disThresholdSpinBox->value());
106 static_cast<float>(
m_dialog->normalDisWeightSpinBox->value());
112 static_cast<float>(
m_dialog->maxRemainingRatioSpinBox->value());
131 if (!cloud)
return -1;
134 PointCloudT::Ptr cloudFiltered = cc2smReader(cloud).getXYZ2();
135 if (!cloudFiltered)
return -1;
139 PointCloudT::Ptr tempCloud(
new PointCloudT);
140 if (!PCLModules::VoxelGridFilter<PointT>(cloudFiltered, tempCloud,
145 cloudFiltered = tempCloud;
148 PointCloudT::Ptr cloudRemained(
new PointCloudT());
149 std::vector<PointCloudT::Ptr> cloudExtractions;
160 ccHObject* group = ecvTools::GetSegmentationGroup(
162 cloudExtractions,
true,
error);
171 tr(
"-SingleSegmentation[Distance Threshold %1]")
177 "segment(s) where created from cloud '%2'")
178 .arg(cloudExtractions.size())
183 "of segments! Result may be incomplete"),
203 PointCloudT::Ptr cloudRemained,
204 std::vector<PointCloudT::Ptr>& cloudExtractions,
207 float minRadiusLimits,
208 float maxRadiusLimits,
209 float distanceThreshold,
212 float normalDisWeight,
213 float maxRemainingRatio,
214 bool exportExtraction,
217 pcl::PointIndices::Ptr inliers(
new pcl::PointIndices());
218 pcl::ModelCoefficients::Ptr coefficients(
new pcl::ModelCoefficients());
220 int i = 0, nr_points = (int)cloudFilterd->points.size();
221 while (cloudFilterd->points.size() > maxRemainingRatio * nr_points) {
223 if (!PCLModules::GetSACSegmentation(
224 cloudFilterd, inliers, coefficients, methodType, modelType,
225 distanceThreshold, probability, maxIterations,
226 minRadiusLimits, maxRadiusLimits, normalDisWeight)) {
232 if (inliers->indices.size() == 0) {
237 PointCloudT::Ptr cloudExtracted(
new PointCloudT());
238 if (!PCLModules::ExtractIndicesFilter<PointT>(
239 cloudFilterd, inliers, cloudExtracted, cloudRemained)) {
240 app->
dispToConsole(
"PCLModules::ExtractIndicesFilter failed",
245 if (exportExtraction) {
246 cloudExtractions.push_back(cloudExtracted);
248 *cloudFilterd = *cloudRemained;
250 if (!recursive)
break;
262 "must select one of 'Export Extraction' and "
263 "'exportRemaining' or both");
266 "Wrong Parameters. One or more parameters cannot be "
270 "SAC Segmentation could not estimate a model for the given "
271 "dataset. Try relaxing your parameters");
273 return tr(
"An error occurred during the generation of segments!");
int extractRecursive(PointCloudT::Ptr xyzCloud, PointCloudT::Ptr cloudRemained, std::vector< PointCloudT::Ptr > &cloudExtractions, int maxIterations, float probability, float minRadiusLimits, float maxRadiusLimits, float distanceThreshold, int methodType, int modelType, float normalDisWeight, float maxRemainingRatio, bool exportExtraction, bool recursive=false, ecvMainAppInterface *app=nullptr)
Base abstract class for each implemented PCL filter.
int isFirstSelectedCcPointCloud()
Returns 1 if the first selected object is a ccPointCloud.
void newEntity(ccHObject *)
Signal emitted when a new entity is created by the filter.
ecvMainAppInterface * m_app
Associated application interface.
virtual QString getErrorMessage(int errorCode)
Returns the error message corresponding to a given error code.
ccPointCloud * getSelectedEntityAsCCPointCloud() const
Returns the first selected entity as a ccPointCloud.
virtual QString getErrorMessage(int errorCode)
Returns the error message corresponding to a given error code.
virtual void getParametersFromDialog()
Collects parameters from the filter dialog (if openDialog is successful)
virtual ~SACSegmentation()
virtual int checkSelected()
Checks if current selection is compliant with the filter.
virtual int openInputDialog()
float m_maxRemainingRatio
virtual int compute()
Performs the actual filter job.
SACSegmentationDlg * m_dialog
virtual int checkParameters()
float m_distanceThreshold
Hierarchical CLOUDVIEWER Object.
unsigned getChildrenNumber() const
Returns the number of children.
virtual bool addChild(ccHObject *child, int dependencyFlags=DP_PARENT_OF_OTHER, int insertIndex=-1)
Adds a child.
ccHObject * getParent() const
Returns parent object.
virtual QString getName() const
Returns object name.
virtual void setName(const QString &name)
Sets object name.
virtual void setEnabled(bool state)
Sets the "enabled" property.
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
Main application interface (for plugins)
virtual QWidget * getActiveWindow()=0
virtual void dispToConsole(QString message, ConsoleMessageLevel level=STD_CONSOLE_MESSAGE)=0
static void error(char *msg)