0

Я столкнулся с проблемой производительности в BeagleBone Black + Opencv Counter. Я использую BackgroundSubtractorMOG2 для вычитания фона и обнаружения контуров. Вот такой код:Счетчик объектов в Opencv + BeagleBone Black Performance Issue

cv::Mat frame; 
cv::Mat resizedFrame; 
cv::Mat back; 
cv::Mat fore; 

bool objStart = false; 
bool objEnd = false; 

bool start = true; 

cv::Point startLine(0, 50); // this is the start of the line where I take decision 
cv::Point endLine(1000, 50); // this is the end of the line 

cv::VideoCapture cap("/home/moonzai/Videos/test.avi"); 
cv::BackgroundSubtractorMOG2 bg; 
bg.set("nmixtures", 3); 
vector<vector<cv::Point> > contours; 

for(;;) 
{ 
    cap >> resizedFrame; 
    cv::resize(resizedFrame, frame, cv::Size(320, 240), 0, 0, cv::INTER_LINEAR); // I wrote this line when there were only 1 frame per second processing, I resized the frame to 320 X 240 
    if(start) 
    { 
     bg.operator()(frame,fore); 
     bg.getBackgroundImage(back); 
     cv::erode(fore,fore,cv::Mat()); 
     cv::dilate(fore,fore,cv::Mat()); 
     cv::findContours(fore,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE); 

     vector<cv::Rect> boundRect(contours.size()); 
     cv::Rect mainRect; 
     for(unsigned int i = 0; i < contours.size(); i++) 
     { 
      boundRect[i] = boundingRect(cv::Mat(contours[i])); 
      if(mainRect.area() < boundRect[i].area()) 
      { 
       mainRect = boundRect[i]; 
      } 

     } 

     if(LineIntersectsRect(startLine, endLine, mainRect)) // this function actually returns boolean, if rectangle is touching the line 
     { 
      objStart = true; 
     } 
     else 
     { 
      if(objStart) 
      { 
       objEnd = true; 
      } 
     } 

     if(objEnd && objStart) 
     { 
      counter ++; 
      cout << "Object: " << counter << endl; 
      objEnd = false; 
      objStart = false; 
     } 
    } 
    usleep(1000 * 33); 
} 

Этот код отлично работает на моем настольном компьютере. но когда я запускаю этот код на BeagleBone Black с установленным Ubuntu 13.04 linux, этот дистрибутив вообще не имеет графического интерфейса, я работаю на терминале, он дает мне 80% ресурсов процессора с 2 кадрами в секунду обработки. Использование памяти очень низкое, около 8%, я не получаю желаемую производительность. поэтому, пожалуйста, направляйте меня, если я делаю что-то неправильно.

Цель моего вопроса: есть ли какая-либо проблема с кодировкой или, BackgroundSubtractorMOG2 - ресурс, голодный, поэтому я должен использовать другой способ. Если есть другой способ, то подскажите мне, что это такое?

заранее спасибо ...

ответ

0

Я думаю, что лучшим вариантом является использование профилировщика (Очень сонный довольно проста в использовании, но достаточно мощный для меня, но я не уверен, есть ли линукс версия) и проверьте, в какой части вашего кода есть проблема - ознакомьтесь с этим обсуждением How can I profile C++ code running in Linux? (принятый ответ может быть не лучшим вариантом в вашей ситуации, поэтому внимательно изучите другие ответы).
Также вы можете просто попытаться уменьшить время сна, оно должно увеличить частоту кадров и использование ЦП.

+0

Что вы подразумеваете под сокращением времени сна? – moonzai

+0

Уменьшить значение здесь: 'usleep (1000 * 33);' – cyriel

+0

Да, я уменьшаю значение, он немного увеличил производительность, но не желателен. является BackgroundSubtractorMOG2 является ресурсом, голодным? – moonzai

0

Производительность приложений C++ сильно зависит от параметров компилятора. Не могли бы вы предоставить параметры gcc, которые использовались для компиляции библиотеки opencv и вашего приложения?

+0

Я просто компилирую свое приложение g ++ 'pkg-config --cflags opencv' object_counter.cpp -o counter' pkg-config -libs opencv' – moonzai

 Смежные вопросы

  • Нет связанных вопросов^_^