opencv advanced 03 - ejemplo de interacción entre imagen y mouse

Cuando se trabaja con imágenes, puede ser necesario interactuar con la imagen que se está procesando actualmente. OpenCV
proporciona eventos de mouse que permiten a los usuarios interactuar con imágenes con el mouse. Los eventos del mouse pueden identificar las operaciones del mouse utilizadas comúnmente, como: hacer clic, hacer doble clic para diferentes botones, deslizar, arrastrar, etc. del mouse.

Por ejemplo, cuando el usuario hace clic con el mouse, dibujamos un círculo. La forma habitual es crear una función de respuesta OnMouseAction() y escribir la operación que se realizará en la función de respuesta
. La función de respuesta se crea de acuerdo con un formato fijo, su formato es:

def OnMouseAction(evento,x,y,banderas,parámetro):

En la fórmula:

  • event indica qué tipo de evento se activa y los eventos específicos se muestran en la Tabla 19-3.
  • x, y representan las coordenadas (x, y) del mouse en la ventana cuando se activa el evento del mouse.
  • las banderas representan el evento de arrastre del mouse y el evento conjunto del teclado y el mouse, como se muestra en la Tabla 19-4.
  • param es el ID de la función, que identifica la función de evento correspondiente, lo que equivale a personalizar el ID de una función OnMouseAction().
  • OnMouseAction es el nombre de la función de respuesta, que se puede personalizar.

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Después de definir la función de respuesta, es necesario asociar (vincular) la función con una ventana específica, de modo que cuando el mouse en la ventana active un evento, la función de respuesta se pueda encontrar y ejecutar. Para vincular una función a una ventana, puede 函 数cv2.setMouseCallback()implementarla y su sintaxis básica es:

cv2.setMouseCallback(winname,onMouse)

En la fórmula:

  • winname es el nombre de la ventana enlazada.
  • onMouse es el nombre de la función de respuesta enlazada.

Diseñe un programa para juzgar los eventos del ratón desencadenados.

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

resultado de la operación:
inserte la descripción de la imagen aquí

Nota: Puede ver los eventos del mouse admitidos por OpenCV a través de los siguientes métodos:

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

barra de desplazamiento

La barra de desplazamiento (Trackbar) es una herramienta interactiva muy conveniente en OpenCV, existe adjunta a una ventana específica.
Al ajustar la barra de desplazamiento, puede establecer y obtener un valor específico dentro del rango especificado.
En OpenCV, la función cv2.createTrackbar() se usa para definir la barra de desplazamiento y su formato de sintaxis es:

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

En la fórmula:

  • trackbarname es el nombre de la barra de desplazamiento.
  • winname es el nombre de la ventana a la que se adjunta la barra de desplazamiento.
  • valor es el valor inicial que determina la posición del control deslizante en la barra de desplazamiento.
  • count es el valor máximo de la barra de desplazamiento. Normalmente, su valor mínimo es 0.
  • onChange es la función de devolución de llamada. En general, las operaciones que se implementarán después de cambiar la barra de desplazamiento se escriben en la función de devolución de llamada.

函数 cv2.createTrackbar()用于生成一个滚动条. Arrastre la barra de desplazamiento para establecer el valor de la barra de desplazamiento y deje que la barra de desplazamiento devuelva el valor correspondiente. El valor de la barra de desplazamiento se puede 函数 cv2.getTrackbarPos()obtener mediante y su formato de sintaxis es:

retval=getTrackbarPos( nombre de barra de seguimiento, nombre de victoria )

En la fórmula:

  • retval es el valor devuelto, que obtiene el valor de la barra de desplazamiento generada por la función cv2.createTrackbar().
  • trackbarname es el nombre de la barra de desplazamiento.
  • winname es el nombre de la ventana a la que se adjunta la barra de desplazamiento.

Ejemplo: implementar una paleta con barras de desplazamiento

En el espacio de color RGB, cualquier color se compone de tres colores: rojo (R), verde (G) y azul (B), y el rango de cada componente de color es [0, 255].

Esta sección usa la función cv2.createTrackbar() y la función cv2.getTrackbarPos() para diseñar
una paleta analógica: En el formulario, hay tres barras de desplazamiento que se usan para establecer los valores de R, G y B respectivamente, y el la paleta se ajustará de acuerdo con los valores actuales de R, G y B de la pantalla mostrarán sus colores correspondientes en tiempo real.

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

inserte la descripción de la imagen aquí

Ejemplo 2: control de parámetros de umbral con barras de desplazamiento

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

Ejecute el programa y, en el objeto de formulario, se muestran al mismo tiempo dos barras de desplazamiento que controlan el umbral y el método de procesamiento del umbral. El ajuste de la barra de desplazamiento puede controlar el valor de umbral y el método de procesamiento de umbral utilizados en el procesamiento de umbral, respectivamente , y los resultados de la ejecución se muestran en la figura

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/hai411741962/article/details/132295748
Recomendado
Clasificación