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.frameworkARMs 霓虹内在函数,但我不知道具体如何。嵌套循环似乎很慢(至少对于实时应用程序而言)。

有没有人认为这可以使用任何其他技术来加快速度?

【问题讨论】:

这不可能是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++ - 加速积分图像计算的主要内容,如果未能解决你的问题,请参考以下文章

积分图像追踪目标

在 GPU 上计算积分图像真的比在 CPU 上更快吗?

[占坑] 图像处理中计算积分图使用类似dp的方法而不用树状数组的原因

matlab加速度积分计算速度和位移

机器视觉中的图像积分图及事实上现

如何加快积分图像的计算?