积分图的实现
//改进的计算像素灰度值积分图像
//p_w_picpath_Src:灰度图
//p_w_picpath_Integral:p_w_picpath_Src大小相同的CV_32SC1类型
//方法:Integral(y,x) = Integral(y-1,x) + rowSum(y);
void CalculateIntegralImage(const Mat &p_w_picpath_Src,Mat &p_w_picpath_Integral)
{
step 1.重新分配图像(如果需要)/
//新图像的大小
int width_Dst=p_w_picpath_Src.cols;
int height_Dst=p_w_picpath_Src.rows;
p_w_picpath_Integral.create(Size(width_Dst,height_Dst),CV_32SC1);//如果重新分配,之前的空间会扔掉
p_w_picpath_Integral.setTo(Scalar(0));
step 2.计算积分图
//参数
int widthStep_Src=p_w_picpath_Src.step1(0);//行的通道数,这里一定要注意!!!
int widthStep_Integral=p_w_picpath_Integral.step1(0);//行的通道数
int channelCount_Src=p_w_picpath_Src.step1(1);//每个点的通道数
int channelCount_Integral=p_w_picpath_Integral.step1(1);//每个点的通道数
//第一行
uchar *row_Src=p_w_picpath_Src.data;
int *row_Integral=(int *)p_w_picpath_Integral.data;//注意指针的转换
for (int y=0;y<=p_w_picpath_Src.rows-1;++y)
{
int sum=0;//当前行的累加和
//列
uchar *col_Src=row_Src;
int *col_Integral=row_Integral;
for (int x=0;x<=p_w_picpath_Src.cols-1;++x)
{
//该行的累加
sum+=col_Src[0];
//计算第0行,第一行单独处理
if (y==0)
{
col_Integral[0]=sum;
}
else
{
//非第0行
//当前行累加和+同列的上一个元素的值
col_Integral[0]=sum+col_Integral[0-widthStep_Integral];//下标
//col_Integral[0]=sum+*(col_Integral-p_w_picpath_Integral.cols);//指针移动
}
//下一个像素
col_Src++;
col_Integral++;
}
//下一行
row_Src+=widthStep_Src;
row_Integral+=widthStep_Integral;
}
}
转载于:https://blog.51cto.com/qianqing13579/1590221