5 views (last 30 days)

Hello,

In my project I am using orientated Bounding Box to fit it to my objects in my binary image.

The oriented bounding box is taken from the algorythm in this link :

And on my images it looks like this:

In my project i need to find the coordinates of the each corner of each bounding Box.

So i set coordinates from the function i mentioned to the output of the function, and i saved them in a structure and it looks like this:

And [ vx(k),vy(k)] are the coordinates of 4 corners of bounding box.

But my problem is, for different images the order of coordinates is changing. What i mean is , in one case the first coordinate [vx(1),vy(1)] is the coordinate of top left corner of bounding box, second coordinate is the coordinate of top right, etc..

But in the other case, the first coordinate can be the coordinate of bottom right corner, second coordinate can be coordinate of the top left, etc..

My question is, how can i determine the output of the function so that these coordinates are regular, so that first coordinate ALWAYS responds to one corner, second ALWAYS to the other , third and fourt too.

If anyone has idea how to perform it, I'd be very grateful.

Other solution could be using some mathematical conditions based on the values of both x and y, but its quite hard for me to work out.

Thanks

Matt J
on 8 Jan 2020

Edited: Matt J
on 8 Jan 2020

How about if you find the centroid (ic,jc) of each region and then identify the bounding box corner (i,j) satisfying the condition

isUpperLeft = ic>i & jc>j

This, would define the "upper-left" corner of the box, and you could rotate the lists so that this corner always appears first. You could also create definitions of the other corners based on the signs of ic-i and jc-j, in a similar way.

Image Analyst
on 8 Jan 2020

I just did something very similar last week. What I did was to get the coordinates of the 4 corners of the image and then use pdist2() to find out which corner was closest to which box coordinate. I adapted the program slightly, and I think this should work if you pass in the 4 box corners. Repeat for each of the boxes.

%===========================================================================================================================================================

% Now make sure we know which point is which.

% Row 1 = (x, y) for the upper left box point.

% Row 2 = (x, y) for the upper right box point.

% Row 3 = (x, y) for the lower left box point.

% Row 4 = (x, y) for the lower right box point.

function outputXY = ArrangePoints(xy, rows, columns)

try

% Make an array for the 4 corners of the image.

corners = [1, 1; columns, 1; 1, rows; columns, rows];

% Get distances of each of our 4 box points to each of the 4 image corners.

distances = pdist2(corners, xy);

% Find the indexes of points 1, 2, 3, and 4. They will have min distance to their respective corners.

index = zeros(4, 1);

[d1, index(1)] = min(distances(1,:));

[d2, index(2)] = min(distances(2,:));

[d3, index(3)] = min(distances(3,:));

[d4, index(4)] = min(distances(4,:));

% Sort the points so that 1 will be the upper left, 2=upper right, 3 = lower left, and 4 = lower right.

outputXY = xy(index, :);

catch ME

% Some error happened if you get here.

errorMessage = GetErrorMessage(ME); % Get error message with call traceback and file's date.

WarnUser(errorMessage); % Pop up error message to show user what it is. Also prints to command window or console window (if program is an executable).

end

return; % ArrangePoints

Image Analyst
on 8 Jan 2020

outputXY has 4 rows with the coordinates of your box. Each row is one of your box corner coordinates, thus it is a 4 row by 2 column array. Like the comments say

% Row 1 = (x, y) for the upper left box point.

% Row 2 = (x, y) for the upper right box point.

% Row 3 = (x, y) for the lower left box point.

% Row 4 = (x, y) for the lower right box point.

To call it you'd do something like

[rows, columns, numberOfColorChannels] = size(yourImage)

for k = 1 : numberOfBoxes

xy = % however you get the 4 coordinates for one box

outputXY = ArrangePoints(xy, rows, columns)

% Now that you know which row (coordinate) corresponds to which corner

% do something with outputXY.

end

Sign in to comment.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.