OpenCV forEach функция параллельного доступа

Я обрабатываю 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`

0

Решение

Вы смотрели в TBB уже? Threading Building Blocks — это лицензированная по Apache библиотека для параллельных вычислений, которую вы можете использовать, просто компилируя OpenCV с флагом -D WITH_TBB = ON

Посмотрите этот пример parallel_for: http://www.jayrambhia.com/blog/opencv-with-tbb

Если вы решили принять TBB, выполните следующие действия:

1 — Перестройте OpenCV с поддержкой TBB. Если вы работаете на машине с Linux, просто выполните:

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

2 — Перепишите свою программу для использования TBB

Смотрите ответы там: Простейший пример TBB сосредоточив внимание на самых последних.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]