iOS - C / C++ - 加快积分图像计算

iOS - C/C++ - Speed up Integral Image calculation

本文关键字:计算 图像 C++ iOS      更新时间:2023-10-16

我有一种方法可以计算计算机视觉应用中常用的积分图像(此处描述)。

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;
}

我正在努力让它尽快。在我看来,这应该能够利用苹果的Accelerate.framework,或者也许ARM的霓虹灯内在,但我看不出具体如何。似乎嵌套循环可能非常慢(至少对于实时应用程序而言)。

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

您当然可以逐行矢量化求和。即vDSP_vadd()。水平方向为 vDSP_vrsum()。

如果你想编写自己的矢量代码,水平总和可能会通过像psadbw这样的东西来加速,但那是英特尔。 另外,看看前缀和算法,它们是著名的可并行化算法。