jiangchengxuezi 2015-04-02 01:59 采纳率: 0%
浏览 10615

为何OpenCV中cvWaitKey(1)延时不是1ms?

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

}

  • 写回答

1条回答

  • lx624909677 2015-04-02 02:07
    关注

    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);
        }
    }
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名