我正在将PS3眼动摄像头视频捕获到我调整大小和显示并保存到磁盘的图像中。我在帧速率方面遇到麻烦,因此我测量了每个流程的时间。事实证明,真正减慢捕获速度的唯一过程是cvWaitKey(1),它会为每个捕获循环增加大约20毫秒的时间。

有一种解决方法可以避免cvWaitKey()?

在没有等待键和显示的情况下,测得的时间约为20毫秒,在没有显示键的情况下测得的时间为60毫秒(需要等待键)。调整大小不会增加大量时间。

谢谢你的帮助。

// image capturing loop
    while(_running)
    {
        //activate cvWaitKey - this drops framerate significantly!
        cvWaitKey(1);

        //get frame from capture and put into buffer
        CLEyeCameraGetFrame(_cam, pCapBuffer);

        //get system timestamps
        GetSystemTime(&st);
        GetLocalTime(&lt);

        // Resize image to fit screen size
        cvResize(pCapImage,resizedpCapImage,CV_INTER_NN);

        //display image
        cvShowImage(_windowName, resizedpCapImage);

        //clear string
        sstm.str(std::string());

        //complete filname
        sstm << _folder << prefix << _participant << std::setfill('0') << std::setw(10) << i  << "-" << st.wHour << st.wMinute << st.wSecond <<  st.wMilliseconds << suffix;
        image_name = sstm.str();
        c = image_name.c_str();


        //log if enabled
        if (_logging){
            //try to save image
            try {
                cvSaveImage(c, pCapImage); //bmp = speed!
            }
            catch (runtime_error& ex) {
                fprintf(stderr, "Exception converting image to bmp format: %s\n", ex.what());
            }
        }
    }

最佳答案

首先,不建议立即抓取帧并将其写入磁盘,因为这是系统调用,因此花费的时间是不可预测的。对于短片,您可以将整个未压缩的帧集存储在内存中。如果那不起作用,您将需要两个线程:一个线程获取帧并将其写入缓冲区,另一个线程将其保存到磁盘。

其次,如果您正在运行Windows,则可以使用 _getch (带有 _kbhit )替换cvWaitKey(如果速度更快)。

if(_kbhit()) ch = _getch();

但是,我对责怪cvWaitKey有所保留。如果您使用GetSystemTime来分析代码,则结果很可能是错误的,因为它不是很准确。

我建议您使用QueryPerformanceCounter重新分析代码(如果您使用的是Windows)。

10-06 12:39