Can I edit regionpros centroid to use the previous location if no centroid is found?

2 Ansichten (letzte 30 Tage)
I need to track ~500 centroids in consecutive images (in a for loop). Sometimes the centroids disappear. For example, centroids #250 and #251 may disappear from images 157-162 and then reappear for the rest of the images. Is there a way to edit regionprops so that it does not fail when it cannot complete the same struct array in the loop? i.e. when regionprops finds all the centroids it places them in a struct and if the number of centroids changes it cannot continue the loop.
for j = 1:numframes
for i = 1:cx
l(:,:,i,j) = imcrop(g(:,:,j),A(i,:));
l2(:,:,i,j) = l(:,:,i,j) > 10;
l3(:,:,i,j) = bwareaopen(l2(:,:,i,j),6,8);
s2(i,:,j) = regionprops(l3(:,:,i,j),'centroid');
centroid(i,:,j) = cat(1,s2(i,:,j).Centroid);
cen_loc(i,:,j) = base_corners(i,:)+centroid(i,:,j)-1;
end
end

Antworten (3)

Walter Roberson
Walter Roberson am 19 Jul. 2017
No, there is no way to edit regionprops to do that. You should instead be changing the way you store the result of regionprops. For example,
s2{i,j} = regionprops(l3(:,:,i,j),'centroid');
centroid{i,j} = cat(1,s2{i,j}.Centroid);
cen_loc{i,j} = bsxfun(@plus, base_corners(i,:), centroid{i,j}-1 );
I get the impression from your code that each object is expected to be constrained within a known region and the objects cannot move relative to each other except by sort of jiggling around. Is that correct?

Image Analyst
Image Analyst am 19 Jul. 2017
No, sorry. Each time bwconncomp() or bwlabel() runs, it assigns ID labels independently. In general with tracking you will have some objects that move some distance and stay in the field of view, other objects that vanish or leave the field of view, and other objects that newly appear or enter the field of view. For those object that don't move much, you can try to match objects in different images by finding the old centroid that is closest to the new centroid. Not too hard if they don't move much. However if they move a tremendous amount, like you take a picture of a box full of honeybees and another picture 60 seconds later, it's hard or impossible to associate the objects in frame 2 with those from frame 1.
If you had special circumstances like you have 100 objects that don't move much but 10 of them are missing from some frames, then you could first try to match existing objects, then any "left over"/unmatched objects, go back in history and try to find some prior frame where that object existed. But there's nothing in MATLAB that does this at a high level so basically you're going to have to program up your own special ad hoc tracking algorithm. Good luck.

Tim Sanborn
Tim Sanborn am 25 Aug. 2017
Answer: Once the number of blobs is established in the first frame, use an if statement inside the for loop to tell is to use the previous location. Easy work around.
  2 Kommentare
Image Analyst
Image Analyst am 25 Aug. 2017
Tracking is not easy. Blobs come and go, intersect/cross, and change position which makes matching a set of points in one frame with a set of blobs in a different frame challenging in general. Only in the very simplest cases (number of blobs doesn't change and they don't move far) is it easy.
Walter Roberson
Walter Roberson am 25 Aug. 2017
No, if the objects are moving, that solution is not sufficient. Unless there are constraints on the velocity or permitted permissions, it can be difficult to tell whether any particular object "disappeared" and later "reappeared", or if the object just moved to another location.
Consider, for example, a "15 Puzzle", where two configurations that look close might have involved a lot of pieces moving around.

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by