# How can i convert a polygon into a rectangle?

42 views (last 30 days)
Maayan on 17 Sep 2013
I have a 4 side polygon that i draw on a video frame. I would like to take this polygon and make it a rectangle so i will be able to treat it as a matrix.I want to take the smallest rectangle i can have but still be as close as i can to the original vertices. Can anyone help me with that please? I've been trying to do it for a several days and with no success. Keep in mind that my polygon can be completely not parallel to the axes and in that case i want to get a rectangle that is also not parallel to the axes.

Image Analyst on 17 Sep 2013
It's not trivial. But luckily John D'Errico has done it for you. See his File Exchange: http://www.mathworks.com/matlabcentral/fileexchange/34767-a-suite-of-minimal-bounding-objects

Maayan on 17 Sep 2013
It doesn't really have to be correlated.It just needs to be the smallest rectangle that still contains the polygon. I'm trying to see if what Image Analyst posted can help me but i don't understand what the two 5x1 vectors i receive back from the function represent and how do they define the rectangle.
Simon on 17 Sep 2013
As far as I see it is not obvious what the smallest rectangle that still contains the polygon is. One way is
• search for the longest side of the polygon
• Take this side as the base of the new rectangle (has two points in common with the polygon)
• Get the distance of the furthermost remaining point
• Construct the opposite edge of the rectangle, crossing this point
• Construct the remaining two connecting edges perpendicular to the first edge
This will give you a rectangle with small size (I don't know if it is the minimum size!). And it is all pure 2d-geometry, easy to implement, nothing fancy
Image Analyst on 17 Sep 2013
I haven't used John's function for rectangle but I imagine it would give the coordinates of the corners. If there are 5 instead of 4 it could be because the last point is the same as the first point to "close off" the rectangle instead of it being a "U" shape.
Imagine that you put a box around your points. Now, as you rotate the box around your points, the sides of the box will have to lengthen or shorten to still contain your points. With one of those shapes of boxes, the area will be a minimum. That is the box he returns to you.

Simon on 17 Sep 2013
Hi!
You have your polygon coordinates in (x/y) pairs? Take their min/max values and cut from the video frame the rectangle R(xmin:xmax, ymin:ymax).
Maybe you post your code, then it's easier to help.

Maayan on 17 Sep 2013
This is the relevant part of my code:
filename = uigetfile; %get the file name
nFrames=obj.NumberOfFrames;
thisfig = figure();
for k = 1 : nFrames
thisax = axes('Parent', thisfig);
image(this_frame, 'Parent', thisax);
if k==nFrames
title(thisax, sprintf('Frame #%d', k));
end
if k==1
result=input('How many polygons would you like to draw? ');
pos=zeros(4,2,result);
for i=1:result
handle=impoly;
accepted_pos = wait(handle)
pos(:,:,i) = getPosition(handle);
end
end
end
I didn't really understand what was your solution to my problem, can you please elaborate?
Simon on 17 Sep 2013
Hi!
You have your variable "pos". Now you get the minimum and maximum x and y values. This are the coordinates of your rectangle, it contains all polygons.
Image Analyst on 17 Sep 2013
Simon is saying to use the "bounding box" of your polygon, which will have be aligned with the axes and probably larger than what I suggested. What I suggested may give a tilted rectangle but it will have a smaller size than the bounding box.