opencv_C++ integral()函数 积分图计算
目录
- 一、积分图原理
- 二、积分图计算:cv::integral() 函数
- 三、代码示例
- 四、结果
一、积分图原理
在积分图像(Integral Image - ii)上任意位置(x, y)处的ii(x, y)表示该点左上角所有像素之和,表示如下:
从给定图像I从上到下、从左到右计算得到和的积分图像公式如下:
其中(x<0 || y<0) 时ii(x,y)=0, i(x,y)=0
积分图像解释:
如有一块区域像素如下:
图一:
那么其积分图像为左上角像素之和,那么就是:
图二:
得到积分图像之后,图像中任意矩形区域和通过如下公式计算:
矩形区域和:
矩形区域和用图二的积分图像也是使用的:
如:9 + 1 - 3 -3 = 4 正好的是中心的值4。
二、积分图计算:cv::integral() 函数
函数原型C++(程序 / 49):
void cv::integral( inputArray src, OutputArray sum, OutputArray sqsum,
OutputArray titled, int sdepth = -1, int sqdepth = -1 )
src,输入图像 W x H 8位浮点数或者32f,64f;
sum,积分图像为,必须为(W +1)x(H+1),类型为32位或64位浮点数;
sqsum,平方像素值的积分图像,它是 (W +1)x(H+1)双精度64f数组;
titled,旋转45度的图像积分,它与sum相同数据类型;
sdepth,期望的积分深度和倾斜的积分图像,CV_32S,CV_32F或CV_64F;
sqdepth,要求的深度的积分图像的平方像素值,CV_32F或CV_64F。
三、代码示例
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat srcImage = imread("chepai.jpg", 0);
imshow("srcImage", srcImage);
Mat sum = Mat::zeros(srcImage.rows +1, srcImage.cols + 1, CV_32FC1);
Mat sqsum = Mat::zeros(srcImage.rows + 1, srcImage.cols + 1, CV_64FC1);
integral(srcImage, sum, sqsum, CV_32FC1, CV_64FC1);
// 归一化方便显示
Mat result;
normalize(sum, result, 0, 255, NORM_MINMAX, CV_8UC1);
imshow("result", result);
waitKey(0);
return 0;
}
四、结果
结果刚好与积分图的原理一样,右下角值最大:
InvincibleAC: 问一下博主,图片是那本书的内容呢,感觉很不错,想看看学习一下
m0_60918380: 为什么以运行就报0x00007FFAF758CD29 处(位于 Project1.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x000000FAB78FF480 处。
Zoran_卓: 用pthread_setcanceltype这个函数设置取消方式
IDeLoveYou: 那请问有没有什么方法能够直接杀死呢,而不是等待执行到系统调用
CapRogers1: 假设人工智能需要识别这个物体首先需要这个物体的轮廓,扣下来识别。这里需要将挨得很近的角点过滤留下边缘可以形成多边形轮廓的角点。