OpenCV работает медленно - PullRequest
2 голосов
/ 15 мая 2011

У меня установлен OpenCV на vs2010 / win7, однако я вижу поведение, которое не могу понять.

Я новичок в OpenCV, поэтому просто запустите базовую программу для извлечения кадров из aviфайл - затем разделяет этот кадр на одноканальные изображения и генерирует гистограммы для каждого из них (взяты из примера в Интернете).На самом деле все работает нормально, просто крайне медленно.Оказывается, что cvFillConvexPoly на самом деле занимает 10-15 секунд (иногда дольше) для завершения - но когда он в конечном итоге возвращает, это правильно.

Это фрагмент кода, где я вызываю функцию преступника и, как вы можете видетьЯ также попробовал cvFillPoly, который занял столько же времени для завершения.

IplImage* DrawHistogram(CvHistogram *hist, float sX)
{
    float histMax = 0;
    cvGetMinMaxHistValue(hist, 0, &histMax, 0, 0);

    IplImage *imgHist = cvCreateImage(cvSize(256, 64), IPL_DEPTH_8U, 1);
    cvZero(imgHist);

    float histValue = 0;
    float nextValue = 0;
    for (int i = 0; i < ((BINS - 1)*sX); i++)
    {
        histValue = cvQueryHistValue_1D(hist, i);
        nextValue = cvQueryHistValue_1D(hist, i + 1);

        CvPoint p1 = cvPoint(i * sX, 64);
        CvPoint p2 = cvPoint((i + 1) * sX, 64);
        CvPoint p3 = cvPoint((i + 1) * sX, 64 - histValue*(64/histMax));
        CvPoint p4 = cvPoint(i * sX, 64 - histValue*(64/histMax));

        int n = 5;
        CvPoint pts[] = {p1, p2, p3, p4};

        cvFillConvexPoly(imgHist, pts, n, cvScalar(255));
        //cvFillPoly(imgHist, pts, &n, 1,cvScalar(255));
    }

    return imgHist;
}

Любая помощь приветствуется.

Скомпилирована на Win7 x64 с CMake 2.8.2 / VS2010 как 32-битная.Такое же поведение при отладке и при работе в автономном режиме.

Также он работает на 32-битной Ubuntu 10.10, скомпилированной с gcc 4.4.5, где не является проблемой.


Редактировать

Я попытался перекомпилировать с VS2008, и он все еще делает то же самое.Я не понимаю, что заставило бы его работать так медленно - если только это не способ, которым 64-битные окна "эмулируют" 32-битные, который вызывает проблему.

1 Ответ

0 голосов
/ 26 мая 2011

Я могу обнаружить 2 возможные ошибки в вашем коде, оба из которых имеют отношение к границам.Чтение / запись вне границ массива может привести к неожиданному поведению любого рода, поэтому удивительно, что ваши программы не дают сбоя.Может быть, GCC и / или библиотека OpenCV ведут себя по-разному в Ubuntu и Windows, что не приводит к сбою в Ubuntu, но вам определенно следует взглянуть на следующие 2 пункта.

  1. Я предполагаю sX это коэффициент масштабирования?Ваш цикл for должен работать от 0 до (BINS-1) независимо от этого масштабирования, так как вы используете i для индексации своей гистограммы и есть BINS бинов, а не BINS*sX.Пока sX == 1, у вас не будет проблем, но любое другое значение сделает ваш код гистограммы недействительным.Вы уже используете sX в правильном порядке и в декларациях cvPoint.

  2. Согласно документам функции cvFillConvexPoly, n должно быть количество баллов, которое в вашем случае равно 4, а не 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...