wake-up-neo.com

Wie zeichnet man ein Rechteck um eine interessierende Region in Python?

Ich habe Probleme mit import cv in meinem Python-Code.

Mein Problem ist, dass ich ein Rechteck um interessierende Bereiche in einem Bild zeichnen muss. Wie kann das in Python gemacht werden? Ich mache Objekterkennung und möchte ein Rechteck um die Objekte zeichnen, von denen ich glaube, dass ich sie im Bild gefunden habe.

24
user961627

bitte versuche es nicht mit dem alten cv-modul, benutze cv2:

import cv2

cv2.rectangle(img, (x1, y1), (x2, y2), (255,0,0), 2)


x1,y1 ------
|          |
|          |
|          |
--------x2,y2

[Bearbeiten], um die nachfolgenden Fragen anzufügen:

cv2.imwrite("my.png",img)

cv2.imshow("lalala", img)
k = cv2.waitKey(0) # 0==wait forever
71
berak

Sie können cv2.rectangle() verwenden:

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 rectangle
whose 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.

Ich habe ein PIL-Bildobjekt, und ich möchte ein Rechteck auf dieses Bild zeichnen, aber die Methode ImageDraw.rectangle () von PIL kann keine Linienbreite angebenIch muss das Bildobjekt in konvertieren Das Bildformat von opencv2 und das Rechteck zeichnen und wieder in das Bildobjekt konvertieren. So mache ich es:

# im is a PIL Image object
im_arr = np.asarray(im)
# convert rgb array to opencv's bgr format
im_arr_bgr = cv2.cvtColor(im_arr, cv2.COLOR_RGB2BGR)
# pts1 and pts2 are the upper left and bottom right coordinates of the rectangle
cv2.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 object
im = Image.fromarray(im_arr)
0
jdhao

Wie die anderen Antworten bereits sagten, ist die von Ihnen benötigte Funktion cv2.rectangle(). Beachten Sie jedoch, dass die Koordinaten für die Begrenzungsrahmenscheitel Ganzzahlen sein müssen, wenn sie sich in einem Tupel befinden, und dass sie in der Reihenfolge vorliegen müssen von (left, top) und (right, bottom). Oder äquivalent, (xmin, ymin) und (xmax, ymax).

0
Yanfeng Liu