我写了一个三帧差分法进行运动目标检测的程序,通过
start = GetTickCount();
if(cvWaitKey(1)>=0) break;
end = GetTickCount();
printf("Diff_time = %ld, \n",end-start);
来获取cvWaitKey(1)的运行时间,发现Diff_time为16,也就是cvWaitKey(1)耗时16ms,这条语句不是应该延时1ms才对吗?求大神帮忙。
#include
#include
#include "highgui.h"
#include
using namespace std;
using namespace cv;
int nFrmNum = 0;//记录帧数
int main(int argc, char* argv[])
{
//变量定义
IplImage* pFrame=NULL;
IplImage* pAfter=NULL;//保存pFrame对应的灰度图像
IplImage *pFrImg1 = NULL;
IplImage *pFrameDiff1 = NULL, *pFrameDiff2 = NULL;
IplImage *pForeImg=NULL;
DWORD start,end;
//要读取的视频文件和保存的视频文件路径
char* openfile="camera1_mov.avi";
//打开视频文件
CvCapture* pCapture=cvCreateFileCapture(openfile);
if(pCapture==NULL) {
cout<<"video file open error!"<<endl;
return -1;
}
//创建窗口
cvNamedWindow("video",CV_WINDOW_AUTOSIZE);
cvNamedWindow("source",CV_WINDOW_AUTOSIZE);
//逐帧读取视频并进行处理
while(pFrame = cvQueryFrame( pCapture )){
nFrmNum++;
//如果是第一帧,申请内存并进行初始化
if(nFrmNum==1){
//原始图像的灰度图
pAfter=cvCreateImage(cvSize(pFrame->width, pFrame->height),IPL_DEPTH_8U,1);
pForeImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),IPL_DEPTH_8U,1);
// 原始图像灰度图矩阵
pFrImg1 = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
cvSetZero(pFrImg1);
pFrameDiff1 = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
cvSetZero(pFrameDiff1);
pFrameDiff2 = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
}
//转化成单通道图像再处理
cvCvtColor(pFrame, pAfter, CV_BGR2GRAY);
cvCopy(pFrameDiff1,pFrameDiff2);
cvAbsDiff(pAfter, pFrImg1, pFrameDiff1);
cvCopy(pAfter, pFrImg1);
cvThreshold(pFrameDiff1, pFrameDiff1, 20, 255, CV_THRESH_BINARY);
cvAdd(pFrameDiff1, pFrameDiff2, pForeImg); //三帧法得运动前景
cvDilate(pForeImg, pForeImg, 0, 2);
cvErode(pForeImg, pForeImg, 0, 2);
cvShowImage("source",pFrame);
cvShowImage("video",pForeImg);
start = GetTickCount();
if(cvWaitKey(1)>=0) break;
end = GetTickCount();
printf("Diff_time = %ld, \n",end-start);
}
cvReleaseImage(&pFrame);
cvReleaseImage(&pAfter);
cvDestroyWindow("video");
cvDestroyWindow("source");
return 0;
}
cvWaitKey的内部除了sleep休眠之外, 还有重要的Message处理, 比如键盘消息
下面是这个函数的源码:
CV_IMPL int
cvWaitKey( int delay )
{
int time0 = GetTickCount();
for(;;)
{
CvWindow* window;
MSG message;
int is_processed = 0;
if( (delay > 0 && abs((int)(GetTickCount() - time0)) >= delay) || hg_windows == 0 )
return -1;
if( delay <= 0 )
GetMessage(&message, 0, 0, 0);
else if( PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE )
{
Sleep(1);
continue;
}
for( window = hg_windows; window != 0 && is_processed == 0; window = window->next )
{
if( window->hwnd == message.hwnd || window->frame == message.hwnd )
{
is_processed = 1;
switch(message.message)
{
case WM_DESTROY:
case WM_CHAR:
DispatchMessage(&message);
return (int)message.wParam;
case WM_KEYDOWN:
TranslateMessage(&message);
default:
DispatchMessage(&message);
is_processed = 1;
break;
}
}
}
if( !is_processed )
{
TranslateMessage(&message);
DispatchMessage(&message);
}
}
}