MSER по видеотрекингу

У меня проблема со временем. Я запрограммировал qt Gui для обработки изображений. В этом случае было бы уместно реализовать блобдетекторы для обработки видео и отслеживания объектов. В принципе выглядит хорошо. Он использует графический интерфейс для обработки, захвата, операции mser и отображения всего от 0,07 до 0,08 секунды, что можно использовать для хорошей частоты кадров более 10 кадров в секунду.

Для этих целей я использую Qt 4 - C++, на Suse 12.3. OpenCV 2.4.3 и веб-камера ноутбука. Моя проблема в том, что через некоторое время моя программа зависает.

Глядя на мой системный монитор, я вижу, что мощность процессора достигла 100%, и один запуск использует жесткие ресурсы процессора в течение длительного времени (без графического интерфейса). Я не понимаю, что происходит не так. Есть ли у кого-нибудь опыт с этим?

ТЗ заранее!

Некоторые фрагменты кода: Инициализация MSER о графическом интерфейсе:

MSER FtMSERVid( MSERDelta, MSERMinArea, MSERMaxArea,MSERMaxVariation ,MSERMinDiversity);

функция обработки видео

double startTime = clock();
camDev.read(vidImg);
if(vidImg.empty() == true)
{
    newLineInText(tr("No data from device"));
    timer->stop();
    ui->pbPlay->setText(tr(">"));
    return;
}

MSERPointsVid.clear();
if(vidImg.channels() > 1)
    cvtColor(vidImg, vidImg,CV_BGR2GRAY);
FtMSERVid(vidImg, MSERPointsVid);

Mat showMat = vidImg.clone();
if(showMat.channels() > 1)
{
    cvtColor(showMat,showMat,CV_BGR2RGB);
    qImg = QImage((uchar*)showMat.data,showMat.cols,showMat.rows,showMat.step,QImage::Format_RGB888);
 }
else if(showMat.channels() == 1)
    qImg =   QImage((uchar*)showMat.data,showMat.cols,showMat.rows,showMat.step,QImage::Format_Indexed8);
ui->lblOrig->setPixmap(QPixmap::fromImage(qImg));
double endTime = clock();
double timeDuration = (endTime - startTime)/CLOCKS_PER_SEC;

if(numVid%10 == 0)
{
   framesPS = int(1/timeDuration) - 1;
   if(framesPS > 1)
       framesPS = 1;
   FPSChanged(framesPS);
   numVid = 0;
}

person Ingeborg    schedule 12.11.2013    source источник
comment
Можете ли вы использовать какой-нибудь инструмент профилирования (даже базовый в командной строке), чтобы получить имя процесса/или функции, которая использует весь ваш процессор? Кроме того, вы могли бы попробовать отделить задачи обработки изображений (MSER и т. д.) от основного потока и поместить их в отдельный, чтобы ваш графический интерфейс не блокировался, по крайней мере.   -  person sansuiso    schedule 12.11.2013
comment
Спасибо за подсказку, sansuiso, я установил valgrind и профилировал программу. Результат анализа - это то, что я ожидал. Если я правильно понял, то valgrind только что проверил память. Вызываемые функции не используют это большое количество. В основном это просто количество использования мощности процессора при использовании функции MSER. Инициализация использует 12%, но это самое большое количество. Есть ли ошибка? Благодарность! PS: я не использую потоки. Или я? Я не совсем уверен.   -  person Ingeborg    schedule 12.11.2013
comment
Вы можете использовать valgrind для проверки памяти allc/dealloc, которая может замедлить работу, или возможных ошибок в коде MSER (скомпилируйте OpenCV с параметром отладки). Помимо valgrind, cachegrind может помочь вам обнаружить некоторые узкие места в производительности. Gcc также имеет некоторые параметры профилирования. Что касается многопоточности, обычно рекомендуется разгружать задачи с интенсивными вычислениями в отдельные потоки. Вы можете попробовать QThread для этого, верно?   -  person sansuiso    schedule 12.11.2013
comment
Да, я могу, но я использовал. Я пробовал использовать потоки простым способом std::thread MSERThread(FtMSERVid,ref(vidImgProc),ref(MSERPointsVid)); MSERThread.join();   -  person Ingeborg    schedule 12.11.2013
comment
Еще одна вещь, которую стоит изучить: вы видите то же самое явление без графического интерфейса, когда используете программу командной строки для отслеживания? И, возможно, попробуйте заменить MSER чем-то другим, чтобы увидеть, связана ли какая-то ошибка с MSER.   -  person sansuiso    schedule 13.11.2013
comment
Спасибо за подсказку. У меня была такая же идея сегодня утром. Там это работает очень хорошо. Я показал время продолжительности вызова, которое я обнаружил в первом посте, и все сработало нормально. Программа valgrind показала мне большое количество затрат в основной функции GUI, но не в самом GUI, она сделала затраты в функции exec QApplication. Теперь снова думаю о нитках. Я не уверен, какую функциональность потока (ускорение, Qt,...) я должен использовать.   -  person Ingeborg    schedule 13.11.2013


Ответы (1)


Ваши подсказки помогли мне решить проблему. MSER создает много данных, и я запрограммировал отображение этого второго обновления в таблице, которая работает независимо. Пока нет проблем, но для таблицы слишком много отображать все очки. Таким образом, это было предусмотрено только для заполнения hullpoints в таблице. Я изменил соответствующий вектор, и тогда он работает как ничто другое.

Это я узнал из твоего намека на valgrind. Я никогда не нуждался в этом раньше. Подсказки по многопоточности позволили мне многое узнать о многопоточности. Спасибо вам за это.

Ингеборг

person Ingeborg    schedule 14.11.2013