【AdaBoost算法】积分图代码实现
一、积分图介绍
定义:图像左上方的像素点值的和;
在Adaboost算法中可用于加速计算Haar或MB-LBP特征值,如下图:
二、代码实现
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <opencv2/imgproc/imgproc_c.h> using namespace cv; int calcIntImage(unsigned char *pucSrcImage, unsigned int *pucDstImage, int width, int height); int main(int argv, char **argc)
{
IplImage *pstImage = cvLoadImage("D:\\test01.JPG", CV_LOAD_IMAGE_COLOR);
IplImage *pstYUVImage = cvCreateImage(cvSize(pstImage->width, pstImage->height), IPL_DEPTH_8U, );
unsigned char *pucImage = (unsigned char*)malloc(pstImage->width * pstImage->height * sizeof(unsigned char));
unsigned int *puiIntImage = (unsigned int*)malloc((pstImage->width + ) * (pstImage->height + ) * sizeof(unsigned int)); cvCvtColor(pstImage, pstYUVImage, CV_BGR2YUV); for(int i = ; i < pstImage->width * pstImage->height; i++)
{
//提取Y分量
pucImage[i] = pstYUVImage->imageData[i*];
} /* 计算积分图 */
calcIntImage(pucImage, puiIntImage, pstImage->width, pstImage->height); /* 测试代码,测试是否计算正确 */
for(int i = ; i < ; i++)
{
for(int j = ; j < ; j++)
{
printf("%d ", (int)(pucImage[i*pstImage->width + j]));
}
printf("\n");
}
printf("\n");
for(int i = ; i < ; i++)
{
for(int j = ; j < ; j++)
{
printf("%4d ", (int)(puiIntImage[i*(pstImage->width + ) + j]));
}
printf("\n");
}
/* 测试代码结束 */ cvShowImage("Win", pstImage);
cvWaitKey(); cvReleaseImage(&pstImage);
cvReleaseImage(&pstYUVImage);
if(NULL != pucImage)
{
free(pucImage);
pucImage = NULL;
}
if(NULL != puiIntImage)
{
free(puiIntImage);
puiIntImage = NULL;
}
return ;
} int calcIntImage(unsigned char *pucSrcImage, unsigned int *puiDstImage, int width, int height)
{
int i= , j = , sum = ;
int iIntImageWidth = width + ;
int iIntImageHeight = height + ;
unsigned char *pucSrcImageTmp;
unsigned int *puiDstImageTmp; pucSrcImageTmp = pucSrcImage; /* 存储每列的和 */
unsigned int *puiImageRow = (unsigned int *)malloc(width * sizeof(unsigned int));
memset(puiImageRow, , width * sizeof(unsigned int));
puiDstImageTmp = puiDstImage; /* 积分图第一行清0 */
memset(puiDstImageTmp, , iIntImageWidth);
puiDstImageTmp += iIntImageWidth; /* 积分图第一列清0 */
for(i = ; i < height; i++)
{
*puiDstImageTmp = ;
puiDstImageTmp += iIntImageWidth;
} puiDstImageTmp = puiDstImage + iIntImageWidth;
/* 开始计算积分图 */
for(i = ; i < height; i++)
{
for(j = ; j < width; j++)
{
puiImageRow[j] += pucSrcImageTmp[j];
puiDstImageTmp[j+] = puiDstImageTmp[j] + puiImageRow[j];
}
puiDstImageTmp += iIntImageWidth;
pucSrcImageTmp += width;
} if(NULL != puiImageRow)
{
free(puiImageRow);
puiImageRow = NULL;
}
return ;
}
三、计算结果
如下图,结果OK~
【AdaBoost算法】积分图代码实现的更多相关文章
- 集成学习值Adaboost算法原理和代码小结(转载)
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...
- 《机器学习实战》AdaBoost算法(手稿+代码)
Adaboost:多个弱分类器组成一个强分类器,按照每个弱分类器的作用大小给予不同的权重 一.Adaboost理论部分 1.1 adaboost运行过程 注释:算法是利用指数函数降低误差,运行过程通过 ...
- 数据挖掘算法学习(八)Adaboost算法
本文不定期更新.原创文章,转载请附上链接http://blog.csdn.net/iemyxie/article/details/40423907 谢谢 Adaboost是一种迭代算法,其核心思想是针 ...
- 浅析人脸检测之Haar分类器方法:Haar特征、积分图、 AdaBoost 、级联
浅析人脸检测之Haar分类器方法 一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸 ...
- 积分图实现均值滤波的CUDA代码
没想到我2010年买的笔记本显卡GT330M 竟然还能跑CUDA,果断小试了一把,环境为CUDA6.5+VS2012,写了一个积分图实现均值滤波.类似于OpenCV的blur()函数. 使用lena. ...
- 04-04 AdaBoost算法代码(鸢尾花分类)
目录 AdaBoost算法代码(鸢尾花分类) 一.导入模块 二.导入数据 三.构造决策边界 四.训练模型 4.1 训练模型(n_e=10, l_r=0.8) 4.2 可视化 4.3 训练模型(n_es ...
- Adaboost算法及其代码实现
. . Adaboost算法及其代码实现 算法概述 AdaBoost(adaptive boosting),即自适应提升算法. Boosting 是一类算法的总称,这类算法的特点是通过训练若干弱分类器 ...
- 【AdaBoost算法】基于OpenCV实现人脸检测Demo
一.关于检测算法 分类器训练: 通过正样本与负样本训练可得到分类器,opencv有编译好的训练Demo,按要求训练即可生成,这里我们直接使用其已经训练好的分类器检测: 检测过程: 检测过程很简单,可以 ...
- Adaboost算法结合Haar-like特征
Adaboost算法结合Haar-like特征 一.Haar-like特征 目前通常使用的Haar-like特征主要包括Paul Viola和Michal Jones在人脸检测中使用的由Papageo ...
随机推荐
- 20款优秀的国外 Mobile App 界面设计案例
在下面给大家分享的移动应用程序界面设计作品中,你可以看到不同创意类型的视觉效果.如果你想获得灵感,那很有必要看看下面20个优秀用户体验的移动应用 UI 设计.想要获取更多的灵感,可以访问移动开发分类, ...
- Hya.io – 基于 Web 的数字音频工作站
Hya.io 是基于 Web 的音频应用程序,通过 Web MIDI ,音频合成器,音序以及大量的插件来支持硬件 MIDI .您可以添加插件到工作区,将其连接到路由音频,进行播放和实验. HYA 支持 ...
- sed用例
文件空行处理 1. 在文件中的每一行后面添加一个空行. sed 'G' test.txt 解释: Get命令是将保留空间的内容取出,并添加到当前模式空间的内容之后(添加一行).当保留空间为空时,效果为 ...
- CentOS6.5菜鸟之旅:VIM插件NERDtree初探
一.介绍 用于浏览目录结构的插件,功能和windows的资源管理器类似. 二.安装过程 1. 下载插件(https://github.com/scrooloose/nerdtree) 2. 将文件复制 ...
- C#调用webservice 时如何传递实体对象
在webservice端公开一个实体类,然后实例化,赋值,然后再给到webservice,可以实现,但是,即使调用端和service端的实体类完全一致,你也要重新实例化service端的,重新赋值,将 ...
- Aspose.Word 操作word表格的行 插入行 添加行
rows.insert或rows.add前row必须有单元格cell private void button3_Click(object sender, EventArgs e) { ...
- 【百度SEO优化】如何让蜘蛛爬行你的网站
大家都知道,现在做网站简单,但是推广就比较困难了,可能一些商家引入投资,直接烧钱做广告来推广,但是对于一些小站长,是没有那么多资金的.因此我们就要懂得一些SEO优化的知识了,简单介绍一下: 怎么让百度 ...
- 【C#进阶系列】03 配置文件管理与程序集的引用版本重定向
先来点与标题不相关的: CLR支持两种程序集:弱命名程序集和强命名程序集. 两者的区别在于强命名程序集使用发布者的公钥和私钥进行签名.由于程序集被唯一性地标识,所以当应用程序绑定到强命名程序集时,CL ...
- 常用 Git 命令清单(摘录)
来源:阮一峰的网络日志 网址:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 我每天使用 Git ,但是很多命令记不住. 一般来 ...
- jquery 拓展
1. 概述 jquery允许拓展自定义的方法, 绑定到$.fn对象上, 编写一个jQuery插件的原则: 给$.fn绑定函数,实现插件的代码逻辑: 插件函数最后要return this;以支持链式调用 ...