Zeichnen Sie eine rechteckige Form und extrahieren Sie Objekte mit Pythons OpenCV
OpenCV ist eine Open-Source-Softwarebibliothek für Computer Vision und machine learning. Mithilfe dieser Funktion können verschiedene Bildverarbeitungsvorgänge wie das Bearbeiten von Bildern und das Anwenden von Tonnen von Filtern durchgeführt werden. Es wird häufig bei Objekterkennung, Gesichtserkennung und anderen Bildverarbeitungsaufgaben verwendet.
Mal sehen, wie man eine rechteckige Form auf ein Bild zeichnet und die Objekte mit OpenCV extrahiert.
import
cv2
import
numpy as np
drawing
=
False
mode
=
True
ix, iy
=
-
1
,
-
1
def
draw_circle(event, x, y, flags, param):
global
ix, iy, drawing, mode
if
event
=
=
cv2.EVENT_LBUTTONDOWN:
drawing
=
True
ix, iy
=
x, y
elif
event
=
=
cv2.EVENT_MOUSEMOVE:
if
drawing
=
=
True
:
if
mode
=
=
True
:
cv2.rectangle(img, (ix, iy), (x, y), (
0
,
255
,
0
),
3
)
a
=
x
b
=
y
if
a !
=
x | b !
=
y:
cv2.rectangle(img, (ix, iy), (x, y), (
0
,
0
,
0
),
-
1
)
else
:
cv2.circle(img, (x, y),
5
, (
0
,
0
,
255
),
-
1
)
elif
event
=
=
cv2.EVENT_LBUTTONUP:
drawing
=
False
if
mode
=
=
True
:
cv2.rectangle(img, (ix, iy), (x, y), (
0
,
255
,
0
),
2
)
else
:
cv2.circle(img, (x, y),
5
, (
0
,
0
,
255
),
-
1
)
img
=
np.zeros((
512
,
512
,
3
), np.uint8)
cv2.namedWindow(
'image'
)
cv2.setMouseCallback(
'image'
, draw_circle)
while
(
1
):
cv2.imshow(
'image'
, img)
k
=
cv2.waitKey(
1
) &
0xFF
if
k
=
=
ord
(
'm'
):
mode
=
not
mode
elif
k
=
=
27
:
break
cv2.destroyAllWindows()
Ausgabe:
Der obige Code funktioniert nur mit einem schwarzen Hintergrundbild. Zu jedem Bild können jedoch Rechtecke gezeichnet werden. Wir können ein Programm schreiben, mit dem wir den gewünschten Teil in einem Bild auswählen und auch diesen ausgewählten Teil extrahieren können. Die Aufgabe umfasst Folgendes:
- Zeichnen Sie Form auf jedes Bild
- Wählen Sie den Extraktanteil erneut aus, falls eine schlechte Auswahl vorliegt
- Extrahieren Sie ein bestimmtes Objekt aus dem Bild
import
cv2
import
argparse
ref_point
=
[]
crop
=
False
def
shape_selection(event, x, y, flags, param):
global
ref_point, crop
if
event
=
=
cv2.EVENT_LBUTTONDOWN:
ref_point
=
[(x, y)]
elif
event
=
=
cv2.EVENT_LBUTTONUP:
ref_point.append((x, y))
cv2.rectangle(image, ref_point[
0
], ref_point[
1
], (
0
,
255
,
0
),
2
)
cv2.imshow(
"image"
, image)
ap
=
argparse.ArgumentParser()
ap.add_argument(
"-i"
,
"--image"
, required
=
True
,
help
=
"Path to the image"
)
args
=
vars
(ap.parse_args())
image
=
cv2.imread(args[
"image"
])
clone
=
image.copy()
cv2.namedWindow(
"image"
)
cv2.setMouseCallback(
"image"
, shape_selection)
while
True
:
cv2.imshow(
"image"
, image)
key
=
cv2.waitKey(
1
) &
0xFF
if
key
=
=
ord
(
"r"
):
image
=
clone.copy()
elif
key
=
=
ord
(
"c"
):
break
if
len
(ref_point)
=
=
2
:
crop_img
=
clone[ref_point[
0
][
1
]:ref_point[
1
][
1
], ref_point[
0
][
0
]:
ref_point[
1
][
0
]]
cv2.imshow(
"crop_img"
, crop_img)
cv2.waitKey(
0
)
cv2.destroyAllWindows()
Ausführen : Speichern Sie die Datei als capture_events.py und wählen Sie zum Testen ein Demobild aus, das sich im selben Verzeichnis befindet. Führen Sie nun den folgenden Befehl aus:
python capture_events.py --image demo.jpg
Ausgabe : Wählen Sie zuerst den gewünschten Teil aus dem Bild aus. Außerdem können wir fehlerhafte Auswahlen entfernen, indem wir wie programmiert 'r' drücken, um eine neue richtige Auswahl zu treffen.
Abb: Ausgewählter Teil
Nachdem Sie eine richtige Auswahl wie oben ausgewählt haben, drücken Sie einfach 'c', um wie programmiert zu extrahieren.
Abb: Schnittteil