C ++ Разыменование char-Pointer (массив изображений) очень медленно - PullRequest
0 голосов
/ 09 февраля 2011

У меня возникли проблемы с быстрым доступом к массиву без знака.

Я хочу скопировать массив кодированных изображений BGRABGRA .... BGRABGRA .... и аналогично в OpenCV-версию, которая использует трислои.Приведенный ниже код работает нормально, но очень медленно (около 0,5 секунды для изображения 640 * 480).Я указал, что оператор разыменования * делает это медленно.Есть ли у вас план, как это исправить?(Подсказка: BYTE - беззнаковый символ)

// run thorugh all pixels and copy image data
for (int y = 0; y<imHeight; y++){
    BYTE* pLine= vrIm->mp_buffer + y * vrIm->m_pitch;
    for (int x = 0; x<imWidth; x++){
        BYTE* b= pLine++; // fast pointer operation
        BYTE* g= pLine++;
        BYTE* r= pLine++;
        BYTE* a= pLine++; // (alpha)
        BYTE bc = *b; // this is really slow!
        BYTE gc = *g; // this is really slow!
        BYTE rc = *r; // this is really slow!

    }
}

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

Не должно быть - нет способа, который потребует 0,5 секунды для 640x480, если вы не делаете это на 8086. Есть какой-то другой код, который вы не показываете?Память назначения в настоящее время никуда не денется

ps взгляните на cvCvtColor (), для этого он использует оптимизированные инструкции SSE2 / SIMD

0 голосов
/ 09 февраля 2011

На каком оборудовании находится память, которую вы читаете? Возможно, это устройство имеет ограниченную пропускную способность для используемой памяти или просто имеет медленную оперативную память. Если память совместно используется многими устройствами, на ней также могут быть узкие места. Попробуйте прочитать весь экран (?) В локальной памяти, используя memcpy (), выполнив над ним операции в локальной памяти, а затем записав его обратно, используя memcpy (). Это уменьшит количество раз, когда вы должны договориться о доступе к нему с 640 * 480 до 1.

...