文章出處
文章列表
一、積分圖介紹
定義:圖像左上方的像素點值的和;
在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("\n"); } printf("\n"); for(int i = 0; i < 6; i++) { for(int j = 0; j < 6; j++) { printf("%4d ", (int)(puiIntImage[i*(pstImage->width + 1) + j])); } printf("\n"); } /* 測試代碼結束 */ 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~
文章列表
全站熱搜