使用OpenCV获得更好的性能?

时间:2011-10-01 20:11:39

标签: c++ performance video opencv

我需要实时处理,但OpenCV的内部功能不提供此功能。我正在做手势识别,它几乎完美地工作,除了产生的输出是非常迟缓和缓慢的事实。我知道这不是因为我的算法而是因为OpenCV的处理时间。有什么办法可以加快速度吗?

Ps:我不想使用IPP库,所以请不要这么做。我需要提高OpenCV本身的性能

2 个答案:

答案 0 :(得分:9)

改善图像分析的传统技术:

  1. 将图像缩小为单色样本。
  2. 减少样本范围,例如从8位单色到4位单色。
  3. 缩小图像的大小,例如1024x1924到64x64。
  4. 降低帧速率,例如60fps至5fps。
  5. 执行更高级别的功能以猜测目标区域的位置,例如较低的分辨率,然后对裁剪的输出执行常规分析,例如:在确定手势之前执行图像识别以定位手。

答案 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%的代码正在努力工作,而其余时间大部分时间都处于闲置状态。

  • 考虑使用线程将逻辑重组为管道,以便您可以一次处理多个图像(如果要跟踪并需要先前图像的结果,则需要将代码分解为多个部分,例如预处理/分析并使用std :: queue在它们之间进行缓冲,并且imshow在工作线程中无法正常工作,因此您需要将结果图像推送到队列中并从主线程中进行imshow)
  • 考虑将永久性/全局对象用于不需要每次都重新创建的内核/检测器之类的东西
  • 程序运行时间越长,吞吐量是否会降低?您可能需要查看如何处理主循环范围内的图像/变量
  • 在函数中对代码进行分段,使其更具可读性,更易于进行基准测试,并更早地对变量进行范围限定(临时Mat和结果变量在范围限定时释放内存)
  • 如果您要在Mat像素上进行低级处理,从而在图像的大部分区域上进行迭代,请对单个像素使用并行处理,并避免写入
  • 根据代码的运行方式,您可能可以禁用调试以获得更好的性能
  • 如果要流式传输和转储帧,则最好更改摄像机设置以限制流率,而不是转储帧。
  • 如果要将1 12位转换为8位或仅使用图像的某个区域,则最好在相机硬件级别执行此操作

以下是并行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和/或内存),那么您需要考虑优先处理进程/操作系统性能优化/释放系统资源/升级硬件

  • 增加进程的优先级,使其相对于计算机上运行的其他程序(在Linux中,unistd.h在Windows中具有nice(int inc))更加友好,在Windows中的SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS)中。 h)
  • 优化电源设置以总体上获得最佳性能
  • 禁用CPU核心停车
  • 优化采集硬件设置(增加rx / tx缓冲区等)以减轻CPU的工作负担