c++ - 当程序在两者之间进入休眠状态时,OpenCV 函数 cv::remap() 的执行时间更长

标签 c++ opencv image-processing execution-time remap

我正在使用 OpenCV 库进行一些图像处理,我发现处理图像所需的时间取决于我在图像处理之间让线程休眠的时间量。我测量了我程序的几个部分的执行时间,我发现如果我让我的线程休眠超过特定时间段,函数 cv::remap() 似乎执行速度慢两倍。

下面是显示奇怪行为的最小代码片段。我测量了执行 cv::remap() 函数所需的时间,然后我将威胁发送到在 sleep_time 中设置的毫秒数后休眠。

#include <opencv2/imgproc.hpp>
#include <thread>
#include <iostream>

int main(int argc, char **argv) {
  cv::Mat src = ... // Init
  cv::Mat dst = ... // Init

  cv::Mat1f map_x = ... // Init;
  cv::Mat1f map_y = ... // Init;

  for (int i = 0; i < 5; i++) {
    auto t1 = std::chrono::system_clock::now();
    cv::remap(src, dst, map_x, map_y, cv::INTER_NEAREST, cv::BORDER_CONSTANT, 0);
    auto t2 = std::chrono::system_clock::now();
    std::chrono::duration<double> elapsed_time = t2 - t1;
    std::cout << "elapsed time = " << elapsed_time.count() * 1e3 << " ms" << std::endl;

    int sleep_time = 0;
    // int sleep_time = 20;
    // int sleep_time = 100;
    std::this_thread::sleep_for( std::chrono::milliseconds(sleep_time));
  }

   return 0;
}

如果 sleep_time 设置为 0,则处理大约需要 5 毫秒。这是输出。

elapsed time = 5.94945 ms
elapsed time = 5.7458 ms
elapsed time = 5.69947 ms
elapsed time = 5.68581 ms
elapsed time = 5.7218 ms

但如果我将sleep_time 设置为 100,则处理速度会慢两倍以上。

elapsed time = 6.09076 ms
elapsed time = 13.2568 ms
elapsed time = 13.4524 ms
elapsed time = 13.3631 ms
elapsed time = 13.3581 ms

我为 sleep_time 尝试了许多不同的值,当 sleep_time 大约是 elapsed_time 的三倍时,执行似乎翻了一番(sleep_time> 3 * elapsed_time)。如果我在函数 cv::remap() 中增加计算的复杂性(例如,增加已处理图像的大小),那么 sleep_time 也可以设置得更高执行前的值开始加倍。

我在带有 ARM 处理器 iMX6 和 Linux 操作系统的嵌入式设备上运行我的程序,但我能够在运行 Ubuntu 16.04 的桌面上重现该问题。我正在使用编译器 arm-angstrom-linux-gnueabi-gcc (GCC) 7.3.0 和 Opencv 版本 3.3.0。

有人知道发生了什么事吗?

最佳答案

这可能是您的 CPU 频率缩放开始起作用。

Linux 上的默认频率调控器通常是“ondemand”,这意味着当 CPU 负载较低时时钟速度按比例降低,并在负载增加时按比例增加。由于此过程需要一些时间,您的短计算突发无法提高时钟速度,并且您的过程有效地运行在比您实际拥有的的 CPU 上。

我已经通过执行在我的机器上测试了这个理论

sudo cpupower frequency-set -g performance

效果立马消失了。要设置调速器,请执行

sudo cpupower frequency-set -g ondemand

关于c++ - 当程序在两者之间进入休眠状态时,OpenCV 函数 cv::remap() 的执行时间更长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52146345/

相关文章:

c++ - 如何避免 std::vector 在(重新)分配时复制?

c++ - 使用带有 --extract-all 的 xgettextt 处理复数

python - 功能无法正常使用(OpenCV Python)

opencv - opencv如何在高斯混合中存储矩阵值?按什么顺序?

python - 检测两张图片之间的变化

jquery - 我可以获取图像并通过ajax加载到div中吗

c++ - C++ 是否保证基引用和派生引用的地址相等?

c++ - 如何将文本文件中的一列数据保存到 C++ 中的数组中?

c++ - 访问opencv中一行的值

python-3.x - 去除图像圆形区域之外的颜色