c++ - OpenCV forEach 函数并行访问

标签 c++ multithreading opencv foreach htop

我正在处理 RGB 图像并为每个 channel (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 不应该在 多线程 上运行?你有什么资源可以帮助我进行多线程计算吗?

我在 ubuntu 上用这个运行我的代码:

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

最佳答案

你看过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关注最近的。

关于c++ - OpenCV forEach 函数并行访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47800790/

相关文章:

c++ - 如何使用 DirectX 正确组织 Win32 消息处理?

c++ - 交换整数的代码适用于 C++,但不适用于 C

c++ - 重载 << 运算符以打印 vector 的前 n 个值(不是整个 vector )

c# - 任务<T>排队

c++ - 在 OpenCV 中计算 ROI 内的对象区域

opencv - 使用自定义相机(AruCo)的Unity3D和OpenCV

C++ 安全连接到数据库

java - 条件与对象等待/通知

python - OpenCV VideoCapture仅在5个read()之后更新

c# - 将 Parallel.ForEach 限制为仅 64 个操作