【发布时间】:2019-02-08 07:26:07
【问题描述】:
我正在使用 OpenCV 库进行一些图像处理,我发现处理图像所需的时间取决于我在图像处理之间让线程休眠的时间量。我测量了我的程序的几个部分的执行时间,我发现如果我让我的线程休眠超过特定时间段,函数 cv::remap() 似乎执行慢了两倍。
下面是显示奇怪行为的最小代码 sn-p。我测量了执行 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。
有人知道发生了什么吗?
【问题讨论】:
-
如果增加循环迭代次数,它会恢复到更快的计算吗?
-
不,它没有。时间保持不变。
标签: c++ opencv image-processing execution-time remap