work waitkey spacebar example doesn 0xff python opencv

python - spacebar - Uso de otras claves para la función waitKey() de opencv



opencv waitkey spacebar (7)

Estoy trabajando en un programa (python, opencv) en el que utilizo la spacebar para ir al siguiente fotograma y Esc para salir del programa. Estas son las dos únicas claves que tengo trabajando. Traté de averiguar más llaves, intenté varios códigos pero no funcionó. especialmente las teclas de flecha.

Encontré this sobre waitkey , pero no funciona.

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


Si desea pausar el programa para tomar capturas de pantalla del progreso

(se muestra en digamos cv2.imshow)

cv2.waitKey (0) continuará después de presionar el botón "Scr" (o su combinación), pero puede intentar esto

cv2.waitKey(0) input('''')

cv2.waitkey (0) para dar al programa el tiempo suficiente para procesar todo lo que desea ver en el imshow y la entrada ('''')

para hacer que espere a que presione Enter en la ventana de la consola

esto funciona en python 3


Con Ubuntu y C ++ tuve problemas con el reparto Personaje / Entero. Necesitaba usar cv::waitKey()%256 para obtener el valor ASCII correcto.


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

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:


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 dependiendo de qué modificadores están habilitados. NumLock, CapsLock y las teclas Mayús, Ctrl y Alt modifican el código waitKey devuelto por waitKey al habilitar ciertos bits por encima de los dos bytes menos significativos. El más pequeño de estos indicadores es Shift en 0x10000.

A continuación, se incluye una versión modificada del guión publicado por 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 carta con NumLock:

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

  • Escape key 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 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 simple hacer algo como:

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

... como la bandera de la "tecla 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.


Los códigos de waitKey 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 de las listas de respuestas de Abid son inútiles para la mente humana (a menos que seas un prodigio sabio ...). Sin embargo, si los examina en hexadecimal o echa un vistazo al Byte menos significativo, puede observar patrones ...

Mi script para examinar los valores de retorno de waitKey está 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 carta:

    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, verá el camino a seguir, cuando obtenga resultados ''extraños''.

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


Para C ++:

En caso de utilizar 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; }


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

Por ejemplo, si desea activar la tecla ''a'', presione de la siguiente manera:

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

Vea un código de ejemplo aquí: Dibujo Histograma

ACTUALIZAR:

Para encontrar el valor de la clave para cualquier tecla es imprimir el valor de la clave con un simple script 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 :)