文章目录

一、积分图简介

第一个提出 Haar 特征快速计算方法的是 CVPR2001上 的那篇经典论文 ​​《Rapid object detection using a boosted cascade of simple features》​​, Viola 提出了一种利用积分图(integral image)快速计算 Haar 特征的方法, 这个方法使得图像的局部矩形求和 运算的复杂度从 O(MN) 下降到了 O(4)

Haar 特征的计算需要重复计算目标区域的像素值,使用积分图能大大减少计算量,达到实时计算 Haar 特征的目的。简单来说,就是先构造一张“积分图”(integral image),也叫 Summed Area Table,之后任何一个 Haar 矩形特征都可以通过查表的方法(Look Up Table)和有限次简单运算得到,大大减少了运算次数。所以但凡需要重复计算目标区域内像素值和的场合,积分图都能派上用场。下面开始介绍积分图原理,并给出其的几个应用。

积分图原理

图像是由一系列的离散像素点组成, 因此图像的积分其实就是求和. 图像积分图中每个点的值是原图像中该点左上角的所有像素值之和。

​详情理论见​

OpenCV + CPP 系列(卅八)图像积分图_opencv


OpenCV + CPP 系列(卅八)图像积分图_积分图_02

其中矩形大小为:OpenCV + CPP 系列(卅八)图像积分图_积分图_03, OpenCV + CPP 系列(卅八)图像积分图_积分图_04

示例如下图:设原图(左图)像素值为1,则有积分图(右图):

计算:(泥土色区域)9 =( 整块有区域)25 + (紫色区域)4 - (黄色区域)10 - (蓝色区域)10 =

OpenCV + CPP 系列(卅八)图像积分图_积分图_05

OpenCV + CPP 系列(卅八)图像积分图_#pragma_06


OpenCV + CPP 系列(卅八)图像积分图_opencv_07,8 位或浮点数(32f 或 64f)。

OutputArray sum,   整数图像 OpenCV + CPP 系列(卅八)图像积分图_积分图_08,i32 或 f32 或 f64

OutputArray sqsum,   平方像素值的积分图像。(大小同上) f64

OutputArray tilted,   图像旋转 45 度的积分(大小同上) i32 或 f32 或 f64

int sdepth = -1,    

int sqdepth = -1    

)

二、代码演示

头文件 ​​image_feature_all.h​​:声明类与公共函数

#pragma once
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


class ImageFeature {
public:
void integral_demo(Mat& image);

};

主函数​​main.cpp​​调用该类的公共成员函数

#include "image_feature_all.h"



int main(int argc, char** argv) {
const char* img_path = "D:\\Desktop\\jianzhu.jpg";
Mat image = imread(img_path, IMREAD_GRAYSCALE); //灰度图读入
if (image.empty()) {
cout << "图像数据为空,读取文件失败!" << endl;
}
ImageFeature imgfeature;
imgfeature.integral_demo(image);

imshow("image", image);
waitKey(0);
destroyAllWindows();
return 0;
}

源文件 ​​feature_extract.cpp​​:实现类与公共函数

void ImageFeature::integral_demo(Mat& image) {
Mat sum_ii = Mat::zeros(image.rows + 1, image.cols + 1, CV_32FC1);
Mat sqsum_ii = Mat::zeros(image.rows + 1, image.cols + 1, CV_64FC1);

integral(image, sum_ii, sqsum_ii);
Mat iiResult;
normalize(sum_ii, iiResult, 0, 255, NORM_MINMAX, CV_8UC1, Mat());
imshow("iiResult", iiResult);
}

OpenCV + CPP 系列(卅八)图像积分图_#include_09