我正在处理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`
发布于 2017-12-14 10:53:54
你已经看过TBB了吗?线程构建块是一个用于并行计算的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聚焦于最新的问题。
https://stackoverflow.com/questions/47800790
复制相似问题