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