我需要实时处理,但OpenCV的内部功能不提供此功能。我正在做手势识别,它几乎完美地工作,除了产生的输出是非常迟缓和缓慢的事实。我知道这不是因为我的算法而是因为OpenCV的处理时间。有什么办法可以加快速度吗?
Ps:我不想使用IPP库,所以请不要这么做。我需要提高OpenCV本身的性能
答案 0 :(得分:9)
改善图像分析的传统技术:
答案 1 :(得分:0)
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%的代码正在努力工作,而其余时间大部分时间都处于闲置状态。
以下是并行for循环的示例:
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
}
});
如果您的硬件受到限制(即充分利用CPU和/或内存),那么您需要考虑优先处理进程/操作系统性能优化/释放系统资源/升级硬件