2013-11-12 2 views
0

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

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

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

TY заранее!

Некоторые Фрагменты кода: MSER ИНИЦИАЛИЗАЦИИ о GUI:

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

функция videoprocessing

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; 
} 
+0

Вы можете использовать некоторые профилирования инструмента (даже основную вершину в командной строке), чтобы получить имя процесса/или функции, которая использует все свои CPU? Кроме того, вы могли бы попытаться отделить задачи обработки изображений (MSER и т. Д.) От основного потока и поместить их в отдельный, чтобы ваш графический интерфейс не блокировал по крайней мере. – sansuiso

+0

Спасибо за подсказку sansuiso, Я установил valgrind и профилировал программу. Результатом анализа является то, что я ожидал. Если бы я понял это правильно, тогда valgrind просто проверил память. Вызываемые функции не используют эти большие суммы. В принципе, это всего лишь использование CPU Power при использовании функции MSER. Инициализация использует 12%, но это была наибольшая сумма. Есть ли ошибка? спасибо! PS: Я не использую резьбовые материалы. Или я? Я не уверен. – Ingeborg

+0

Вы можете использовать valgrind для проверки памяти allc/dealloc, которая может замедлить работу или возможные ошибки в коде MSER (скомпилируйте OpenCV с опцией debug). Помимо valgrind, cachegrind может помочь вам выявить некоторые проблемы с узким местом производительности. Gcc также имеет некоторые параметры профилирования. Что касается резьбонарезки, обычно бывает полезно отключить загрузку вычислительных задач в отдельные потоки. Вы можете попробовать QThread для этого, не так ли? – sansuiso

ответ

1

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

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

Ингеборг