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

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

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

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

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

cvWaitKey() , 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 de clave ASCII. O devuelve -1 si no se presionó ninguna tecla durante ese tiempo.

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

cvWaitKey(10) no detiene su progtwig, sino que se cvWaitKey(10) y alerta para finalizar su progtwig cuando presiona un botón. Se usa en bucles porque cvWaitkey no detiene el bucle.

Uso normal

 char k; k=cvWaitKey(0); if(k == 'ESC') 

con k puedes ver qué tecla se presionó.

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

. argumento de 0 se interpreta como infinite

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

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

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

 /* Assuming this is a while loop -> eg 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); */ 

El cvWaitKey simplemente proporciona algo de retraso. Por ejemplo:

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

Fue parte de mi código en el que se cargó un video en openCV y se generaron los marcos. El número 33 en el código significa que después de 33ms , se 33ms un nuevo fotogtwig. Por lo tanto, fue un intervalo de tiempo o 33ms de 33ms entre cada cuadro que se muestra en la pantalla. Espero que esto ayude.

cvWaitKey(milliseconds) simplemente espera los milisegundos que se proporcionan como parámetro para una próxima cvWaitKey(milliseconds) 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 sostener el mismo cuadro de imagen por algún tiempo en la pantalla. Tan pronto como se presiona la tecla del teclado, se realizará la siguiente operación.

En pocas palabras, cvWaitKey(milliseconds) espere ya sea para presionar la tecla o el tiempo de millisecond proporcionado.

Espera milisegundos para verificar si se presiona la tecla, si se presiona en ese intervalo, devuelve su valor ascii, de lo contrario, todavía -1