opencv advanced 03 - exemple d'interaction entre l'image et la souris

Lorsque vous travaillez avec des images, il peut être nécessaire d'interagir avec l'image en cours de traitement. OpenCV
fournit des événements de souris qui permettent aux utilisateurs d'interagir avec les images avec la souris. Les événements de souris peuvent identifier les opérations de souris couramment utilisées, telles que : cliquer, double-cliquer pour différents boutons, glisser, faire glisser, etc. de la souris.

Par exemple, lorsque l'utilisateur clique sur la souris, nous dessinons un cercle. La manière habituelle est de créer une fonction de réponse OnMouseAction(), et d'écrire l'opération à réaliser dans la fonction de réponse
. La fonction de réponse est créée selon un format fixe, son format est :

def OnMouseAction(event,x,y,flags,param):

Dans la formule :

  • event indique le type d'événement déclenché et les événements spécifiques sont indiqués dans le Tableau 19-3.
  • x, y représentent les coordonnées (x, y) de la souris dans la fenêtre lorsque l'événement souris est déclenché.
  • les drapeaux représentent l'événement de déplacement de la souris et l'événement conjoint du clavier et de la souris, comme indiqué dans le Tableau 19-4.
  • param est l'ID de la fonction, qui identifie la fonction d'événement correspondante, ce qui équivaut à personnaliser l'ID d'une fonction OnMouseAction().
  • OnMouseAction est le nom de la fonction de réponse, qui peut être personnalisée.

insérez la description de l'image ici
insérez la description de l'image ici
Après avoir défini la fonction de réponse, il est nécessaire d'associer (lier) la fonction à une fenêtre spécifique, de sorte que lorsque la souris dans la fenêtre déclenche un événement, la fonction de réponse puisse être trouvée et exécutée. Pour lier une fonction à une fenêtre, vous pouvez 函 数cv2.setMouseCallback()l'implémenter, et sa syntaxe de base est :

cv2.setMouseCallback(winname,onMouse)

Dans la formule :

  • winname est le nom de la fenêtre liée.
  • onMouse est le nom de la fonction de réponse liée.

Concevez un programme pour évaluer les événements de souris déclenchés.

import cv2
import numpy as np
def Demo(event,x,y,flags,param):
 if event == cv2.EVENT_LBUTTONDOWN:
  print("单击了鼠标左键")
 elif event==cv2.EVENT_RBUTTONDOWN :
  print("单击了鼠标右键")
 elif flags==cv2.EVENT_FLAG_LBUTTON:
  print("按住左键拖动了鼠标")
 elif event==cv2.EVENT_MBUTTONDOWN :
  print("单击了中间键")
# 创建名称为 Demo 的响应(回调)函数 OnMouseAction
# 将响应函数 Demo 与窗口“Demo19.9”建立连接(实现绑定)
img = np.ones((300,300,3),np.uint8)*255
cv2.namedWindow('jiaohu01')
cv2.setMouseCallback('jiaohu01',Demo)
cv2.imshow('jiaohu01',img)
cv2.waitKey()
cv2.destroyAllWindows()

résultat de l'opération :
insérez la description de l'image ici

Remarque : Vous pouvez afficher les événements de souris pris en charge par OpenCV via les méthodes suivantes :

import cv2
events=[i for i in dir(cv2) if 'EVENT'in i]
print(events)

barre de défilement

La barre de défilement (Trackbar) est un outil interactif très pratique dans OpenCV, il existe attaché à une fenêtre spécifique.
En ajustant la barre de défilement, vous pouvez définir et obtenir une valeur spécifique dans la plage spécifiée.
Dans OpenCV, la fonction cv2.createTrackbar() est utilisée pour définir la barre de défilement, et son format de syntaxe est :

cv2.createTrackbar(trackbarname, winname, value, count, onChange)

