iOS - C/C++ - 加速积分图像计算
Posted
技术标签:
【中文标题】iOS - C/C++ - 加速积分图像计算【英文标题】:iOS - C/C++ - Speed up Integral Image calculation 【发布时间】:2014-01-06 00:25:27 【问题描述】:我有一种方法可以计算计算机视觉应用中常用的积分图像 (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
s 霓虹内在函数,但我不知道具体如何。嵌套循环似乎很慢(至少对于实时应用程序而言)。
有没有人认为这可以使用任何其他技术来加快速度?
【问题讨论】:
这不可能是c++ 和目标c。选择一个。 @Proxy 有个东西叫 Objective-C++ @Proxy。对不起。是的,ios 上的 C/C++(或 Bryan 提到的 Objective-C++)。 @BryanChen 你每天都会学到一些东西... "// 剩余的单元格在上面和左边的总和" :i_data[i*step+j] = rs + i_data[(i-1)*step+j];
我想你也应该减去i_data[(i-1)*step + j -1]
?
【参考方案1】:
您当然可以逐行求和矢量化。那就是 vDSP_vadd()。水平方向是vDSP_vrsum()。
如果您想编写自己的向量代码,水平总和可能会被 psadbw 之类的东西加速,但那是 Intel。另外,看看prefix sum algorithms,它们以可并行化着称。
【讨论】:
以上是关于iOS - C/C++ - 加速积分图像计算的主要内容,如果未能解决你的问题,请参考以下文章