How to draw a rectangle around a region of interest in python
please don't try with the old cv module, use cv2:
import cv2cv2.rectangle(img, (x1, y1), (x2, y2), (255,0,0), 2)x1,y1 ------| || || |--------x2,y2
[edit] to append the follow-up questions below:
cv2.imwrite("my.png",img)cv2.imshow("lalala", img)k = cv2.waitKey(0) # 0==wait forever
You can use cv2.rectangle()
:
cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift)Draws a simple, thick, or filled up-right rectangle.The function rectangle draws a rectangle outline or a filled rectanglewhose two opposite corners are pt1 and pt2.Parameters img Image. pt1 Vertex of the rectangle. pt2 Vertex of the rectangle opposite to pt1 . color Rectangle color or brightness (grayscale image). thickness Thickness of lines that make up the rectangle. Negative values, like CV_FILLED , mean that the function has to draw a filled rectangle. lineType Type of the line. See the line description. shift Number of fractional bits in the point coordinates.
I have a PIL Image object and I want to draw rectangle on this image. I want to use opencv2 and draw rectangle, and then convert back to PIL Image object. Here is how I do it:
# im is a PIL Image objectim_arr = np.asarray(im)# convert rgb array to opencv's bgr formatim_arr_bgr = cv2.cvtColor(im_arr, cv2.COLOR_RGB2BGR)# pts1 and pts2 are the upper left and bottom right coordinates of the rectanglecv2.rectangle(im_arr_bgr, pts1, pts2, color=(0, 255, 0), thickness=3)im_arr = cv2.cvtColor(im_arr_bgr, cv2.COLOR_BGR2RGB)# convert back to Image objectim = Image.fromarray(im_arr)
As the other answers said, the function you need is cv2.rectangle()
, but keep in mind that the coordinates for the bounding box vertices need to be integers if they are in a tuple, and they need to be in the order of (left, top)
and (right, bottom)
. Or, equivalently, (xmin, ymin)
and (xmax, ymax)
.