本文整理汇总了C++中DgmOctree类的典型用法代码示例。如果您正苦于以下问题:C++ DgmOctree类的具体用法?C++ DgmOctree怎么用?C++ DgmOctree使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了DgmOctree类的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: assert
GenericIndexedCloud* CloudSamplingTools::resampleCloudWithOctree(GenericIndexedCloudPersist* theCloud, int newNumberOfPoints, RESAMPLING_CELL_METHOD resamplingMethod, GenericProgressCallback* progressCb, DgmOctree* _theOctree)
{
assert(theCloud);
DgmOctree* theOctree = _theOctree;
if (!theOctree)
{
theOctree = new DgmOctree(theCloud);
if (theOctree->build(progressCb) < 1)
return 0;
}
//on cherche le niveau qui donne le nombre de points le plus proche de la consigne
uchar bestLevel=theOctree->findBestLevelForAGivenCellNumber(newNumberOfPoints);
GenericIndexedCloud* sampledCloud = resampleCloudWithOctreeAtLevel(theCloud,bestLevel,resamplingMethod,progressCb,theOctree);
if (!_theOctree)
delete theOctree;
return sampledCloud;
}
示例2: DgmOctree
int AutoSegmentationTools::labelConnectedComponents(GenericIndexedCloudPersist* theCloud,
unsigned char level,
bool sixConnexity/*=false*/,
GenericProgressCallback* progressCb/*=0*/,
DgmOctree* inputOctree/*=0*/)
{
if (!theCloud)
{
return -1;
}
//compute octree if none was provided
DgmOctree* theOctree = inputOctree;
if (!theOctree)
{
theOctree = new DgmOctree(theCloud);
if (theOctree->build(progressCb) < 1)
{
delete theOctree;
return -1;
}
}
//we use the default scalar field to store components labels
theCloud->enableScalarField();
int result = theOctree->extractCCs(level, sixConnexity, progressCb);
//remove octree if it was not provided as input
if (theOctree && !inputOctree)
{
delete theOctree;
}
return result;
}
示例3: DgmOctree
bool AutoSegmentationTools::frontPropagationBasedSegmentation(GenericIndexedCloudPersist* theCloud,
ScalarType minSeedDist,
uchar octreeLevel,
ReferenceCloudContainer& theSegmentedLists,
GenericProgressCallback* progressCb,
DgmOctree* inputOctree,
bool applyGaussianFilter,
float alpha)
{
unsigned numberOfPoints = (theCloud ? theCloud->size() : 0);
if (numberOfPoints == 0)
return false;
//compute octree if none was provided
DgmOctree* theOctree = inputOctree;
if (!theOctree)
{
theOctree = new DgmOctree(theCloud);
if (theOctree->build(progressCb)<1)
{
delete theOctree;
return false;
}
}
//on calcule le gradient (va ecraser le champ des distances)
if (ScalarFieldTools::computeScalarFieldGradient(theCloud,true,true,progressCb,theOctree) < 0)
{
if (!inputOctree)
delete theOctree;
return false;
}
//et on lisse le resultat
if (applyGaussianFilter)
{
uchar level = theOctree->findBestLevelForAGivenPopulationPerCell(NUMBER_OF_POINTS_FOR_GRADIENT_COMPUTATION);
PointCoordinateType cellSize = theOctree->getCellSize(level);
ScalarFieldTools::applyScalarFieldGaussianFilter(static_cast<float>(cellSize/3),theCloud,-1,progressCb,theOctree);
}
unsigned seedPoints = 0;
unsigned numberOfSegmentedLists = 0;
//on va faire la propagation avec le FastMarching();
FastMarchingForPropagation* fm = new FastMarchingForPropagation();
fm->setJumpCoef(50.0);
fm->setDetectionThreshold(alpha);
int result = fm->init(theCloud,theOctree,octreeLevel);
int octreeLength = OCTREE_LENGTH(octreeLevel)-1;
if (result<0)
{
if (!inputOctree)
delete theOctree;
delete fm;
return false;
}
if (progressCb)
{
progressCb->reset();
progressCb->setMethodTitle("FM Propagation");
char buffer[256];
sprintf(buffer,"Octree level: %i\nNumber of points: %u",octreeLevel,numberOfPoints);
progressCb->setInfo(buffer);
progressCb->start();
}
ScalarField* theDists = new ScalarField("distances");
{
ScalarType d = theCloud->getPointScalarValue(0);
if (!theDists->resize(numberOfPoints,true,d))
{
if (!inputOctree)
delete theOctree;
return false;
}
}
unsigned maxDistIndex = 0, begin = 0;
CCVector3 startPoint;
while (true)
{
ScalarType maxDist = NAN_VALUE;
//on cherche la premiere distance superieure ou egale a "minSeedDist"
while (begin<numberOfPoints)
{
const CCVector3 *thePoint = theCloud->getPoint(begin);
const ScalarType& theDistance = theDists->getValue(begin);
++begin;
//FIXME DGM: what happens if SF is negative?!
if (theCloud->getPointScalarValue(begin) >= 0 && theDistance >= minSeedDist)
{
//.........这里部分代码省略.........
示例4: assert
double StatisticalTestingTools::testCloudWithStatisticalModel(const GenericDistribution* distrib,
GenericIndexedCloudPersist* theCloud,
unsigned numberOfNeighbours,
double pTrust,
GenericProgressCallback* progressCb/*=0*/,
DgmOctree* inputOctree/*=0*/)
{
assert(theCloud);
if (!distrib->isValid())
return -1.0;
DgmOctree* theOctree = inputOctree;
if (!theOctree)
{
theOctree = new DgmOctree(theCloud);
if (theOctree->build(progressCb) < 1)
{
delete theOctree;
return -2.0;
}
}
//on active le champ scalaire (IN) pour recevoir les distances du Chi2
theCloud->enableScalarField();
unsigned char level = theOctree->findBestLevelForAGivenPopulationPerCell(numberOfNeighbours);
unsigned numberOfChi2Classes = (unsigned)ceil(sqrt((double)numberOfNeighbours));
//Chi2 hisogram values
unsigned* histoValues = new unsigned[numberOfChi2Classes];
if (!histoValues)
{
if (!inputOctree)
delete theOctree;
return -3.0;
}
ScalarType* histoMin = 0, customHistoMin = 0;
ScalarType* histoMax = 0, customHistoMax = 0;
if (strcmp(distrib->getName(),"Gauss")==0)
{
const NormalDistribution* nDist = static_cast<const NormalDistribution*>(distrib);
ScalarType mu=0, sigma2=0;
nDist->getParameters(mu, sigma2);
customHistoMin = mu - (ScalarType)3.0 * sqrt(sigma2);
histoMin = &customHistoMin;
customHistoMax = mu + (ScalarType)3.0 * sqrt(sigma2);
histoMax = &customHistoMax;
}
else if (strcmp(distrib->getName(),"Weibull")==0)
{
customHistoMin = 0;
histoMin = &customHistoMin;
}
//additionnal parameters for local process
void* additionalParameters[] = { reinterpret_cast<void*>(const_cast<GenericDistribution*>(distrib)),
reinterpret_cast<void*>(&numberOfNeighbours),
reinterpret_cast<void*>(&numberOfChi2Classes),
reinterpret_cast<void*>(histoValues),
reinterpret_cast<void*>(histoMin),
reinterpret_cast<void*>(histoMax) };
double maxChi2 = -1.0;
//let's compute Chi2 distances
if (theOctree->executeFunctionForAllCellsStartingAtLevel( level,
&computeLocalChi2DistAtLevel,
additionalParameters,
numberOfNeighbours/2,
numberOfNeighbours*3,
true,
progressCb,
"Statistical Test") != 0) //sucess
{
if (!progressCb || !progressCb->isCancelRequested())
{
//theoretical Chi2 fractile
maxChi2 = computeChi2Fractile(pTrust, numberOfChi2Classes-1);
maxChi2 = sqrt(maxChi2); //on travaille avec les racines carrees des distances du Chi2
}
}
delete[] histoValues;
histoValues=0;
if (!inputOctree)
delete theOctree;
return maxChi2;
}
示例5: DgmOctree
bool AutoSegmentationTools::frontPropagationBasedSegmentation(GenericIndexedCloudPersist* theCloud,
bool signedSF,
DistanceType minSeedDist,
uchar octreeLevel,
ReferenceCloudContainer& theSegmentedLists,
GenericProgressCallback* progressCb,
DgmOctree* _theOctree,
bool applyGaussianFilter,
float alpha)
{
if (!theCloud)
return false;
unsigned numberOfPoints = theCloud->size();
if (numberOfPoints<1)
return false;
//on calcule l'octree
DgmOctree* theOctree = _theOctree;
if (!theOctree)
{
theOctree = new DgmOctree(theCloud);
if (theOctree->build(progressCb)<1)
{
delete theOctree;
return false;
}
}
ScalarField* theDists = new ScalarField("distances",true);
if (!theDists->reserve(numberOfPoints))
{
if (!_theOctree)
delete theOctree;
return false;
}
theCloud->placeIteratorAtBegining();
unsigned k=0;
DistanceType d = theCloud->getPointScalarValue(k);
for (;k<numberOfPoints;++k)
theDists->addElement(d);
//on calcule le gradient (va écraser le champ des distances)
if (ScalarFieldTools::computeScalarFieldGradient(theCloud,signedSF,true,true,progressCb,theOctree)<0)
{
if (!_theOctree)
delete theOctree;
return false;
}
//et on lisse le résultat
if (applyGaussianFilter)
{
uchar level = theOctree->findBestLevelForAGivenPopulationPerCell(NUMBER_OF_POINTS_FOR_GRADIENT_COMPUTATION);
float cellSize = theOctree->getCellSize(level);
ScalarFieldTools::applyScalarFieldGaussianFilter(cellSize*0.33f,theCloud,signedSF,-1,progressCb,theOctree);
}
DistanceType maxDist;
unsigned seedPoints = 0;
unsigned numberOfSegmentedLists = 0;
//on va faire la propagation avec le FastMarching();
FastMarchingForPropagation* fm = new FastMarchingForPropagation();
fm->setJumpCoef(50.0);
fm->setDetectionThreshold(alpha);
int result = fm->init(theCloud,theOctree,octreeLevel);
int octreeLength = OCTREE_LENGTH(octreeLevel)-1;
if (result<0)
{
if (!_theOctree)
delete theOctree;
delete fm;
return false;
}
if (progressCb)
{
progressCb->reset();
progressCb->setMethodTitle("FM Propagation");
char buffer[256];
sprintf(buffer,"Octree level: %i\nNumber of points: %i",octreeLevel,numberOfPoints);
progressCb->setInfo(buffer);
progressCb->start();
}
unsigned maxDistIndex=0,begin = 0;
CCVector3 startPoint;
while (true)
{
maxDist = HIDDEN_VALUE;
//on cherche la première distance supérieure ou égale à "minSeedDist"
while (begin<numberOfPoints)
{
const CCVector3 *thePoint = theCloud->getPoint(begin);
const DistanceType& theDistance = theDists->getValue(begin);
//.........这里部分代码省略.........
示例6: assert
ReferenceCloud* CloudSamplingTools::noiseFilter(GenericIndexedCloudPersist* inputCloud,
PointCoordinateType kernelRadius,
double nSigma,
bool removeIsolatedPoints/*=false*/,
bool useKnn/*=false*/,
int knn/*=6*/,
bool useAbsoluteError/*=true*/,
double absoluteError/*=0.0*/,
DgmOctree* inputOctree/*=0*/,
GenericProgressCallback* progressCb/*=0*/)
{
if (!inputCloud || inputCloud->size() < 2 || (useKnn && knn <= 0) || (!useKnn && kernelRadius <= 0))
{
//invalid input
assert(false);
return 0;
}
DgmOctree* octree = inputOctree;
if (!octree)
{
octree = new DgmOctree(inputCloud);
if (octree->build(progressCb) < 1)
{
delete octree;
return 0;
}
}
ReferenceCloud* filteredCloud = new ReferenceCloud(inputCloud);
unsigned pointCount = inputCloud->size();
if (!filteredCloud->reserve(pointCount))
{
//not enough memory
if (!inputOctree)
delete octree;
delete filteredCloud;
return 0;
}
//additional parameters
void* additionalParameters[] = {reinterpret_cast<void*>(filteredCloud),
reinterpret_cast<void*>(&kernelRadius),
reinterpret_cast<void*>(&nSigma),
reinterpret_cast<void*>(&removeIsolatedPoints),
reinterpret_cast<void*>(&useKnn),
reinterpret_cast<void*>(&knn),
reinterpret_cast<void*>(&useAbsoluteError),
reinterpret_cast<void*>(&absoluteError)
};
unsigned char octreeLevel = 0;
if (useKnn)
octreeLevel = octree->findBestLevelForAGivenNeighbourhoodSizeExtraction(kernelRadius);
else
octreeLevel = octree->findBestLevelForAGivenPopulationPerCell(knn);
if (octree->executeFunctionForAllCellsAtLevel( octreeLevel,
&applyNoiseFilterAtLevel,
additionalParameters,
true,
progressCb,
"Noise filter" ) == 0)
{
//something went wrong
delete filteredCloud;
filteredCloud = 0;
}
if (!inputOctree)
{
delete octree;
octree = 0;
}
if (filteredCloud)
{
filteredCloud->resize(filteredCloud->size());
}
return filteredCloud;
}
示例7: switch
int GeometricalAnalysisTools::computeLocalDensity( GenericIndexedCloudPersist* theCloud,
Density densityType,
PointCoordinateType kernelRadius,
GenericProgressCallback* progressCb/*=0*/,
DgmOctree* inputOctree/*=0*/)
{
if (!theCloud)
return -1;
unsigned numberOfPoints = theCloud->size();
if (numberOfPoints < 3)
return -2;
//compute the right dimensional coef based on the expected output
double dimensionalCoef = 1.0;
switch (densityType)
{
case DENSITY_KNN:
dimensionalCoef = 1.0;
break;
case DENSITY_2D:
dimensionalCoef = M_PI * (static_cast<double>(kernelRadius) * kernelRadius);
break;
case DENSITY_3D:
dimensionalCoef = s_UnitSphereVolume * ((static_cast<double>(kernelRadius) * kernelRadius) * kernelRadius);
break;
default:
assert(false);
return -5;
}
DgmOctree* theOctree = inputOctree;
if (!theOctree)
{
theOctree = new DgmOctree(theCloud);
if (theOctree->build(progressCb) < 1)
{
delete theOctree;
return -3;
}
}
theCloud->enableScalarField();
//determine best octree level to perform the computation
unsigned char level = theOctree->findBestLevelForAGivenNeighbourhoodSizeExtraction(kernelRadius);
//parameters
void* additionalParameters[] = { static_cast<void*>(&kernelRadius),
static_cast<void*>(&dimensionalCoef) };
int result = 0;
if (theOctree->executeFunctionForAllCellsAtLevel( level,
&computePointsDensityInACellAtLevel,
additionalParameters,
true,
progressCb,
"Local Density Computation") == 0)
{
//something went wrong
result = -4;
}
if (!inputOctree)
delete theOctree;
return result;
}
示例8: DgmOctree
int ScalarFieldTools::computeScalarFieldGradient( GenericIndexedCloudPersist* theCloud,
PointCoordinateType radius,
bool euclideanDistances,
bool sameInAndOutScalarField/*=false*/,
GenericProgressCallback* progressCb/*=0*/,
DgmOctree* theCloudOctree/*=0*/)
{
if (!theCloud)
return -1;
DgmOctree* theOctree = theCloudOctree;
if (!theOctree)
{
theOctree = new DgmOctree(theCloud);
if (theOctree->build(progressCb)<1)
{
delete theOctree;
return -2;
}
}
unsigned char octreeLevel = 0;
if (radius <= 0)
{
octreeLevel = theOctree->findBestLevelForAGivenPopulationPerCell(AVERAGE_NUMBER_OF_POINTS_FOR_GRADIENT_COMPUTATION);
radius = theOctree->getCellSize(octreeLevel);
}
else
{
octreeLevel = theOctree->findBestLevelForAGivenNeighbourhoodSizeExtraction(radius);
}
ScalarField* theGradientNorms = new ScalarField("gradient norms");
ScalarField* _theGradientNorms = 0;
//mode champ scalaire "IN" et "OUT" identique
if (sameInAndOutScalarField)
{
if (!theGradientNorms->reserve(theCloud->size())) //not enough memory
{
if (!theCloudOctree)
delete theOctree;
theGradientNorms->release();
return -3;
}
_theGradientNorms = theGradientNorms;
}
else
//mode champs scalaires "IN" et "OUT" dfferents (par defaut)
{
//on initialise les distances (IN - en ecriture) pour recevoir les normes du gradient
if (!theCloud->enableScalarField())
{
if (!theCloudOctree)
delete theOctree;
theGradientNorms->release();
return -4;
}
}
//structure contenant les parametres additionnels
void* additionalParameters[3] = { static_cast<void*>(&euclideanDistances),
static_cast<void*>(&radius),
static_cast<void*>(_theGradientNorms)
};
int result = 0;
if (theOctree->executeFunctionForAllCellsAtLevel( octreeLevel,
computeMeanGradientOnPatch,
additionalParameters,
true,
progressCb,
"Gradient Computation") == 0)
{
//something went wrong
result = -5;
}
if (!theCloudOctree)
delete theOctree;
theGradientNorms->release();
theGradientNorms=0;
return result;
}