Usando otras teclas para la función waitKey () de opencv

Estoy trabajando en un progtwig (python, opencv) en el que uso la spacebar para pasar al siguiente fotogtwig y Esc para salir del progtwig. Estas son las únicas dos claves que tengo trabajando. Intenté averiguar más claves, probé varios códigos para ellas pero no funcionó. especialmente las teclas de flecha.

Encontré esto sobre waitkey , pero no funciona.

Entonces, mi pregunta es: ¿Cómo puedo capturar otras teclas además de la spacebar y la spacebar para activar ciertas funciones en mi progtwig python-opencv?

Puedes usar la función ord() en Python para eso.

Por ejemplo, si desea activar la tecla ‘a’, haga lo siguiente:

 if cv2.waitKey(33) == ord('a'): print "pressed a" 

Vea un ejemplo de código aquí: Histogtwig de dibujo

ACTUALIZACIÓN:

Para encontrar el valor de clave para cualquier clave es imprimir el valor de clave usando un script simple de la siguiente manera:

 import cv2 img = cv2.imread('sof.jpg') # load a dummy image while(1): cv2.imshow('img',img) k = cv2.waitKey(33) if k==27: # Esc key to stop break elif k==-1: # normally -1 returned,so don't print it continue else: print k # else print its value 

Con este código, obtuve los siguientes valores:

 Upkey : 2490368 DownKey : 2621440 LeftKey : 2424832 RightKey: 2555904 Space : 32 Delete : 3014656 ...... # Continue yourself :) 

Los códigos de waitKey devueltos por waitKey parecen depender de la plataforma. Sin embargo, puede ser muy educativo ver qué devuelven las claves (y, por cierto, en mi plataforma, Esc no devuelve 27 …)

Los enteros que las listas de respuestas de Abid son muy inútiles para la mente humana (a menos que seas un prodigio sabio …). Sin embargo, si los examinas en hexadecimal, o miras el byte menos significativo, puedes observar patrones …

Mi script para examinar los valores de retorno de waitKey encuentra a continuación:

 #!/usr/bin/env python import cv2 import sys cv2.imshow(sys.argv[1], cv2.imread(sys.argv[1])) res = cv2.waitKey(0) print 'You pressed %d (0x%x), LSB: %d (%s)' % (res, res, res % 256, repr(chr(res%256)) if res%256 < 128 else '?') 

Puede usarlo como un visor de imágenes de línea de comandos mínimo.

Algunos resultados, que obtuve:

  • q letra:

    Presionó 1048689 (0x100071), LSB: 113 ('q')

  • Tecla de escape (tradicionalmente, ASCII 27):

    Presionó 1048603 (0x10001b), LSB: 27 ('\ x1b')

  • Espacio:

    Presionó 1048608 (0x100020), LSB: 32 ('')

Esta lista podría continuar, sin embargo, usted ve el camino a seguir, cuando obtiene resultados "extraños".

Por cierto, si desea ponerlo en un bucle, puede simplemente waitKey(0) (esperar por siempre), en lugar de ignorar el valor de retorno de -1 .

Las respuestas que ya se han publicado sugieren que algunos de los valores inusuales obtenidos por waitKey se deben a diferencias de plataforma. A continuación, propongo que (al menos en algunas plataformas) el comportamiento aparentemente extraño de waitKey se debe a los modificadores del teclado. Esta publicación es similar a la respuesta de Tomasz porque inicialmente escribí esto como una edición, que fue rechazada.


Los códigos de waitKey devueltos por waitKey cambian según los modificadores que estén habilitados. NumLock, CapsLock y las teclas Shift, Ctrl y Alt modifican el código de tecla devuelto por waitKey al habilitar ciertos bits por encima de los dos bytes menos significativos. La más pequeña de estas banderas es Shift en 0x10000.

A continuación se presenta una versión modificada del script que publicó Tomasz:

 #!/usr/bin/env python import cv2 import sys cv2.imshow(sys.argv[1], cv2.imread(sys.argv[1])) res = cv2.waitKey(0) print 'You pressed %d (0x%x), 2LSB: %d (%s)' % (res, res, res % 2**16, repr(chr(res%256)) if res%256 < 128 else '?') 

Los cuales dan los siguientes resultados:

  • q letra con NumLock:

    Presionó 1048689 (0x100071), 2LSB: 113 ('q')

  • Tecla de escape con CapsLock pero no NumLock:

    Presionó 131099 (0x2001b), 2LSB: 27 ('\ x1b')

  • Espacio con Shift y NumLock:

    Presionó 1114144 (0x110020), 2LSB: 32 ('')

  • Tecla de flecha derecha con control, NumLock desactivado:

    Presionó 327507 (0x4ff53), 2LSB: 65363 ('S')

Espero que esto ayude a explicar el comportamiento inusual de waitKey y cómo presionar la tecla real independientemente del estado de NumLock y CapLock. Desde aquí es relativamente simple hacer algo como:

 ctrlPressed = 0 != res & (1 << 18) 

... ya que el indicador de "tecla de control" es el bit 19. El desplazamiento está en el bit 17, el estado de CapsLock en el bit 18, Alt está en el bit 20 y NumLock en el bit 21.

Para C ++:

En caso de usar caracteres / números de teclado, una solución más fácil sería:

 int key = cvWaitKey(); switch(key) { case ((int)('a')): // do something if button 'a' is pressed break; case ((int)('h')): // do something if button 'h' is pressed break; } 

Con Ubuntu y C ++ tuve problemas con el elenco de Character / Integer. Necesitaba usar cv::waitKey()%256 para obtener el valor ASCII correcto.

Si desea pausar el progtwig para tomar capturas de pantalla del progreso.

(mostrado en digamos cv2.imshow)

cv2.waitKey (0) continuaría después de presionar el botón “Scr” (o su combinación), pero puedes intentarlo

 cv2.waitKey(0) input('') 

cv2.waitkey (0) para que el progtwig tenga tiempo suficiente para procesar todo lo que desea ver en la imagen y la entrada (”)

para hacerte esperar a que pulses Intro en la ventana de la consola

esto funciona en python 3

En cuanto a mí, el código siguiente no funciona , cuando se ejecuta, la imagen pasará a la siguiente rápidamente sin su prensa:

 import cv2 img = cv2.imread('sof.jpg') # load a dummy image while(1): cv2.imshow('img',img) k = cv2.waitKey(33) if k==27: # Esc key to stop break elif k==-1: # normally -1 returned,so don't print it continue else: print k # else print its value 

Pero esto funciona:

 def test_wait_key(): lst_img_path = [ '/home/xy/yy_face_head/face_det_test/111.png', '/home/xy/yy_face_head/face_det_test/222.png' #.....more path ... ] for f_path in lst_img_path: img = cv2.imread(f_path) cv2.imshow('tmp', img) c = cv2.waitKey(0) % 256 if c == ord('a'): print "pressed a" else: print 'you press %s' % chr(c) 

Salida como abajo:

introduzca la descripción de la imagen aquí