#include "onf_stepcumulativefilter.h" #include "opencv2/imgproc/imgproc.hpp" ONF_StepCumulativeFilter::ONF_StepCumulativeFilter() : SuperClass() { _radius = 2.0; } QString ONF_StepCumulativeFilter::description() const { return tr("Filtre cumulatif"); } QString ONF_StepCumulativeFilter::detailledDescription() const { return tr(""); } QString ONF_StepCumulativeFilter::inputDescription() const { return SuperClass::inputDescription() + tr("

"); } QString ONF_StepCumulativeFilter::outputDescription() const { return SuperClass::outputDescription() + tr("

"); } QString ONF_StepCumulativeFilter::detailsDescription() const { return tr(""); } QString ONF_StepCumulativeFilter::URL() const { //return tr("STEP URL HERE"); return SuperClass::URL(); //by default URL of the plugin } CT_VirtualAbstractStep* ONF_StepCumulativeFilter::createNewInstance() const { return new ONF_StepCumulativeFilter(); } //////////////////// PROTECTED METHODS ////////////////// void ONF_StepCumulativeFilter::declareInputModels(CT_StepInModelStructureManager& manager) { manager.addResult(_inResult, tr("Image")); manager.setZeroOrMoreRootGroup(_inResult, _inZeroOrMoreRootGroup); manager.addGroup(_inZeroOrMoreRootGroup, _inGroup); manager.addItem(_inGroup, _inImage, tr("Image")); } void ONF_StepCumulativeFilter::declareOutputModels(CT_StepOutModelStructureManager& manager) { manager.addResultCopy(_inResult); manager.addItem(_inGroup, _outcumulativeImage, tr("Image cumulée")); } void ONF_StepCumulativeFilter::fillPostInputConfigurationDialog(CT_StepConfigurableDialog* postInputConfigDialog) { postInputConfigDialog->addDouble(tr("Rayon de sommation"), tr("en mètres"), 0, 999999, 2, _radius, 1); } void ONF_StepCumulativeFilter::compute() { for (CT_StandardItemGroup* grp : _inGroup.iterateOutputs(_inResult)) { for (const CT_AbstractImage2D* imageIn : grp->singularItems(_inImage)) { if (isStopped()) {return;} int ncells = int(std::ceil((_radius - (imageIn->resolution() / 2.0)) / imageIn->resolution())); qDebug() << ncells; Eigen::Vector2d min; imageIn->getMinCoordinates(min); CT_Image2D* cumulativeImage = new CT_Image2D(min(0), min(1), imageIn->xdim(), imageIn->ydim(), imageIn->resolution(), imageIn->level(), -1, 0); grp->addSingularItem(_outcumulativeImage, cumulativeImage); for (int x = 0 ; x < cumulativeImage->xdim() ; x++) { for (int y = 0 ; y < cumulativeImage->ydim() ; y++) { int xxMin = x - ncells; if (xxMin < 0) {xxMin = 0;} int yyMin = y - ncells; if (yyMin < 0) {yyMin = 0;} int xxMax = x + ncells; if (xxMax >= cumulativeImage->xdim()) {xxMax = cumulativeImage->xdim() - 1;} int yyMax = y + ncells; if (yyMax >= cumulativeImage->ydim()) {yyMax = cumulativeImage->ydim() - 1;} Eigen::Vector3d centerCoord = Eigen::Vector3d(0.0, 0.0, 0.0); cumulativeImage->getCellCenterCoordinates(x, y, centerCoord); float sum = 0; for (int xx = xxMin ; xx <= xxMax ; xx++) { for (int yy = yyMin ; yy <= yyMax ; yy++) { size_t index = 0; imageIn->index(xx, yy, index); Eigen::Vector3d cellCoord = Eigen::Vector3d(0.0, 0.0, 0.0); cumulativeImage->getCellCenterCoordinates(xx, yy, cellCoord); double dist = std::sqrt(pow(centerCoord(0) - cellCoord(0), 2) + pow(centerCoord(1) - cellCoord(1), 2)); if (dist <= _radius) { sum += float(imageIn->valueAtIndexAsDouble(index)); } } } cumulativeImage->setValue(x, y, sum); } setProgress(100*int(double(x) / double(cumulativeImage->xdim()))); } cumulativeImage->computeMinMax(); } } }