iOS - C / C++ - 加快积分图像计算
iOS - C/C++ - Speed up Integral Image calculation
我有一种方法可以计算计算机视觉应用中常用的积分图像(此处描述)。
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这样的东西来加速,但那是英特尔。 另外,看看前缀和算法,它们是著名的可并行化算法。
相关文章:
- 计算另一个图像像素满足条件的像素值的平均值
- 使用 ITK 计算图像的中值
- 如何在OpenCV 3.4.7中计算CV_32FC1 cv::GpuMat图像的(范围)直方图
- 如何计算图像中每个块的直方图,然后将它们连接起来?
- 在图像标签上画一条线并计算距离
- 在 GPU 上计算积分图像真的比在 CPU 上更快吗?
- OPENCV:如何使用5点算法从来自不同相机的两个图像之间的特征匹配来计算必需矩阵
- OPENCV(C ) - 从已知的3D对象和相机位置计算图像的2D坐标
- 如何使用opencv函数计算图像的孔数(二进制)
- 如何计算图像的分辨率
- C ++或MATLAB代码来计算图像的类似HAAR的特征
- 如何使用Qimage计算图像中的像素
- 如何计算图像的间距Visual studio
- 计算图像对之间的几何变换
- 如何计算图像像素
- OpencCV:从修改后的直方图计算图像
- OpenCV 标签连接和计算图像区域的特征测量值
- OpenCV - 计算图像的边缘强度
- c++计算图像中每个区域的2 3x3协方差矩阵
- 如何计算图像的渐变