//改进的计算像素灰度值积分图像 //image_Src:灰度图 //image_Integral:image_Src大小相同的CV_32SC1类型 //方法:Integral(y,x) = Integral(y-1,x) + rowSum(y); void CalculateIntegralImage(const Mat &image_Src,Mat &image_Integral) { ////////////step 1.重新分配图像(如果需要)///////////////// //新图像的大小 int width_Dst=image_Src.cols; int height_Dst=image_Src.rows; image_Integral.create(Size(width_Dst,height_Dst),CV_32SC1);//如果重新分配,之前的空间会扔掉 image_Integral.setTo(Scalar(0)); ////////step 2.计算积分图//////////////////////// //参数 int widthStep_Src=image_Src.step1(0);//行的通道数,这里一定要注意!!! int widthStep_Integral=image_Integral.step1(0);//行的通道数 int channelCount_Src=image_Src.step1(1);//每个点的通道数 int channelCount_Integral=image_Integral.step1(1);//每个点的通道数 //第一行 uchar *row_Src=image_Src.data; int *row_Integral=(int *)image_Integral.data;//注意指针的转换 for (int y=0;y<=image_Src.rows-1;++y) { int sum=0;//当前行的累加和 //列 uchar *col_Src=row_Src; int *col_Integral=row_Integral; for (int x=0;x<=image_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-image_Integral.cols);//指针移动 } //下一个像素 col_Src++; col_Integral++; } //下一行 row_Src+=widthStep_Src; row_Integral+=widthStep_Integral; } }
时间: 2024-10-25 18:24:24