У меня проблема времени. Я запрограммировал 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;
}
Вы можете использовать некоторые профилирования инструмента (даже основную вершину в командной строке), чтобы получить имя процесса/или функции, которая использует все свои CPU? Кроме того, вы могли бы попытаться отделить задачи обработки изображений (MSER и т. Д.) От основного потока и поместить их в отдельный, чтобы ваш графический интерфейс не блокировал по крайней мере. – sansuiso
Спасибо за подсказку sansuiso, Я установил valgrind и профилировал программу. Результатом анализа является то, что я ожидал. Если бы я понял это правильно, тогда valgrind просто проверил память. Вызываемые функции не используют эти большие суммы. В принципе, это всего лишь использование CPU Power при использовании функции MSER. Инициализация использует 12%, но это была наибольшая сумма. Есть ли ошибка? спасибо! PS: Я не использую резьбовые материалы. Или я? Я не уверен. – Ingeborg
Вы можете использовать valgrind для проверки памяти allc/dealloc, которая может замедлить работу или возможные ошибки в коде MSER (скомпилируйте OpenCV с опцией debug). Помимо valgrind, cachegrind может помочь вам выявить некоторые проблемы с узким местом производительности. Gcc также имеет некоторые параметры профилирования. Что касается резьбонарезки, обычно бывает полезно отключить загрузку вычислительных задач в отдельные потоки. Вы можете попробовать QThread для этого, не так ли? – sansuiso