Saltar al contenido

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

Solución:

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

Por ejemplo, si desea activar la pulsación de la tecla ‘a’, haga lo siguiente:

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

Vea un código de muestra aquí: Histograma de dibujo

ACTUALIZAR :

Para encontrar el valor de la clave para cualquier clave es imprimir el valor de la 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 tecla devueltos por waitKey parecen dependientes 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 números enteros que figuran en las listas de respuestas de Abid son muy inútiles para la mente humana (a menos que seas un sabio prodigio …). Sin embargo, si los examina en hexadecimal, o echa un vistazo al Byte menos significativo, es posible que observe patrones …

Mi secuencia de comandos para examinar los valores de retorno de waitKey Esta abajo:

#!/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:

    Pulsó 1048689 (0x100071), LSB: 113 (‘q’)

  • Tecla de escape (tradicionalmente, ASCII 27):

    Pulsó 1048603 (0x10001b), LSB: 27 (‘ x1b’)

  • Espacio:

    Pulsó 1048608 (0x100020), LSB: 32 (”)

Esta lista podría continuar, como quiera que vea el camino a seguir, cuando obtenga resultados ‘extraños’.

Por cierto, si quieres ponerlo en un bucle, puedes simplemente waitKey(0) (espera para siempre), en lugar de ignorar la -1 valor de retorno.

EDITAR: Hay más en estos bits altos de lo que parece; consulte la respuesta de Andrew C (pista: tiene que ver con modificadores de teclado como todos los “Bloqueos”, por ejemplo, NumLock).

Sin embargo, mi experiencia reciente muestra que existe una dependencia de la plataforma; por ejemplo, OpenCV 4.1.0 de Anaconda en Python 3.6 en Windows no produce estos bits, y para algunas claves (importantes) se devuelve 0 de waitKey() (flechas, Hogar, Fin, PageDn, Página arriba, incluso Del y En s). Por lo menos Retroceso devoluciones 8 (pero por qué no Del?).

Por lo tanto, para una interfaz de usuario multiplataforma, probablemente esté restringido a W, A, S, D, letras, dígitos, Esc, Espacio y Retroceso 😉

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 se parece a la respuesta de Tomasz porque inicialmente escribí esto como una edición, que fue rechazada.


Los códigos de tecla devueltos por waitKey cambiar dependiendo de los modificadores que estén habilitados. NumLock, CapsLock y las teclas Shift, Ctrl y Alt modifican el código de tecla devuelto por waitKey habilitando 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 proporciona 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 '?')

Que dan los siguientes resultados:

  • q letra con NumLock:

    Pulsó 1048689 (0x100071), 2LSB: 113 (‘q’)

  • Tecla de escape con Bloq Mayús pero no Bloq Num:

    Pulsó 131099 (0x2001b), 2LSB: 27 (‘ x1b’)

  • Espacio con Shift y NumLock:

    Pulsó 1114144 (0x110020), 2LSB: 32 (”)

  • Tecla de flecha derecha con Control, Bloq Num desactivado:

    Pulsó 327507 (0x4ff53), 2LSB: 65363 (‘S’)

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

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

… ya que el indicador de “clave de control” es el bit 19. Shift está en el bit 17, el estado de CapsLock en el bit 18, Alt está en el bit 20 y NumLock está en el bit 21.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *