[Reproduziert] OpenCV + Python verwendet die Maus als Stift (8)

Es ist sehr nützlich, Grafiken mit der Maus zu zeichnen. In der folgenden Zielverfolgung werden wir das zu verfolgende Ziel mit der Maus markieren und dann das Ziel in Echtzeit verfolgen, sodass wir heute einige Grundkenntnisse in OpenCV-Mausstiften erlernen.

Zuerst muss eine Funktion verstanden werden:

cv2.setMouseCallback (windowName, MouseCallback, param = None)

Seine verschiedenen Parameter sind:

Fenstername: Fenstername
MouseCallback: Rückruffunktion der
Mausantwort param: Parameter, die von der Antwortfunktion übergeben werden

Hier erstellen wir eine einfache Anwendung, unabhängig davon, wo wir darauf doppelklicken, können wir einen Kreis auf das Bild zeichnen.

Zunächst erstellen wir eine Maus-Rückruffunktion, die ausgeführt wird, wenn ein Mausereignis auftritt. Der Funktionsprototyp lautet (diese Funktion wird von uns selbst definiert, es gibt keine solche Funktion in der OpenCV-Bibliothek und der Name kann beliebig definiert werden):

MouseCallback (int Ereignis, int x, int y, int Flags, ungültige Benutzerdaten)

Die verschiedenen Parameter sind:

Ereignis: eine MouseEventTypes-Konstante
x: die x-Koordinate der
Maus y: die y-Koordinate der
Mausflags: eine MouseEventFlags-Konstante
Benutzerdaten: optionale Parameter

Das Mausereignis kann alles sein, was mit der Maus zu tun hat, z. B. Drücken der linken Taste, Drücken der rechten Taste, Doppelklick der linken Taste usw. Es liefert uns die Koordinaten (x, y) jedes Mausereignisses. Durch diese Veranstaltung und diesen Ort können wir tun, was wir wollen. Um alle verfügbaren Parameter aufzulisten, führen wir den folgenden Code im Pycharm-Terminal aus:

	view plaincopy to clipboardprint?
1.import cv2 as cv  
2.  
3.events = [i for i in dir(cv) if 'EVENT' in i]  
4.print( events )  

Wenn wir uns die Ausgabe ansehen, werden wir viele Parameternamen finden:

	view plaincopy to clipboardprint?
1.['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']  

Nun betrachten wir den Ereignisparameter in der MouseCallback-Funktion, die eine MouseEventFlags-Konstante darstellt:

MouseEventFlags :

cv.EVENT_FLAG_LBUTTON = 1, Linksklick und Ziehen

cv.EVENT_FLAG_RBUTTON = 2, Rechtsklick und Ziehen

cv.EVENT_FLAG_MBUTTON = 4, halten Sie die mittlere Taste gedrückt

cv.EVENT_FLAG_CTRLKEY = 8, halten Sie die Strg-Taste gedrückt

cv.EVENT_FLAG_SHIFTKEY = 16, Shift gedrückt halten

cv.EVENT_FLAG_ALTKEY = 32, halte Alt gedrückt

Sehen Sie sich weiterhin den Parameter flags in der MouseCallback-Funktion an, die eine MouseEventFlags-Konstante darstellt:

cv.MouseEventTypes :

cv.EVENT_MOUSEMOVE = 0, Mausbewegung

cv.EVENT_LBUTTONDOWN = 1, drücken Sie die linke Taste

cv.EVENT_RBUTTONDOWN = 2, Rechtsklick

cv.EVENT_MBUTTONDOWN = 3, drücken Sie die mittlere Taste

cv.EVENT_LBUTTONUP = 4, linke Taste loslassen

cv.EVENT_RBUTTONUP = 5, Rechtsklick zum Freigeben

cv.EVENT_MBUTTONUP = 6, mittlere Taste loslassen

cv.EVENT_LBUTTONDBLCLK = 7, doppelklicken Sie mit der linken Maustaste

cv.EVENT_RBUTTONDBLCLK = 8, Rechtsklick und Doppelklick

cv.EVENT_MBUTTONDBLCLK = 9, Zhongjian Doppelklick

cv.EVENT_MOUSEWHEEL = 10, Scrollrad gleitet

cv.EVENT_MOUSEHWHEEL = 11 horizontales Gleitradgleiten

