緒:
waitKey()函數在顯示圖像時具有延時的感化;
是OpenCV中的一個根基函數;
本文本家兒要介紹waitKey函數的格局,功能,以及waitKey窗口機制和waitKey的應用;
waitKey格局:
int waitKey(int delay=0)
delay-延時的時候,單元ms;
waitKey函數的功能:
①期待x ms,若是在此時代有按鍵按下,則當即竣事并返回按鍵的ASCII碼,不然返回-1;
②若是x=0,則無限期待下去,直到有按鍵按下;
【注】:在imshow之后,若是沒有waitKey語句則不會顯示圖像。
waitKey函數的窗口機制:
waitKey的延時功能本家兒要針對圖像窗口機制的;
沒有窗口,則waitKey號令不執行;
純粹的延時用sleep號令;
void update(void *param)
{
VideoCapture cap;
cap.open("test.avi");
if ( !cap.isOpened() )
{
return ;
}
for(;;)
{
cap>>frame;
//cvNamedWindow("tmp");//加上這個,再利用waitkey就沒問題了
//waitKey(100);//利用waitkey法式必心猿意馬崩,本家兒如果因為waitkey是對窗口機制起感化的,即namedWindow發生的窗口,若沒有發生的窗口,則waitkey半斤八兩于未執行,當視頻幀很快的被讀完,frame為空,天然就出問題了
Sleep(100);//若利用Sleep,則能正常工作
}
}
void main()
{
_beginthread(update,0,NULL);
Sleep(1000);
cvNamedWindow("test");
for(;;)
{
//判空(省略)
imshow("test",*frame);
waitKey(100);
}
waitKey(0);
}
應用:
#include < opencv2/highgui/highgui.hpp >
#include < iostream >
#include < Windows.h >
using namespace cv;
using namespace std;
int main()
{
Mat im;
double duration;
im = imread("lena.jpg",0);
// 測試沒有namedWindow時的waitKey執行時候
duration = static_cast<double>(getTickCount());
waitKey(10000);
duration = static_cast<double>(getTickCount()) - duration;
duration /= getTickFrequency();
cout <<"第一個waitKey運行時候為:" << duration << 's' << endl;
namedWindow("lena");
imshow("lena",im);
// 測試有namedWindow時的waitKey執行時候
duration = static_cast<double>(getTickCount());
waitKey(10000);
duration = static_cast<double>(getTickCount()) - duration;
duration /= getTickFrequency();
cout <<"第二個waitKey運行時候為:" << duration << 's' << endl;
Sleep(20000);
return 0;
}
從執行成果看出,第一個成果并未如期執行,第二個成果如期執行了。這是因為waitKey僅對窗口機制起感化,即namedWindow發生的窗口。若在此之前沒有發生窗口,則waitKey半斤八兩于未執行。
注重事項:
①waitKey()--這個函數是在一個給心猿意馬的時候內(單元ms)期待用戶按鍵觸發;若是用戶沒有按下 鍵,則接續期待(輪回)
②while(1){ if(waitKey(100)==27)break; } 在這個法式中,我們告訴OpenCv期待用戶觸發事務,期待時候為100ms,若是在這個時候段內, 用戶按下ESC(ASCII碼為27),則跳出輪回,不然,則跳出輪回
③若是設置waitKey(0),則暗示法式會無限制的期待用戶的按鍵事務
0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!