2018-10-26 10:41:22 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
//##########################################################################
|
|
|
|
|
//# #
|
|
|
|
|
//# CLOUDCOMPARE PLUGIN: q3DMASC #
|
|
|
|
|
//# #
|
|
|
|
|
//# This program is free software; you can redistribute it and/or modify #
|
|
|
|
|
//# it under the terms of the GNU General Public License as published by #
|
|
|
|
|
//# the Free Software Foundation; version 2 or later of the License. #
|
|
|
|
|
//# #
|
|
|
|
|
//# This program is distributed in the hope that it will be useful, #
|
|
|
|
|
//# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
|
|
|
|
//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
|
|
|
|
//# GNU General Public License for more details. #
|
|
|
|
|
//# #
|
|
|
|
|
//# COPYRIGHT: Dimitri Lague / CNRS / UEB #
|
|
|
|
|
//# #
|
|
|
|
|
//##########################################################################
|
|
|
|
|
|
|
|
|
|
//Local
|
|
|
|
|
#include "Parameters.h"
|
|
|
|
|
#include "FeaturesInterface.h"
|
|
|
|
|
|
|
|
|
|
//Qt
|
|
|
|
|
#include <QString>
|
|
|
|
|
|
2018-10-26 12:02:23 +02:00
|
|
|
//CCLib
|
|
|
|
|
#include <ReferenceCloud.h>
|
|
|
|
|
|
2018-10-26 10:41:22 +02:00
|
|
|
//OpenCV
|
|
|
|
|
#include <opencv2/ml.hpp>
|
|
|
|
|
|
|
|
|
|
class QWidget;
|
2019-01-20 22:12:20 +01:00
|
|
|
class ccMainAppInterface;
|
2018-10-26 10:41:22 +02:00
|
|
|
|
|
|
|
|
//! 3DMASC classifier
|
|
|
|
|
namespace masc
|
|
|
|
|
{
|
|
|
|
|
class Classifier
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
//! Default constructor
|
|
|
|
|
Classifier();
|
|
|
|
|
|
|
|
|
|
//! Train the classifier
|
2019-01-20 22:12:20 +01:00
|
|
|
bool train( const ccPointCloud* cloud,
|
|
|
|
|
const RandomTreesParams& params,
|
|
|
|
|
const Feature::Set& features,
|
|
|
|
|
QString& errorMessage,
|
|
|
|
|
CCLib::ReferenceCloud* trainSubset = nullptr,
|
|
|
|
|
ccMainAppInterface* app = nullptr,
|
|
|
|
|
QWidget* parentWidget = nullptr);
|
2018-10-26 12:02:23 +02:00
|
|
|
|
|
|
|
|
//! Classifier accuracy metrics
|
|
|
|
|
struct AccuracyMetrics
|
|
|
|
|
{
|
|
|
|
|
unsigned sampleCount = 0;
|
|
|
|
|
unsigned goodGuess = 0;
|
|
|
|
|
float ratio = 0.0f;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//! Evaluates the classifier
|
|
|
|
|
bool evaluate(const Feature::Set& features, CCLib::ReferenceCloud* testSubset, AccuracyMetrics& metrics, QString& errorMessage, QWidget* parentWidget = nullptr);
|
2018-10-26 10:41:22 +02:00
|
|
|
|
2018-11-04 23:31:48 +01:00
|
|
|
//! Applies the classifier
|
|
|
|
|
bool classify(const Feature::Set& features, ccPointCloud* cloud, QString& errorMessage, QWidget* parentWidget = nullptr);
|
|
|
|
|
|
2018-10-26 10:41:22 +02:00
|
|
|
//! Returns whether the classifier is valid or not
|
|
|
|
|
bool isValid() const;
|
|
|
|
|
|
|
|
|
|
//! Saves the classifier to file
|
|
|
|
|
bool toFile(QString filename, QWidget* parentWidget = nullptr) const;
|
|
|
|
|
//! Loads the classifier from file
|
|
|
|
|
bool fromFile(QString filename, QWidget* parentWidget = nullptr);
|
|
|
|
|
|
2019-01-20 22:12:20 +01:00
|
|
|
inline cv::Mat getVarImportance() const { return m_rtrees->getVarImportance(); }
|
|
|
|
|
|
2019-03-25 18:45:28 +01:00
|
|
|
//! Helper: returns the classification SF associated to a cloud (if any)
|
|
|
|
|
static CCLib::ScalarField* GetClassificationSF(const ccPointCloud* cloud);
|
|
|
|
|
|
2018-10-26 10:41:22 +02:00
|
|
|
protected:
|
|
|
|
|
|
|
|
|
|
//! Random trees (OpenCV)
|
|
|
|
|
cv::Ptr<cv::ml::RTrees> m_rtrees;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}; //namespace masc
|