iphone — iOS — C / ускорить расчет интегрального изображения

У меня есть метод, который рассчитывает интегральное изображение (описание здесь) обычно используется в приложениях компьютерного зрения.

float *Integral(unsigned char *grayscaleSource, int height, int width, int widthStep)
{
// convert the image to single channel 32f
unsigned char *img = grayscaleSource;

// set up variables for data access
int step = widthStep/sizeof(float);
uint8_t *data   = (uint8_t *)img;
float *i_data = (float *)malloc(height * width * sizeof(float));

// first row only
float rs = 0.0f;
for(int j=0; j<width; j++)
{
rs += (float)data[j];
i_data[j] = rs;
}

// remaining cells are sum above and to the left
for(int i=1; i<height; ++i)
{
rs = 0.0f;
for(int j=0; j<width; ++j)
{
rs += data[i*step+j];
i_data[i*step+j] = rs + i_data[(i-1)*step+j];
}
}

// return the integral image
return i_data;
}

Я пытаюсь сделать это как можно быстрее. Мне кажется, что это должно быть в состоянии использовать в своих интересах Apple, Accelerate.frameworkили возможно ARMНеоновые, но я не могу понять, как именно. Похоже, что вложенный цикл потенциально довольно медленный (по крайней мере, для приложений реального времени).

Кто-нибудь думает, что это можно ускорить, используя любые другие методы?

1

Решение

Вы, конечно, можете векторизовать строку суммированием строк. Это vDSP_vadd (). Горизонтальное направление vDSP_vrsum ().

Если вы хотите написать свой собственный векторный код, горизонтальная сумма может быть ускорена чем-то вроде psadbw, но это Intel. Кроме того, взгляните на Алгоритмы префиксной суммы, которые отлично распараллеливаются.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector