积分图可以减少不必要的计算,提高计算效率
积分图定义:
积分图计算:
S(x,y) 表示一列的和:
![](https://img-my.csdn.net/uploads/201208/13/1344839897_9380.png)
积分图计算思想:
![](https://img-my.csdn.net/uploads/201208/13/1344840218_5541.png)
先计算每列(行)的值再累加起来。代码如下:
buf = new T[nrow*ncol]; assert(buf!=NULL);
p = new T*[nrow]; assert(p!=NULL);
for(int i=0;i<nrow;i++) p[i] = buf + i * ncol;
//先累加行
CalcIntegralImageInPlace(void)
{
for(int i=1;i<ncol;i++) // process the first line
{
buf[i] += buf[i-1];
}
for(int i=1;i<nrow;i++)
{
REAL partialsum = 0;
T* curp = p[i];//指向当前行
T* prep = p[i-1]; //指向积分图的上一行
for(int j=0;j<ncol;j++)
{
partialsum += REAL(curp[j]);//当前行前j个元素和
curp[j] = prep[j] + partialsum;//当前行前j个元素和 加上 上一个前j个元素和 就(0,0)~(i,j)所有元素的总和
}
}
}
计算子区域:
表达式:
![](https://img-my.csdn.net/uploads/201208/13/1344840161_5401.png)
![](https://img-my.csdn.net/uploads/201208/13/1344840218_5541.png)
计算ABCD矩形内的特征累加和(来源:苏志松,行人检测PPT)
代码:
//计算子区域宽高为<hd,wd>
for(int i=2;i<nrow-2-height;i+=stepsize)
{
double* p1 = p[i];
double* p2 = p[i+hd];
for(int j=2;j<ncol-2-width;j+=stepsize)
p1[j] += (p2[j+wd] - p2[j] - p1[j+wd]);
}