Dans la formule :

  • trackbarname est le nom de la barre de défilement.
  • winname est le nom de la fenêtre à laquelle la barre de défilement est attachée.
  • valeur est la valeur initiale qui détermine la position du curseur dans la barre de défilement.
  • count est la valeur maximale de la barre de défilement. Normalement, sa valeur minimale est 0.
  • onChange est la fonction de rappel. En général, les opérations à implémenter après le changement de la barre de défilement sont écrites dans la fonction callback.

函数 cv2.createTrackbar()用于生成一个滚动条. Faites glisser la barre de défilement pour définir la valeur de la barre de défilement et laissez la barre de défilement renvoyer la valeur correspondante. La valeur de la barre de défilement peut être 函数 cv2.getTrackbarPos()obtenue par , et son format de syntaxe est :

retval=getTrackbarPos( trackbarname,winname )

Dans la formule :

  • retval est la valeur de retour, qui récupère la valeur de la barre de défilement générée par la fonction cv2.createTrackbar().
  • trackbarname est le nom de la barre de défilement.
  • winname est le nom de la fenêtre à laquelle la barre de défilement est attachée.

Exemple : Implémentation d'une palette avec des barres de défilement

Dans l'espace colorimétrique RVB, toute couleur est composée de trois couleurs : rouge (R), vert (V) et bleu (B), et l'intervalle de chaque composante de couleur est [0, 255].

Cette section utilise la fonction cv2.createTrackbar() et la fonction cv2.getTrackbarPos() pour concevoir
une palette analogique : Dans le formulaire, il y a trois barres de défilement utilisées pour définir les valeurs de R, G et B respectivement, et la palette sera ajustée en fonction du courant Les valeurs R, G et B de l'écran afficheront leurs couleurs correspondantes en temps réel.

import cv2
import numpy as np
def changeColor(x):
 r=cv2.getTrackbarPos('R','image')
 g=cv2.getTrackbarPos('G','image')
 b=cv2.getTrackbarPos('B','image')
 img[:]=[b,g,r]
img=np.zeros((100,700,3),np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,changeColor)
cv2.createTrackbar('G','image',0,255,changeColor)
cv2.createTrackbar('B','image',0,255,changeColor)
while(1):
 cv2.imshow('image',img)
 k=cv2.waitKey(1)&0xFF
 if k==27:
    break
cv2.destroyAllWindows()

insérez la description de l'image ici

Exemple 2 : contrôle des paramètres de seuil avec des barres de défilement

import cv2
Type=0 # 阈值处理方式
Value=0 # 使用的阈值
def onType(a):
 Type= cv2.getTrackbarPos(tType, windowName)
 Value= cv2.getTrackbarPos(tValue, windowName)
 ret, dst = cv2.threshold(o, Value,255, Type)
 cv2.imshow(windowName,dst)
def onValue(a):
 Type= cv2.getTrackbarPos(tType, windowName)
 Value= cv2.getTrackbarPos(tValue, windowName)
 ret, dst = cv2.threshold(o, Value, 255, Type)
 cv2.imshow(windowName,dst)
o = cv2.imread("lena.png",0)
windowName = "demo.13" #窗体名
cv2.namedWindow(windowName)
cv2.imshow(windowName,o)
# 创建两个滚动条
tType = "Type" # 用来选取阈值处理方式的滚动条
tValue = "Value" # 用来选取阈值的滚动条
cv2.createTrackbar(tType, windowName, 0, 4, onType)
cv2.createTrackbar(tValue, windowName,0, 255, onValue)
if cv2.waitKey(0) == 27:
 cv2.destroyAllWindows()

Exécutez le programme et dans l'objet de formulaire, deux barres de défilement qui contrôlent le seuil et la méthode de traitement du seuil sont affichées en même temps. Le réglage de la barre de défilement peut contrôler la valeur de seuil et la méthode de traitement de seuil utilisées respectivement , et les résultats de l'exécution sont affichés dans la figure

insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/hai411741962/article/details/132295748
conseillé
Classement