2014-03-04 48 views
1

我試圖在OpenCV 2.4.8上啓用代碼平行化,出於某種原因,它不起作用。我已經使用WITH_TBB = ONWITH_OPENMP = ON構建了openCV,但由於某些原因,OpenCV仍然沒有爲我的處理過程增加任何提升。OpenCV setNumThreads問題

這裏有人知道發生了什麼事嗎?

更新

int main() { 

InitCounter(); 
vector< vector<Point> > _contours; 
vector<Vec4i> _storage; 
vector<Vec3f> circles; 

VideoCapture capture("30-1.avi"); 
ofstream fout("data.txt"); 

if(!capture.isOpened()) 
return -1; 

//time_t start, end; 
int counter=0; 
int frameCounter=0; 
int frameno=0; 

//clock_t startTime = clock(); 

//time(&start); 

for(;;) 
{ 

    Mat frame, finalFrame; 
    capture >> frame; 

    // double start=CLOCK2(); 

    finalFrame = frame; 

    cvtColor(frame, frame, CV_BGR2GRAY); 

    GaussianBlur(frame, frame, Size(7,7), 1.5, 1.5); 
    threshold(frame, frame, 20, 255, CV_THRESH_BINARY); 

    dilate(frame, frame, Mat(), Point(-1, -1), 2, 1, 1); 
    erode(frame, frame, Mat(), Point(-1, -1), 2, 1, 1); 

    Canny(frame, frame, 20, 20*2, 3); 

    //double dur = CLOCK2()-start; 
    //printf("avg time per frame %f ms. fps %f. frameno = %d\n",avgdur(dur),avgfps(),frameno++); 

    //time(&end); 
    //++counter; 
    //double sec=difftime(end,start); 
    //double fps=counter/sec; 
    //cout<<fps<<endl; 
    //fout << fps<<"\n"; 
    //frameCounter++; 


    vector<Vec3f> circles; 

    findContours(frame,_contours,_storage,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE); 

    vector<vector<Point> > contours_poly(_contours.size()); 
    vector<Rect> boundRect(_contours.size()); 
    vector<Point2f>center(_contours.size()); 
    vector<float>radius(_contours.size()); 

    int temp = 0; 

    for(int i = 0; i < _contours.size(); i++) 
    { 
     if(_contours[i].size() > 100) 
     { 
      approxPolyDP(Mat(_contours[i]), contours_poly[i], 3, true); 
      boundRect[i] = boundingRect(Mat(_contours[i])); 
      minEnclosingCircle((Mat)_contours[i], center[i], radius[i]); 
      temp = i; 
      break; 
     } 
    } 

    //Scalar color2 = Scalar(0, 0,255); 
    //rectangle(finalFrame, boundRect[temp].tl(), boundRect[temp].br(), color2, 2, 7, 0); 

    //fout << avgdur(dur)<<"\n"; 
    //frameCounter++; 

    //if(frameCounter == 3600) 
    //break; 

    //imshow("frame", finalFrame); 
    if(waitKey(1000/120) >= 0) break; 
    //waitKey(1000/120); 
} 

//clock_t ends = clock(); 
//cout << "Running Time : " << (double) (ends - startTime)/CLOCKS_PER_SEC << endl; 

system("pause"); 
} 
+0

嘗試在你的項目的編譯器選項啓用OpenMP。並看看在任務管理器加載CPU核心。 –

+0

Adrey Smorodov。我已經檢查過任務管理器,它只給我的項目創建一個線程。我已經啓用openMP編譯器選項來啓用openMP。你有什麼想法在這裏出了什麼問題? – MSO

回答

1

嘗試運行這段代碼(附加它(主體)到你的程序的開始):

#include "stdafx.h" 
#include <stdio.h> 
#include <omp.h> 

int main(int argc, char* argv[]) 
{ 

#ifdef _OPENMP 
    printf("OpenMP is supported. Supported version is: %4.2f\n",_OPENMP/100.0); 

    int N_PROC = omp_get_num_procs(); // Number of available processors 
    printf("Number of available processors: %d\n",N_PROC); 

    int MAX_THREADS = omp_get_max_threads(); // Numbers of available threads 
    printf("Numbers of available threads: %d\n",MAX_THREADS); 

#else 
    printf("OpenMP is not supported."); 
#endif 

getchar(); 
    return 0; 
} 

是什麼打印?

UPD:並行的手工例子:

void NEDI(Mat& src,Mat &dst,int ZK=1,int MT=6,int ML=3,double BT=16,int BS=16,int SZ=8) 
{ 
    if(src.channels()>1) 
    { 
     vector<Mat> src_arr; 
     cv::split(src,src_arr); 
     Mat tmp; 
     // If openmp supported, then go parallel 
#ifdef _OPENMP 
     // Thread number 
     omp_set_num_threads(3); 
#pragma omp parallel shared(src_arr) private(tmp) 
     {  
      int n=omp_get_thread_num(); // Get number of current thread 
      Nedi_1_Channel(src_arr[n],tmp,ZK,MT,ML,BT,BS,SZ); // Process data for current thread 
      tmp.copyTo(src_arr[n]); 
     }  
#else 
     Nedi_1_Channel(src_arr[0],tmp,ZK,MT,ML,BT,BS,SZ); 
     tmp.copyTo(src_arr[0]); 

     Nedi_1_Channel(src_arr[1],tmp,ZK,MT,ML,BT,BS,SZ); 
     tmp.copyTo(src_arr[1]); 

     Nedi_1_Channel(src_arr[2],tmp,ZK,MT,ML,BT,BS,SZ); 
     tmp.copyTo(src_arr[2]); 
#endif 

     cv::merge(src_arr,dst); 
    }else 
    { 
     Nedi_1_Channel(src,dst,ZK,MT,ML,BT,BS,SZ); 
    } 
} 
+0

程序的輸出是:'支持OpenMP。支持的版本是:2002.03 - 可用處理器數量:8 - 可用線程數:8.'那麼,爲什麼它只是創建1個線程?你想看我的代碼嗎? – MSO

+0

是的,看到一些代碼會很有用。 –

+0

我將用代碼更新主線程; – MSO