我正在Mac OS X上使用OpenCV和CUDA编写模式匹配代码。大约70帧后,它会慢下来。使用mach_absolute_time()我已经能够追踪罪魁祸首(最初我认为这是一个磁盘访问问题):
gpu::matchTemplate(currentFrame,
correlationTargets[i]->correlationImage,
temporaryImage,
CV_TM_CCOEFF_NORMED);
我认为这是由matchTemplate内部的一些内存问题引起的。经过大量的搜索,我找到了matchTemplateBuf结构,大概是为了重用内存。由于这个问题似乎与记忆有关,我认为使用它可能是解决方案。但是,以下代码崩溃:
gpu::MatchTemplateBuf mtBuff;
[...]
for(...) {
gpu::matchTemplate(correlationTargets[i]->croppedImage,
correlationTargets[i]->correlationImage,
correlationTargets[i]->maxAllocation,
CV_TM_CCOEFF_NORMED, mtBuff);
有错误:
OpenCV Error: Gpu API call (Unknown error code [Code = 9999]) in convolve, file /Users/sermarc/Downloads/opencv-2.4-3.8/modules/gpu/src/imgproc.cpp, line 1431 libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Users/sermarc/Downloads/opencv-2.4-3.8/modules/gpu/src/imgproc.cpp:1431: error: (-217) Unknown error code [Code = 9999] in function convolve
我相信这是因为matchTemplateBuff未正确初始化。但是,我找不到任何显示它被设置为有效状态的信息或示例。
代码适用于:
gpu::matchTemplate(correlationTargets[i]->croppedImage,
correlationTargets[i]->correlationImage,
correlationTargets[i]->maxAllocation,
CV_TM_CCOEFF_NORMED);