Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does cv2.cv.BoxPoints(rect) return?

Tags:

python

opencv

rect = cv2.minAreaRect(largest_contour)
rect = ((rect[0][0] * self.scale_down, rect[0][1] * self.scale_down), (rect[1][0] * self.scale_down, rect[1][1] * self.scale_down), rect[2])
box = cv2.cv.BoxPoints(rect)
print box 
box = np.int0(box)
cv2.drawContours(frame,[box], 0, (0, 0, 255), 2)

This is how my code looks like. I tried to print the box to see what's that and I got some printing result such as ((200.0, 472.0), (200.0, 228.0), (420.0, 228.0), (420.0, 472.0)). It should have something to do x and y coordinates right? I guess that's the four corners of the rectangle? So what are they exactly? Thanks!

like image 296
Mandy Avatar asked Apr 20 '15 04:04

Mandy


3 Answers

The common misconception of the "box" values is that the first sub-list of the "box" ndarray is always the bottom-left point of the rectangle. For example, in the rectangle shown below, the first sub-list of "box" ndarray need not represent point A always.

rectangle

So here is what "box" values represent:

As the question rightly points out, when you print box, you will get a ndarray that looks something like this:

enter image description here

And then I went an extra mile for description and wrote this simple for loop to really understand what "box" values actually represent:

for i in box:
    cv2.circle(image,(i[0],i[1]), 3, (0,255,0), -1)
    imgplot = plt.imshow(image)
    plt.show()

And the results are: (the images are in order)

first image

enter image description here

enter image description here

enter image description here

I think the images should have cleared anybody's doubt about "box" values, but here is a summary anyway:

The lowest point of the rectangle(does not matter left or right) will always be the first sub-list of the "box" ndarray. So in the example I have given, the first sub-list [169 144] represents the "bottom right of this rectangle". Now this point will be the reference point to decide what the next sub-list represents. Meaning, the next sub-list will always represent the point that you first get when you move in the clockwise direction. (as shown in the second image of the for loop)

And keep moving in the clockwise direction to see what the next sub-lists represent.

PS: It is sometimes very hard to read the OpenCV documentation(which is not the best in the world btw) and understand a function and its return values properly. So I suggest churn up little chunks of code, like the for loop and cv2.circle above, to really visualize the return values of a function. That should really clear all your doubts about any functions that you come across in OpenCV. After all, OpenCV is all about "visual"izing!

like image 93
Sushanth Avatar answered Sep 23 '22 12:09

Sushanth


Those are the 4 points defining the rotated rectangle provided to it. Keep in mind that in opencv points are plotted as (x,y) not (row,column), and the y axis is positive downward. So the first point would be plotted 200 pixels right of the left side of the image and 472 pixels down from the top of the image. In other words, the first point is the bottom left point of the image.

like image 32
afinit Avatar answered Sep 25 '22 12:09

afinit


I think the first point will always be the bottom most points, and it will actually be the bottom right (if there are multiple points that could be the bottom most point).

like image 22
Erotemic Avatar answered Sep 22 '22 12:09

Erotemic