2011-03-07 140 views
64

在執行cvWaitKey()期間會發生什麼?什麼是典型的用例?我在OpenCV參考中看到它,但其文檔的確切目的不明確。OpenCV的cvWaitKey()函數是做什麼的?

+2

什麼別你是否瞭解它,或者你認爲它有什麼作用? OpenCV文檔參考對我來說似乎非常清楚... – 2011-03-07 08:44:47

+6

@ user588855對於我們所有人來說,重新審視您的問題並接受一些答案(包括這一點)是很重要的。 – karlphillip 2011-03-31 22:38:08

+4

對於記錄,'cvWaitKey()'現在是一個棄用的C函數。 'waitKey()'是現代C++的等價物。 – StockB 2015-01-24 19:31:39

回答

10

cvWaitKey(0)停止您的程序,直到您按下按鈕。

cvWaitKey(10)不會停止您的程序,但會在您按下按鈕時喚醒並提醒您結束程序。它用於循環,因爲cvWaitkey不停止循環。

正常使用

char k; 

k=cvWaitKey(0); 

if(k == 'ESC') 

k你可以看到按下了哪個鍵。

+5

還有一點更重要 - 它是openCV消息循環。除非您在我的循環 – 2011-03-07 15:05:38

+10

-1中調用cvWaitKey()進行比較,否則不會在cvNamedWindow中看到任何新數據** char?= multichar **。這是錯誤的。使用可打印的字符(在這種情況下是不可能的,因爲ESC是不可打印的字符,但在例如使用Q鍵的情況下,您可以執行?='q'比較)或選擇其中一個數字表示。 ASCII支持多種數字系統:十六進制(0x1b),十進制(27)和八進制(033)。所有列出的代表ESC鍵。 – rbaleksandar 2015-08-14 12:46:35

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

平原簡單,被按下cvWaitKey()休眠X毫秒,等待任何鍵。

int cvWaitKey(int X); 

如果按下某個鍵,此函數將返回鍵的ASCII碼。如果在此期間沒有按鍵,則返回-1

+3

這並不是完整的故事。實際上,即使你不關心鍵盤輸入,調用這個函數對於一些OpenCV應用程序來說也是必不可少的。這裏有一些[更多信息](http://opencv.willowgarage.com/wiki/documentation/c/highgui/WaitKey)。 – 2013-01-27 23:15:59

116

cvWaitKey(x)/cv::waitKey(x)做兩兩件事:

  1. 它等待X毫秒一個的OpenCV窗口上的鍵按壓(即,從cv::imshow()創建)。請注意,它不會監聽控制檯輸入的標準輸入。如果在此期間按下了某個鍵,它將返回該鍵的ASCII碼。否則,它將返回-1。 (如果X是零,它無限期地等待鍵按下。)
  2. 它處理任何窗口的事件,諸如與cv::namedWindow()創建窗口,或顯示用cv::imshow()圖像。

opencv新手常見的錯誤是通過視頻幀在循環中調用cv::imshow(),而不跟隨每個繪製與cv::waitKey(30)。在這種情況下,屏幕上不會顯示任何內容,因爲highgui從來沒有時間處理來自cv::imshow()的繪製請求。

+1

1+爲一個簡單和完整的答案。 – qwerty9967 2013-04-01 15:08:35

4

cvWaitKey只是提供了一些延遲。例如:

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

這是我的代碼,其中一個視頻加載到openCV和輸出的幀的代碼。代碼中的33數字表示在33ms之後,將顯示一個新幀。因此,屏幕上顯示的是每幀之間的暗號或時間間隔33ms。 希望這有助於。

1

cvWaitKey(milliseconds)只需等待毫秒提供作爲鍵盤的下一個鍵擊的參數。

人類的眼睛無法看到物體在小於1/10秒內移動,所以我們用它在屏幕上保留了相同的圖像幀一段時間。一旦鍵盤按鍵被按下,下一個操作將被執行。

總之cvWaitKey(milliseconds)等待按鍵或millisecond提供的時間。

+1

「人類的眼睛無法看到物體在1/10秒內移動,所以我們用它在屏幕上保持一段時間,只要鍵盤按鍵被按下,下一個操作就會執行」這個問題真的很重要嗎? – quantum 2012-10-20 01:40:40

8

請注意任何可能與cvWaitKey()函數有問題的人。如果您發現cvWaitKey(x)沒有在等待,請確保您確實有一個窗口打開(即cvNamedWindow(...))。在進行任何cvWaitKey()函數調用之前,請先聲明cvNamedWindow(...)

+0

歡迎來到SO,它是發佈信息的好地方,就像你一樣。通常,當您發佈答案時,它必須爲問題帶來新信息,因此它不會創建冗餘帖子。這是你的文章的情況。如果您的評論較小,您可以稍後對該問題發表評論(當您獲得更多的廣告時)。如果你還沒有閱讀它,我建議你看看FAQ:http://stackoverflow.com/faq。問候 – ForceMagic 2012-10-11 06:02:21

6

。參數0被解釋爲infinite

。爲了拖動highGUI窗口,您需要不斷調用cv::waitKey()函數。例如,對於靜態圖像:

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

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

-1

等待毫秒檢查鍵被按下,如果被按壓在間隔返回字符的ASCII值,否則它仍然-1

相關問題