PointCloudLibrary / PointCloudLibrary/pcl

[common] multiStep (update/growing) extension of computeMeanAndCovarianceMatrix

Open
#5,736 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

status: triage
Dominant language
C++
Stars
11.1k
Forks
4.7k
Avg merge
4d 10h
Merged PRs (30d)
6

Description

In my segmentation developments I needed and implemented an extension of computeMeanAndCovarianceMatrix to apply periodically to the growing segment without having every time to apply the for loops to all points

essentially as the segment/cluster grows, for segmentation conditions, I needed to recompute mean and covariance.
to make each step faster i calculate mean and covariance as a variation of the previously old calculated values, with a for loop only on added points

the function looks like this

template <typename PointT, typename Scalar> inline unsigned int
updateMeanAndCovarianceMatrix (const pcl::PointCloud &cloud,
Eigen::Matrix<Scalar, 3, 3> &covariance_matrix,
Eigen::Matrix<Scalar, 4, 1> &centroid,
unsigned int oldSize,
size_t & point_count
)

the first time it is called with oldSize=0 and it works exactly as computeMeanAndCovarianceMatrix
new size and point_count are recorded after this first call

the second time it is called with oldSize= size of previous call
inside the for loop will be shorter like
for (size_t i=oldSize; i<cloud.points.size();++i)
{

and then there are specifically developed formulas to update the global values of mean and covariance putting together the old and the new segment of point cloud

the algorithm is effective and fast

it can be reapplied at every added point or every n added points or also non periodically when you need to update mean or covariance as the set changes

at each step you have to pass mean and covariance of previous call,
they will be updated with new values

I thought it might be useful for PCL common module?
you can see it on my fork implemented and used with this chain of calls

segment_ByOBBMT (thread call)-> segment_ByOBBThread -> updateCentroidAndOBB ->updateMeanAndCovarianceMatrix

but it can be used general purpouse

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the existing common-module computeMeanAndCovarianceMatrix implementation, then review the proposed updateMeanAndCovarianceMatrix API and its use through segment_ByOBBMT -> segment_ByOBBThread -> updateCentroidAndOBB. Compare incremental results with full recomputation as the point cloud grows; done means the extension is suitable for general use and preserves correct mean and covariance values.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
computer-vision
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.