• 【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, 3);
        unsigned char *pucImage = (unsigned char*)malloc(pstImage->width * pstImage->height * sizeof(unsigned char));
        unsigned int *puiIntImage = (unsigned int*)malloc((pstImage->width + 1) * (pstImage->height + 1) * sizeof(unsigned int));
    
    
        cvCvtColor(pstImage, pstYUVImage, CV_BGR2YUV);
    
        for(int i = 0; i < pstImage->width * pstImage->height; i++)
        {
            //提取Y分量
            pucImage[i] = pstYUVImage->imageData[i*3];
        }
        
        /* 计算积分图 */
        calcIntImage(pucImage, puiIntImage, pstImage->width, pstImage->height);
    
    
        /* 测试代码,测试是否计算正确 */
        for(int i = 0; i < 5; i++)
        {
            for(int j = 0; j < 5; j++)
            {
                printf("%d ", (int)(pucImage[i*pstImage->width + j]));
            }
            printf("
    ");
        }
        printf("
    ");
        for(int i = 0; i < 6; i++)
        {
            for(int j = 0; j < 6; j++)
            {
                printf("%4d ", (int)(puiIntImage[i*(pstImage->width + 1) + j]));
            }
            printf("
    ");
        }
        /* 测试代码结束 */
    
        cvShowImage("Win", pstImage);
        cvWaitKey(0);
    
        cvReleaseImage(&pstImage);
        cvReleaseImage(&pstYUVImage);
        if(NULL != pucImage)
        {
            free(pucImage);
            pucImage = NULL;
        }
        if(NULL != puiIntImage)
        {
            free(puiIntImage);
            puiIntImage = NULL;
        }
        return 0;
    }
    
    int calcIntImage(unsigned char *pucSrcImage, unsigned int *puiDstImage, int width, int height)
    {
        int i= 0, j = 0, sum = 0;
        int iIntImageWidth = width + 1;
        int iIntImageHeight = height + 1;
        unsigned char *pucSrcImageTmp;
        unsigned int *puiDstImageTmp;
        
        pucSrcImageTmp = pucSrcImage;
    
        /* 存储每列的和 */
        unsigned int *puiImageRow = (unsigned int *)malloc(width * sizeof(unsigned int));
        memset(puiImageRow, 0, width * sizeof(unsigned int));
        puiDstImageTmp = puiDstImage;
    
        /* 积分图第一行清0 */
        memset(puiDstImageTmp, 0, iIntImageWidth);
        puiDstImageTmp += iIntImageWidth;
    
        /* 积分图第一列清0 */
        for(i = 0; i < height; i++)
        {
           *puiDstImageTmp = 0;
           puiDstImageTmp += iIntImageWidth;
        }
    
        puiDstImageTmp = puiDstImage + iIntImageWidth;
        /* 开始计算积分图 */
        for(i = 0; i < height; i++)
        {
            for(j = 0; j < width; j++)
            {
                puiImageRow[j] += pucSrcImageTmp[j];
                puiDstImageTmp[j+1] = puiDstImageTmp[j] + puiImageRow[j];
            }
            puiDstImageTmp += iIntImageWidth;
            pucSrcImageTmp += width;
        }
    
        if(NULL != puiImageRow)
        {
            free(puiImageRow);
            puiImageRow = NULL;
        }
        return 0;
    }

    三、计算结果

    如下图,结果OK~


  • 相关阅读:
    Oracle 11gR2中启动Scott用户的方法
    Oracle 11g服务器安装详细步骤——图文教程(系统 windows server 2012 R2)
    Windows 2012 安装 Oracle 11g 报错:[INS-13001]环境不满足最低要求。
    人民币的单位的大写
    Eclipse 快捷键总结
    Eclipse常用快捷键
    四种Sandcastle方法生成c#.net帮助类帮助文档
    Sandcastle方法生成c#.net帮助类帮助文档chm
    HTML:Input元素标签的详细介绍
    MySQL: 详细的sql语句
  • 原文地址:https://www.cnblogs.com/chenpi/p/5128231.html
Copyright © 2020-2023  润新知