【问题标题】:opencv mat scan random time stealingopencv mat扫描随机时间窃取
【发布时间】:2014-12-22 21:46:06
【问题描述】:

我的应用程序是基于 C++ OpenCV 的,它需要通过阈值过滤来检测图像中的对象。由于性能原因,我将图像分成小条。我只扫描我需要的区域。图像为 2400x1800 像素。条带为 1000x50。图像色彩空间是 HSV。由于所需的对象可以是少数几种颜色之一(例如 8 种),我每条运行过滤器 8 次。所以,在应用程序中,我运行了几十次过滤器。

应用程序对时间要求很高。

对于大多数运行,条形过滤器需要

应该在 1-2 毫秒内运行的总运行时间在 50 到 100 毫秒之间,具体取决于 15 毫秒运行的次数。

访问 Mat 并导致时间窃取的代码的核心如下所示:

for i....{  // cols
for j....{    // rows
p1i=img_hsv.at<uchar>(j,i*3+0);  // H 
p2i=img_hsv.at<uchar>(j,i*3+1);  // S
p3i=img_hsv.at<uchar>(j,i*3+2);  // V
}
}

同样,偷窃率随着条带尺寸的增加而增加。我认为这与访问 PC 内存资源有关。我已经尝试更改页面大小,或将代码定义为关键部分,但没有成功。 该应用程序基于 Win32 XP 或 7。

感谢您的帮助。 非常感谢, 哈佛商业评论。

【问题讨论】:

  • 确保您使用的是 opencv 发行版,因为调试中的 Mat::at() 非常慢...

标签: c++ performance opencv time mat


【解决方案1】:

通常不需要单独访问像素以进行过滤操作。您遗漏了算法的细节 - 也许您可以使用像 threshold 和相关的 OpenCV 函数来实现它,这将适用于整个图像。这些方法针对内存访问进行了优化,因此您不必花时间来跟踪此类时间问题。

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2018-11-14
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多