Als nächstes können wir mit dem Experiment beginnen. Das Erstellen einer Maus-Rückruffunktion hat ein bestimmtes Format. Das Format ist an allen Stellen gleich. Es unterscheidet sich nur in der Funktion. Jetzt verwenden wir die Maus-Rückruffunktion, um eine Sache zu tun: Zeichnen Sie einen Kreis, in den wir doppelklicken:

	view plaincopy to clipboardprint?
1.import numpy as np  
2.import cv2 as cv  
3.
4.  
5.def draw_circle(event, x, y, flags, param):  
6.  if event == cv.EVENT_LBUTTONDBLCLK:  
7.      cv.circle(img, (x, y), 100, (255, 0, 0), -1)  
8.
9.
10.img = np.zeros((512, 512, 3), np.uint8)  
11.cv.namedWindow('image')  
12.cv.setMouseCallback('image', draw_circle)  
13.while (1):  
14. cv.imshow('image', img)  
15. if cv.waitKey(20) & 0xFF == 27:  
16.     break  
17.cv.destroyAllWindows()  

Fügen Sie hier eine Bildbeschreibung ein

Der hier aufgerufene Parameter ist EVENT_LBUTTONDBLCLK, was bedeutet, dass die Maus zum Auslösen doppelt angeklickt wird. Wenn wir auf einen Bereich doppelklicken, wird ein Kreis mit diesem als Mittelpunkt erstellt:

Mauszeichnung Grafiken

Jetzt müssen wir erweiterte Operationen ausführen. In diesem Fall ziehen wir die Maus, um ein Rechteck oder einen Kreis (abhängig vom gewählten Modus) wie in der Anwendung "Zeichnen" zu zeichnen. Daher besteht unsere Maus-Rückruffunktion aus zwei Teilen, einem zum Zeichnen eines Rechtecks ​​und einem zum Zeichnen eines Kreises. Dies ist sehr hilfreich. In der späteren manuellen Zielverfolgung werden diese Grafiken manuell mit der Maus markiert, um die Zielverfolgung in Echtzeit abzuschließen.

Nachdem wir nun ein umfassendes Beispiel implementiert haben, hilft Ihnen dieses Beispiel, einige Ideen der Bildinteraktion zu verstehen:

Zeichnen Sie mit der Maus ein Bild auf das Bild. Sie können einen Kreis oder ein Rechteck zeichnen. Drücken Sie die Taste q, um zwischen den beiden Modi zu wechseln. Wenn die linke Taste gedrückt wird, beginnt sie zu zeichnen, bewegt sich zum Zeichenort und endet, wenn die linke Taste losgelassen wird. Klingt kompliziert, nicht wahr? Schritt für Schritt Analyse:

· Zeichnen mit der Maus: Sie müssen die Maus-Rückruffunktion mouse_event definieren

· Kreis oder Rechteck zeichnen: Sie müssen einen Zeichenmodus definieren

· Linksklick, Verschieben, Loslassen: Es müssen drei verschiedene Ereignisse erfasst werden

· Zeichnung starten, Zeichnung beenden: Sie müssen eine Zeichnungsmarkierungsbitzeichnung definieren

Okay, Code starten:

	

