积分图像追踪目标
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了积分图像追踪目标 相关的知识,希望对你有一定的参考价值。
积分
积分是微积分学与数学分析里的一个核心概念。通常分为定积分和不定积分两种。对于一个给定的正实值函数,在一个实数区间上的定积分可以理解为在坐标平面上,由曲线、直线以及轴围成的曲边梯形的面积值(一种确定的实数值)。
1、与直方图比较
在图像处理上积分图是非常有用的,直方图的计算是遍历图像的全部像素并累计每个强度在图像中的次数,但是有一个缺陷:假定要对图像中多个感兴趣的区域计算几个直方图去做识别或者跟踪,这时就耗时了,因此:直方图的优势在于简单,用于单一目标查找和跟踪是比较合适的。
看上面的直方图,就知道直方图的意义了,横坐标就是像素值x,纵坐标就是该像素x出现在图像中的次数,这是一种强度统计。
使用积分图来统计图像感兴趣的区域是一种比直方图更为高效的方法,并且程序应用更为广泛,可用于计算不同大小的窗口图像。实际上,根据积分的定义就可以得出,积分图像是 —> “图像左上方全部像素的累加和”,就这么简单,如果不能理解,一定要细细品味。下图是一个需要追踪的目标,框出的骑车小孩子需要积分图像取值是(D-B-C+A), 这时根据积分定义出来的,能理解否?
A-----------------------B
| |
| |
C-----------------------D
以下为积分图像追踪目标:
// compute integral image
cv::Mat integralImage;
cv::integral(image,integralImage,CV_32S);
int sumInt= integralImage.at<int>(yo+height,xo+width)
-integralImage.at<int>(yo+height,xo)
-integralImage.at<int>(yo,xo+width)
+integralImage.at<int>(yo,xo);
std::cout << sumInt << std::endl;
//CV_32FC1防止溢出
int calc_interate(const char *img) {
Mat src = imread(img, 0);
if (src.empty()) {
cout<<"error : could not find image\\n";
return -1;
}
imshow("input image", src);
//计算积分图
Mat sum = Mat::zeros(src.rows + 1, src.cols + 1, CV_32FC1);
Mat sqsum = Mat::zeros(src.rows + 1, src.cols + 1, CV_32FC1);
integral(src, sum, sqsum);
normalize(sum, sum, 0, 255, NORM_MINMAX, CV_8UC1, Mat());
//显示积分图像
imshow("integral image", sum);
waitKey(0);
return 0;
}
以上是关于积分图像追踪目标 的主要内容,如果未能解决你的问题,请参考以下文章