How to define coordinates of orientated BoundingBox for every case?

25 次查看(过去 30 天)
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:
orbox.jpg
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:
koordy.jpg
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
Matt J 2020-1-8
编辑:Matt J 2020-1-8
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.

更多回答(1 个)

Image Analyst
Image Analyst 2020-1-8
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
  2 个评论
r_com3
r_com3 2020-1-8
Hey,
okay, so i have 4 coordinates of corners. I dont know which one responds to upper left, which to upper right, etc.
could u explain more precisely how to implement it in your code please?
thanks in advance
Image Analyst
Image Analyst 2020-1-8
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

请先登录,再进行评论。

Community Treasure Hunt

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

Start Hunting!

Translated by