我試圖在OpenCV 2.4.8上啓用代碼平行化,出於某種原因,它不起作用。我已經使用WITH_TBB = ON
和WITH_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");
}
嘗試在你的項目的編譯器選項啓用OpenMP。並看看在任務管理器加載CPU核心。 –
Adrey Smorodov。我已經檢查過任務管理器,它只給我的項目創建一個線程。我已經啓用openMP編譯器選項來啓用openMP。你有什麼想法在這裏出了什麼問題? – MSO