【问题标题】:OpenCV forEach function parallel accessOpenCV forEach 函数并行访问
【发布时间】:2017-12-13 19:29:07
【问题描述】:

我正在处理 RGB 图像并对每个通道 (R+G+B) 执行相同的操作,因此我一直在寻找可以帮助我改进代码并运行它的并行函数(3*?)快点。现在我像这样使用forEach 函数:

unsigned char lut[256];
for (int i = 0; i < 256; i++)
    lut[i] = cv::saturate_cast<uchar>(pow((float)(i / 255.0), fGamma) * 255.0f); //pow: power exponent

dst.forEach<cv::Vec3b> //dst is an RGB image
(
    [&lut](cv::Vec3b &pixel, const int* po) -> void
    {
        pixel[0] = lut[(pixel[0])];
        pixel[1] = lut[(pixel[1])];
        pixel[2] = lut[(pixel[2])];
    }
);

但是当我使用htop查看运行的线程数时,我只发现一两个线程在..

是我做错了什么还是forEach 不应该在multi-threading 上运行?你有什么资源可以帮助我进行multi-threading 计算吗?

我在 ubuntu 上运行我的代码:

g++ -std=c++1z -Wall -Ofast -march=native test3.cpp -o test3 `pkg-config --cflags --libs opencv`

【问题讨论】:

  • 似乎特定于平台。什么版本的 OpenCV?在具有 v3.1.0 的 Windows 上,它将完全使用所有内核。
  • @DanMašek 我在 linux 上使用 OpenCV 3.3

标签: c++ multithreading opencv foreach htop


【解决方案1】:

你看过TBB了吗? Threading Building Blocks 是一个 apache 许可的并行计算库,您可以使用它来编译带有标志 -D WITH_TBB=ON

的 OpenCV

查看这个parallel_for的例子:http://www.jayrambhia.com/blog/opencv-with-tbb

如果您决定采用 TBB,请按以下步骤操作:

1 - 使用 TBB 支持重建 OpenCV。如果您正在运行 Linux 机器,请执行以下操作:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON BUILD_TBB=ON ..

2 - 重写你的程序以使用 TBB

在此处查看答案:Simplest TBB example 关注最近的答案。

【讨论】:

  • 我发现我没有激活 TBB,所以我现在就去做。我应该只安装带有标志的opencv然后重新编译我的程序还是需要实现TBB lib中的功能?
猜你喜欢
  • 2018-04-02
  • 2019-11-21
  • 2017-06-26
  • 1970-01-01
  • 2019-02-18
  • 2018-06-08
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多