OpenCV可以轻松计算积分图像,只要用一个具有相应名称cvIntegral()的函数。
积分图是一个数据结构,可以实现子区域的快速求和。其中在人脸识别及相关算法中应用的Haar小波拥有显著应用。
积分图像简单来说就是(x,y)点的积分像素时(0,x)和(0,y)的求和。
void cvIntegral(const CvArr * image , CvArr * sum , CvArr * sqsum = NULL , CvArr * titleed_sum = NULL);
参数sum时必要的,一般设为32位浮点型。
如果输入的图像大小是W ✖️ H , 输出图像的大小必是(w+1)✖️ (H+1)
下面看一个《学习OpenCV》第六章练习题14
载入一幅图像,转换成灰度图像,然后得到它的积分图。
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc, const char * argv[]) {
/*1、载入一个图像*/
const char filename[] = "/Users/linwang/Downloads/Lena.jpg";
IplImage * src1 = cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE);
cout<<src1->width<<" -- "<<src1->height<<endl;
/*2、克隆图像*/
IplImage * Iintegral = cvCreateImage(cvSize(src1->width+1,src1->height+1),IPL_DEPTH_32F, src1->nChannels);
/*3、积分图像*/
cvIntegral(src1, Iintegral);
cout<<Iintegral->width<<" -- "<<Iintegral->height<<endl;
/*4、显示结果*/
cvShowImage("Src", src1);
cvShowImage("Dst", Iintegral);
cvWaitKey(0);
cvReleaseImage(&src1);
cvReleaseImage(&Iintegral);
return 0;
}