cvWaitKey()显着减缓捕获过程


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

其次,如果你正在运行windows,如果速度更快,你可以使用_getch (带_kbhit )替换cvWaitKey

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

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

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


我还没有找到cvWaitKey(1)的解决方法,但我想通过使用窗口处理程序调整图像大小的另一种方法,这使得我可以在大约20ms内渲染图像,而不是使用

 cvResize(pCapImage,resizedpCapImage,CV_INTER_NN);

因此,这种插值可能会减慢过程并代表一个瓶颈。

这是我处理它的方式:

而不是使用

cvNamedWindow(_windowName, CV_WINDOW_AUTOSIZE);

我现在使用

cvNamedWindow(_windowName, CV_WINDOW_NORMAL);

由于我仍然必须完成在无边界全屏中表示窗口,因此我添加了以下功能:

//display Window in Fullscreen depending on where the client camerawindow is at and what resolution this monitor has.
void Class::setFullscreen(){    

    cvSetWindowProperty(_windowName, CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);

    HWND win_handle = FindWindow(0, (LPCTSTR)_windowName);
    if (!win_handle)
    {
        printf("Failed FindWindown");
    }

    // Get monitor resolution
    HMONITOR monitor = MonitorFromWindow(win_handle, MONITOR_DEFAULTTONEAREST);
    MONITORINFO info;
    info.cbSize = sizeof(MONITORINFO);
    GetMonitorInfo(monitor, &info);
    int monitor_width = info.rcMonitor.right - info.rcMonitor.left;
    int monitor_height = info.rcMonitor.bottom - info.rcMonitor.top;

    // Resize
    unsigned int flags = (SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);
    flags &= ~SWP_NOSIZE;

    // Set position
    unsigned int x = 0;
    unsigned int y = 0;
    SetWindowPos(win_handle, HWND_NOTOPMOST, x, y, monitor_width, monitor_height, flags);

    // Borderless
    SetWindowLong(win_handle, GWL_STYLE, 0);
    ShowWindow(win_handle, SW_SHOW);
}

这样做我可以在每次迭代大约20ms到30ms之间完成相当高的帧率,这相当于30-50hz(或fps)。 这是对速度的改进,但它不是精确帧率的确切解决方案。 我也尝试将预测精度提高到40hz,但给cvWaitKey()如cvWaitKey(20)提供更高的区段只是降低了帧率,但不会增加任何帧率稳定。

链接地址: http://www.djcxy.com/p/95061.html

上一篇: cvWaitKey() slowing capture process significantly

下一篇: Using cv::waitKey without having to call cv::namedWindow or cv::imshow first