So zeichnen Sie ein Rechteck um eine Region von Interesse in Python

72

Ich habe Probleme mit import cvmeinem 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.

user961627
quelle

Antworten:

191

Bitte versuchen Sie es nicht mit dem alten CV-Modul, sondern verwenden Sie CV2:

import cv2

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


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

[Bearbeiten], um die folgenden Anschlussfragen anzuhängen:

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

cv2.imshow("lalala", img)
k = cv2.waitKey(0) # 0==wait forever
berak
quelle
Ich habe gerade versucht, cv2 zu importieren. Ich bekomme : DLL load failed: %1 is not a valid Win32 application. Ich verwende Win7 64-Bit. Und Spyder- und Scikit-Bibliotheken und alles läuft 64-Bit.
user961627
@ user961627 64-Bit-Installations-Binärdateien von hier herunterladen lfd.uci.edu/~gohlke/pythonlibs/#opencv
M4rtini
1
Vielen Dank! Ich habe es heruntergeladen ... eine Idee, wie es mit Anacondas Spyder funktioniert?
user961627
Okay, ich habe es mit Spyder zu tun. @berak, wie kann ich das Bild anzeigen oder speichern? Soll ich es einem numpy Array zuweisen? Ich habe ig = ImageViewer (cv2.rectangle (image1, (10, 10), (100, 100), (255,0,0), 2)) ig.show () ausprobiert, aber den folgenden Fehler erhalten: TypeError: Layout des Das Ausgabearray img ist nicht kompatibel mit cv :: Mat (Schritt [ndims-1]! = elemsize oder Schritt [1]! = elemsize * nchannels)
user961627
Wie finde ich diese Koordinaten x1, y1 und x2, y2?
SpiritualOverflow
6

Sie können verwenden 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 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 möchte ein Rechteck auf dieses Bild zeichnen, aber die ImageDraw.rectangle () -Methode von PIL kann keine Linienbreite angeben. Ich muss das Bildobjekt in das Bildformat von opencv2 konvertieren, ein Rechteck zeichnen und zurück in das Bildobjekt konvertieren . So mache ich das:

# 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)
jdhao
quelle
5

Wie die anderen Antworten sagten, ist die Funktion, die Sie benötigen cv2.rectangle(), aber denken Sie daran, dass die Koordinaten für die Begrenzungsrahmenscheitelpunkte Ganzzahlen sein müssen, wenn sie sich in einem Tupel befinden, und sie müssen in der Reihenfolge von (left, top)und liegen (right, bottom). Oder gleichwertig (xmin, ymin)und (xmax, ymax).

Yanfeng Liu
quelle