2017-12-13 54 views
0

RGB 이미지를 처리하고 각 채널 (R + G + B)에 대해 동일한 작업을 수행하므로 내 코드를 향상시키고 실행할 수있는 병렬 함수를 찾고있었습니다 (3 *?) 빠릅니다.OpenCV 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 기능을 사용하여 무엇이 잘못되었거나 forEachmulti-threading에서 실행되지 않습니까? multi-threading 번의 계산에 도움이 될만한 자료가 있습니까?

나는이 우분투에 내 코드를 실행 해요 :

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

특정 플랫폼과 같습니다. OpenCV의 어떤 버전입니까? v3.1.0이 설치된 Windows에서는 모든 코어가 완전히 사용됩니다. –

+1

@ DanMašek 리눅스에서 OpenCV 3.3을 사용하고 있습니다. –

답변

2

이미 TBB의 모습을 찍은 적이 있습니까? http://www.jayrambhia.com/blog/opencv-with-tbb

당신이 TBB 다음 단계를 수행 채택하기로 결정하는 경우 :

ON 그냥 플래그 -D WITH_TBB와 OpenCV의 컴파일 사용할 수있는 병렬 컴퓨팅을위한 아파치 라이센스 lib 디렉토리 = parallel_for의 예를 참조 빌딩 블록이다 스레딩 :

1 - TBB를 지원하는 OpenCV를 재생성합니다. 당신이 리눅스 머신으로 실행하는 경우 만 수행

cmake -D CMAKE_BUILD_TYPE = RELEASE -D CMAKE_INSTALL_PREFIX =/usr/지방 -D WITH_TBB =

2 BUILD_TBB = ON ..

ON - 프로그램을 다시 작성 사용 TBB

거기에 대한 답변을 참조하십시오 : Simplest TBB example 가장 최근에 초점을 맞추십시오.

+0

TBB를 활성화하지 않았으므로 지금 할 것입니다. 그냥 플래그로 opencv를 설치 한 다음 내 프로그램을 다시 컴파일해야합니까? 아니면 TBB lib에서 함수를 구현해야합니까? –

+0

답변을 업데이트했습니다. – Doleron