MATLAB Answers

How can i convert a polygon into a rectangle?

42 views (last 30 days)
Maayan
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.

  0 Comments

Sign in to comment.

Accepted Answer

Image Analyst
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

  14 Comments

Maayan
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
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
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.

Sign in to comment.

More Answers (1)

Simon
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.

  3 Comments

Maayan
Maayan on 17 Sep 2013
This is the relevant part of my code:
filename = uigetfile; %get the file name
obj = VideoReader(filename);
nFrames=obj.NumberOfFrames;
thisfig = figure();
for k = 1 : nFrames
this_frame = read(obj, k);
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
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
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.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!