```python
	view plaincopy to clipboardprint?
1. import numpy as np  
2. import cv2 as cv  
3.
4. drawing = False  # true if mouse is pressed  
5. mode = True  # if True, draw rectangle. Press 'm' to toggle to curve  
6. ix, iy = -1, -1  
7.
8. mouse callback function
9.
10.def draw_circle(event, x, y, flags, param):  
11. global ix, iy, drawing, mode  
12. if event == cv.EVENT_LBUTTONDOWN:  
13.     drawing = True  
14.     ix, iy = x, y  
15. elif event == cv.EVENT_MOUSEMOVE:  
16.     if drawing:  
17.         if mode:  
18.             cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)  
19.         else:  
20.             cv.circle(img, (x, y), 5, (0, 0, 255), -1)  
21. elif event == cv.EVENT_LBUTTONUP:  
22.     drawing = False  
23.     if mode:  
24.         cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)  
25.     else:  
26.         cv.circle(img, (x, y), 5, (0, 0, 255), -1)  
27.  
28.  
29.img = np.zeros((512, 512, 3), np.uint8)  
30.cv.namedWindow('image')  
31.cv.setMouseCallback('image', draw_circle)  
32.while 1:  
33.    cv.imshow('image', img)  
34. k = cv.waitKey(1) & 0xFF  
35. if k == ord('q'):  
36.     mode = not mode  
37. elif k == 27:  
38.     break  
39.cv.destroyAllWindows()  

bewirken:
Fügen Sie hier eine Bildbeschreibung ein

OK, fertig.

Aber was ist, wenn wir ein ungefülltes Rechteck erstellen möchten?

Dann müssen wir den Code ändern. Wie im vorherigen Abschnitt erwähnt, bedeutet Funktionen wie Zeichnungsrechteckfunktion und Zeichnungskreisfunktion, wenn ihr letzter Parameter -1 ist, fest, wenn er größer als 0 ist Hohl, wenn wir es als 1 definieren, beträgt die Dicke des Umrisses der gezeichneten Figur 1. Schauen wir uns den Code an:

	view plaincopy to clipboardprint?
1. import numpy as np  
2. import cv2 as cv  
3.  
4. drawing = False  # true if mouse is pressed  
5. mode = True  # if True, draw rectangle. Press 'm' to toggle to curve  
6. ix, iy = -1, -1  
7.
8.
9. # mouse callback function  
10.def draw_circle(event, x, y, flags, param):  
11.global ix, iy, drawing, mode  
12.if event == cv.EVENT_LBUTTONDOWN:  
13.     drawing = True  
14.     ix, iy = x, y  
15. elif event == cv.EVENT_MOUSEMOVE:  
16.     if drawing:  
17.         if mode:  
18.             tmp = img.copy()  
19.             cv.rectangle(tmp, (ix, iy), (x, y), (0, 255, 0), 1)  
20.             cv.imshow('image', tmp)  
21. elif event == cv.EVENT_LBUTTONUP:  
22.     drawing = False  
23.     if mode:  
24.          cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1)  
25.
26.
27.img = np.zeros((512, 512, 3), np.uint8)  
28.cv.namedWindow('image')  
29.cv.setMouseCallback('image', draw_circle)  
30.cv.imshow("image",img)  
31.while 1:  
32. k = cv.waitKey(1) & 0xFF  
33. if k == 27:  
34.     break  
35.cv.destroyAllWindows() 

Schauen wir uns den Effekt an:

image.png

Jetzt können wir auch den Code ändern. Wir brechen die von der Parameteranweisung von EVENT_LBUTTONUP ausgeführte Funktion ab, sodass beim Zeichnen des nächsten Rechtecks ​​das vorherige automatisch gelöscht wird:

	view plaincopy to clipboardprint?
1. import numpy as np  
2. import cv2 as cv  
3.
4. drawing = False  # true if mouse is pressed  
5. mode = True  # if True, draw rectangle. Press 'm' to toggle to curve  
6. ix, iy = -1, -1  
7.
8.
9. # mouse callback function  
10.def draw_circle(event, x, y, flags, param):  
11. global ix, iy, drawing, mode  
12. if event == cv.EVENT_LBUTTONDOWN:  
13.     drawing = True  
14.     ix, iy = x, y  
15. elif event == cv.EVENT_MOUSEMOVE:  
16.     if drawing:  
17.         if mode:  
18.             tmp = img.copy()  
19.             cv.rectangle(tmp, (ix, iy), (x, y), (0, 255, 0), 1)  
20.             cv.imshow('image', tmp)  
21. elif event == cv.EVENT_LBUTTONUP:  
22.     drawing = False  
23.     # if mode:  
24.     #      cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1)  
25.
26.
27.img = np.zeros((512, 512, 3), np.uint8)  
28.cv.namedWindow('image')  
29.cv.setMouseCallback('image', draw_circle)  
30.cv.imshow("image",img)  
31.while 1:  
32. k = cv.waitKey(1) & 0xFF  
33. if k == 27:  
34.     break  
35.cv.destroyAllWindows()  

bewirken:

image.png

Selbst wenn der Mauszeichnungsteil von OpenCV beendet ist und Sie ihn beherrschen möchten, sollten Sie zu diesem Zeitpunkt mehr selbst üben.

Überprüfen Sie die Artikelzusammenfassungsseite https://blog.csdn.net/weixin_44237705/article/details/107864965
Weitere technische Informationen zu openvino können in der Gruppe ~ ausgetauscht werden
Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/weixin_44237705/article/details/107972630
Empfohlen
Rangfolge