我试图在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