我需要实时处理,但OpenCV的内部功能无法提供此功能。我正在进行手势识别,它几乎完美地工作,但输出结果非常滞后和缓慢。我知道这不是因为我的算法,而是因为OpenCV的处理时间。有什么方法可以加速它吗?
注:我不想使用IPP库,请不要建议。我需要从OpenCV本身获得更高的性能。
注:我不想使用IPP库,请不要建议。我需要从OpenCV本身获得更高的性能。
提高图像分析的传统技术:
Steve-o的回答对于优化代码效率很好。我建议添加一些逻辑来监视执行时间,以帮助您确定在哪里花费优化的努力。
OpenCV时间监控逻辑(Python):
startTime = cv.getTickCount()
# your code execution
time = (cv.getTickCount() - startTime)/ cv.getTickFrequency()
时间监控的增强逻辑:
boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time();
// do something time-consuming
boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time();
boost::posix_time::time_duration timeTaken = end - start;
std::cout << timeTaken << std::endl;
根据我的经验,配置OpenCV构建的方式非常重要。 IPP并不是提供更好性能的唯一选择。值得尝试各种构建方式以获得更好的硬件利用效率。
其他需要关注的领域包括CPU和内存利用率。如果你观察CPU和/或内存利用率,你可能会发现你的代码中有10%的部分在工作,而其他时候基本上处于空闲状态。
考虑将逻辑重构为使用线程的管道,以便可以同时处理多个图像(如果正在跟踪并需要先前图像的结果,则需要将代码分成多个段,例如预处理/分析,并使用std :: queue在它们之间进行缓冲,而imshow无法从工作线程工作,因此您需要将结果图像推入队列并从主线程进行imshow)cv::parallel_for_(cv::Range(0, img.rows * img.cols), [&](const cv::Range& range)
{
for (int r = range.start; r < range.end; r++)
{
int x = r / img.rows;
int y = r % img.rows;
uchar pixelVal = img.at<uchar>(y, x);
//do work here
}
});
我正在使用一些方法: