Get instance seeds by eroding the \p maskOrig and segmenting it into separate connected components
| 383 | |
| 384 | /// Get instance seeds by eroding the \p maskOrig and segmenting it into separate connected components |
| 385 | Expected<std::vector<VdbVolume>> getInstanceSeeds( const VdbVolume& maskOrig ) |
| 386 | { |
| 387 | MR_TIMER; |
| 388 | openvdb::FloatGrid mask( *maskOrig.data ); |
| 389 | openvdb::tools::foreach( mask.beginValueOn(), [] ( openvdb::FloatGrid::ValueOnIter it ) |
| 390 | { |
| 391 | if ( it.getValue() == 0 ) |
| 392 | it.setValueOff(); |
| 393 | } ); |
| 394 | openvdb::tools::erodeActiveValues( mask.tree(), 5 ); |
| 395 | |
| 396 | std::vector<openvdb::FloatGrid::Ptr> seedObjs; |
| 397 | openvdb::tools::segmentActiveVoxels( mask, seedObjs ); |
| 398 | |
| 399 | std::vector<VdbVolume> res; |
| 400 | for ( auto& s : seedObjs ) |
| 401 | { |
| 402 | auto& r = res.emplace_back(); |
| 403 | auto mnMx = openvdb::tools::minMax( s->tree() ); |
| 404 | r.min = mnMx.min(); |
| 405 | r.max = mnMx.max(); |
| 406 | r.voxelSize = maskOrig.voxelSize; |
| 407 | r.data = MakeFloatGrid( std::move( s ) ); |
| 408 | r.dims = maskOrig.dims; |
| 409 | } |
| 410 | return res; |
| 411 | } |
| 412 | |
| 413 | /// Dilate \p maskOrig |
| 414 | VdbVolume dilateMask( const VdbVolume& maskOrig ) |
no test coverage detected