OpenCV의 cvWaitKey () 함수는 무엇을합니까?


82

실행 중에 어떤 일이 발생 cvWaitKey()합니까? 일반적인 사용 사례는 무엇입니까? 나는 그것을보고 에서 OpenCV 참조하지만 문서는 정확한 목적에 명확하지 않다.


3
그것에 대해 이해하지 못하거나 어떤 일을한다고 생각하십니까? OpenCV의 문서 참조는 ... 나에게 매우 분명한 것 같다
다니엘 Sloof

8
@ user588855 귀하의 질문을 검토하고이를 포함하여 몇 가지 답변을 수락하는 것은 우리 모두에게 중요합니다.
karlphillip 2011 년

4
기록을 위해 cvWaitKey()이제는 더 이상 사용되지 않는 C 함수입니다. waitKey()최신 C ++에 해당합니다.
StockB

1
질문에 대한 답변으로 간주 될 수 있도록 답변 중 하나를 표시해 주시겠습니까 (@SuperElectric 's가 지금은 가장 좋은 것 같습니다). 답변을 기다리고 복수 응답을 받고 4 년 ... 시간의 긴 기간이다
rbaleksandar

예를 들어 @DanielSloof는 반환 값이 어떤 표준을 따르는 지 아는 것이 좋습니다.
lahjaton_j 2015-09-02

답변:


138

cvWaitKey(x) / cv::waitKey(x) 두 가지를 수행합니다.

  1. OpenCV 창 (예 :에서 생성됨)에서 키를 누를 때까지 x 밀리 초를 기다립니다 cv::imshow(). 콘솔 입력을 위해 stdin에서 수신 대기하지 않습니다. 이 시간 동안 키를 누르면 키의 ASCII 코드를 반환합니다. 그렇지 않으면을 반환합니다 -1. ( x 가 0이면 키를 누를 때까지 무기한 대기합니다.)
  2. 로 창을 만들 cv::namedWindow()거나로 이미지를 표시 하는 것과 같은 모든 창 이벤트를 처리합니다 cv::imshow().

OpenCV 신규 사용자의 일반적인 실수는 .NET을 사용 cv::imshow()하여 각 그리기를 추적하지 않고 비디오 프레임을 통해 루프 를 호출 하는 것입니다 cv::waitKey(30). 이 경우에는 highgui가에서 그리기 요청을 처리 할 시간이 주어지지 않기 때문에 화면에 아무것도 나타나지 않습니다 cv::imshow().


19

간단히 말해서, X 밀리 초 cvWaitKey()동안 잠자기 상태이며 아무 키나 누를 때까지 기다립니다.

int cvWaitKey(int X);

키를 누르면이 함수는 키의 ASCII 코드를 반환합니다. 또는 해당 시간 동안 아무 키도 누르지 않으면 -1을 반환합니다 .


3
그것은 전체 이야기가 아닙니다. 실제로 키보드 입력에 관심이 없더라도이 함수를 호출하는 것은 일부 OpenCV 애플리케이션에 필수적 일 수 있습니다. 몇 가지있다 여기에 자세한 내용은 .
Drew Noakes 2013 년

13

cvWaitKey(0) 버튼을 누를 때까지 프로그램을 중지합니다.

cvWaitKey(10)프로그램을 중지하지 않고 깨어나서 버튼을 누르면 프로그램을 종료하도록 경고합니다. 루프를 cvWaitkey멈추지 않기 때문에 루프에 사용됩니다 .

정상적인 사용

char k;

k=cvWaitKey(0);

if(k == 'ESC')

함께 k하면 누른 키가 무엇인지 볼 수 있습니다.


5
또한 약간 더 중요한 것은 openCV 메시지 루프입니다. 루프에서 cvWaitKey ()를 호출하지 않으면 cvNamedWindow에 새 데이터가 표시되지 않습니다
Martin Beckett

14
-1 비교를 위해 나에게서 char? = multichar . 이것은 단지 잘못된 것입니다. 인쇄 가능한 문자 (이 경우 ESC는 인쇄 할 수없는 문자이므로 불가능하지만 Q 키를 사용하는 경우에는? = 'q'비교를 수행 할 수 있음)를 사용하거나 숫자 표현 중 하나를 선택하십시오. ASCII는 16 진수 (0x1b), 10 진수 (27) 및 8 진수 (033) 등 여러 숫자 시스템을 지원합니다. 나열된 모든 항목은 ESC 키를 나타냅니다.
rbaleksandar

1
char가 아닌 int 여야하며 비트 작업을 사용합니다.
Vlad

@Vlad 예, user1564486에서와 같이 27이어야합니다.
FindOutIslamNow

9

. 의 인수는 다음 0과 같이 해석됩니다.infinite

. highGUI 창을 드래그하려면 계속해서 cv::waitKey()함수를 호출해야 합니다. 예 : 정적 이미지의 경우 :

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

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


8

cvWaitKey( )기능에 문제가있는 사람을위한 메모입니다 . cvWaitKey(x)전혀 기다리지 않는 경우 실제로 창이 열려 있는지 확인하십시오 (예 :) cvNamedWindow(...). 함수 호출 cvNamedWindow(...)전에 선언을 넣으십시오 cvWaitKey().


SO에 오신 것을 환영합니다. 여러분이했던 것처럼 정보를 게시하기에 좋은 곳입니다. 일반적으로 답변을 게시 할 때 질문에 새로운 정보를 가져와야하므로 중복 게시물이 생성되지 않습니다. 귀하의 게시물에 해당하는 경우입니다. 더 작은 댓글이있는 경우 나중에 질문에 댓글을 달 수도 있습니다 (담당자가 더 많을 때). 아직 읽지 않았다면 FAQ ( stackoverflow.com/faq)를 살펴 보시기 바랍니다 . 감사합니다
ForceMagic 2010 년

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); */

4

cvWaitKey단순히 지연의 무언가를 제공합니다. 예를 들면 :

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

Tis는 비디오가 openCV에로드되고 프레임이 출력되는 내 코드와는 별개였습니다. 33코드 의 숫자는 이후 33ms에 새 프레임이 표시됨을 의미합니다. 따라서 33ms화면에 표시되는 각 프레임 사이의 간격 또는 시간 간격입니다 . 도움이 되었기를 바랍니다.


1

cvWaitKey(milliseconds) 키보드의 다음 키 입력에 대한 매개 변수로 제공된 밀리 초를 기다립니다.

인간의 눈은 1/10 초 이내에 움직이는 것을 볼 수 없으므로이를 사용하여 화면에 일정 시간 동안 동일한 이미지 프레임을 유지합니다. 키보드의 키를 누르면 바로 다음 작업이 수행됩니다.

짧게 cvWaitKey(milliseconds)키를 누르거나 millisecond제공된 시간 을 기다립니다 .


1
"인간의 눈은 1/10 초 이내에 움직이는 것을 볼 수 없기 때문에 이것을 사용하여 화면에서 일정 시간 동안 동일한 이미지 프레임을 유지합니다. 키보드의 키를 누르는 즉시 다음 작업이 수행됩니다." 이 질문이 정말 중요합니까?
quantum

-1

키가 눌 렸는지 확인하기 위해 밀리 초를 기다립니다. 해당 간격에서 누르면 ASCII 값을 반환하고 그렇지 않으면 -1입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.