¿Qué hace la función cvWaitKey () de OpenCV?

82

¿Qué sucede durante la ejecución de cvWaitKey()? ¿Cuáles son algunos casos de uso típicos? Lo vi en la referencia de OpenCV, pero la documentación no está clara sobre su propósito exacto.

Sencillez
fuente
3
¿Qué es lo que no entiendes al respecto o qué crees que hace? La referencia de la documentación de OpenCV me parece muy clara ...
Daniel Sloof
8
@ user588855 Es importante para todos nosotros que revise sus preguntas y acepte algunas respuestas, incluida esta.
karlphillip
4
Para el registro, cvWaitKey()ahora es una función C obsoleta. waitKey()es el equivalente moderno de C ++.
StockB
1
¿Puede marcar una de las respuestas (la de @SuperElectric parece la mejor por ahora) para que la pregunta se considere respondida? 4 años de esperar una respuesta y obtener múltiples respuestas es un largo período de tiempo ...
rbaleksandar
@DanielSloof, por ejemplo, sería bueno saber qué estándar siguen los valores de retorno.
lahjaton_j

Respuestas:

138

cvWaitKey(x) / cv::waitKey(x) hace dos cosas:

  1. Espera x milisegundos a que se presione una tecla en una ventana OpenCV (es decir, creada a partir de cv::imshow()). Tenga en cuenta que no escucha en stdin la entrada de la consola. Si se presionó una tecla durante ese tiempo, devuelve el código ASCII de la tecla. De lo contrario, vuelve -1. (Si x es cero, espera indefinidamente a que se presione la tecla).
  2. Maneja cualquier evento de ventanas, como crear ventanas con cv::namedWindow()o mostrar imágenes con cv::imshow().

Un error común para los recién llegados a opencv es llamar cv::imshow()en bucle a través de cuadros de video, sin seguir cada dibujo con cv::waitKey(30). En este caso, no aparece nada en la pantalla, porque highgui nunca tiene tiempo para procesar las solicitudes de extracción cv::imshow().

SuperElectrico
fuente
19

Sencillamente, cvWaitKey()duerme durante X milisegundos, esperando que se presione cualquier tecla.

int cvWaitKey(int X);

Si se presiona una tecla, esta función devuelve el código ASCII de la tecla. O devuelve -1 si no se presionó ninguna tecla durante ese tiempo.

karlphillip
fuente
3
Esa no es toda la historia. En la práctica, incluso si no le importa la entrada del teclado, llamar a esta función puede ser esencial para algunas aplicaciones OpenCV. Hay más información aquí .
Drew Noakes
13

cvWaitKey(0) detiene su programa hasta que presione un botón.

cvWaitKey(10)no detiene su programa, pero se despierta y alerta para finalizar su programa cuando presiona un botón. Se usa en bucles porque cvWaitkeyno detiene el bucle.

Uso normal

char k;

k=cvWaitKey(0);

if(k == 'ESC')

con kpuede ver qué tecla se presionó.

Jorge Vega Sánchez
fuente
5
También un poco más importante: es el bucle de mensajes openCV. No verá ningún dato nuevo en un cvNamedWindow a menos que llame a cvWaitKey () en el bucle
Martin Beckett
14
-1 de mi parte por hacer un char de comparación ? = Multichar . Esto está simplemente mal. Utilice el carácter imprimible (que en este caso no es posible ya que ESC es un carácter no imprimible, pero en el caso, por ejemplo, de utilizar la tecla Q, puede hacer una comparación? = 'Q') o elija una de las representaciones numéricas. El ASCII admite múltiples sistemas numéricos: hexadecimal (0x1b), decimal (27) y octal (033). Todos los listados representan la tecla ESC.
rbaleksandar
1
debe ser int no char, luego use bit ops
Vlad
@Vlad Sí, debería ser 27 como en user1564486
FindOutIslamNow
9

. argumento de 0se interpreta comoinfinite

. para arrastrar las ventanas highGUI, necesita llamar continuamente a la cv::waitKey()función. por ejemplo, para imágenes estáticas:

cv::imshow("winname", img);

while(cv::waitKey(1) != 27); // 27 = ascii value of ESC


fuente
8

Nota para cualquiera que pueda haber tenido problemas con la cvWaitKey( )función. Si encuentra que cvWaitKey(x)no está esperando en absoluto, asegúrese de tener una ventana abierta (es decir cvNamedWindow(...)). Coloque la cvNamedWindow(...)declaración ANTES de cualquier cvWaitKey()llamada a función.

Andy
fuente
Bienvenido a SO, es un buen lugar para publicar información como lo hizo usted. Por lo general, cuando publica una respuesta, debe aportar nueva información a la pregunta, por lo que no crea una publicación redundante. Cuál fue el caso de tu publicación. Si tiene un comentario más pequeño, también puede comentar sobre la pregunta más adelante (cuando obtenga más Rep). Si aún no lo ha leído, le sugiero que consulte las preguntas frecuentes: stackoverflow.com/faq . Saludos
ForceMagic
5
/* Assuming this is a while loop -> e.g. video stream where img is obtained from say web camera.*/    
cvShowImage("Window",img);

/* A small interval of 10 milliseconds. This may be necessary to display the image correctly */
cvWaitKey(10);  

/* to wait until user feeds keyboard input replace with cvWaitKey(0); */
entusiasta friki
fuente
4

El cvWaitKeysimplemente proporciona algo de retraso. Por ejemplo:

char c = cvWaitKey(33);
if( c == 27 ) break;

Esta fue una parte de mi código en la que se cargó un video en openCV y se emitieron los cuadros. El 33número en el código significa que después 33ms, se mostrará un nuevo marco. Por lo tanto, era un retraso o intervalo de tiempo 33msentre cada cuadro que se muestra en la pantalla. Espero que esto ayude.

sue-ling
fuente
1

cvWaitKey(milliseconds) simplemente espere los milisegundos proporcionados como parámetro para la siguiente pulsación de tecla del teclado.

Los ojos humanos no pueden ver la cosa moviéndose en menos de 1/10 de segundo, así que usamos esto para mantener el mismo cuadro de imagen durante algún tiempo en la pantalla. Tan pronto como se presione la tecla del teclado, se realizará la siguiente operación.

En breve, cvWaitKey(milliseconds)espere a que se presione la tecla o el millisecondtiempo proporcionado.

Pravin Dahale
fuente
1
"Los ojos humanos no pueden ver la cosa moviéndose en menos de 1/10 de segundo, por lo que usamos esto para mantener el mismo cuadro de imagen durante algún tiempo en la pantalla. Tan pronto como se presione la tecla del teclado, se realizará la siguiente operación" esto realmente importa a la pregunta?
Quantum
-1

espera milisegundos para verificar si la tecla está presionada, si se presiona en ese intervalo devuelve su valor ascii, de lo contrario sigue siendo -1

Yassine Abdul-Rahman
fuente