我写了一个三帧差分法进行运动目标检测的程序,通过
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;
}