0

我正在处理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查看运行的线程数时,我只发现一两个线程在..

htop

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

我在 ubuntu 上运行我的代码:

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

1 回答 1

2

你已经看过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

在那里查看答案:最简单的 TBB 示例,关注最新的示例。

于 2017-12-14T02:53:54.010 回答