Я столкнулся с проблемой производительности в BeagleBone Black + Opencv Object Counter. Я использую BackgroundSubtractorMOG2 для вычитания фона и обнаружения контуров. Вот код ниже:
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 требует много ресурсов, поэтому я должен использовать другой способ. Если есть другой путь, тогда наведите меня, что это за путь?
заранее спасибо…
Я думаю, что лучший вариант — использовать профилировщик (очень сонный довольно прост в использовании, но все еще достаточно мощный для меня, но я не уверен, есть ли версия для Linux) и проверить, в какой части вашего кода есть проблема — взгляните на это обсуждение Как я могу профилировать код C ++, работающий в Linux? (принятый ответ не может быть хорошим вариантом в вашей ситуации, поэтому внимательно посмотрите и на другие ответы).
Также вы можете просто попытаться уменьшить время сна, это должно увеличить частоту кадров и загрузку процессора.
Производительность приложения C ++ сильно зависит от параметров компилятора. Не могли бы вы предоставить опции gcc, которые использовались для компиляции библиотеки opencv и вашего приложения?