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()
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:
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:
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:
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