我有一种方法可以计算计算机视觉应用中常用的整数图像(description here)。
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
的霓虹内在函数,但我无法确切地知道如何。看起来嵌套循环可能非常慢(至少对于实时应用程序而言)。
有谁认为这可以加快使用任何其他技术?
答案 0 :(得分:3)
你当然可以逐行矢量化。那是vDSP_vadd()。水平方向是vDSP_vrsum()。
如果你想编写自己的矢量代码,水平和可能会被像psadbw这样的东西加速,但那就是英特尔。另外,看看prefix sum algorithms,这是着名的可并行化。