#include "IntegralImg.h" namespace icl{ template inline void create_integral_channel_no_border(T *image,int w, int h, I *intImage){ // {{{ open FUNCTION_LOG(""); /* algorithm: +++++.. +++CA.. +++BX.. ....... X = src(x) + A + B - C */ T *src = image; I *dst = intImage; // fist pixel *dst++ = *src++; // fist row for(T *srcEnd=src+w-1;src void fill_integral_image_borders(I *intImage,int w, int h, int iw, int ih, int border){ // {{{ open /******************************* left and top: set to zero right and bottom: "copy replicate border" <-----------------> 00000000000 00000000000 00xxxxxxAAA^ 00xxxxxxBBB| 00xxxxxxFFF| 00abcdqrGGGV 00abcdprGGG 00abcdprGGG ********************************/ //top intImage-=(border+iw*border); memset(intImage,0,border*iw*sizeof(I)); // left and right int bw = border+w; int bw1 =bw-1; int bh = border+h; I bufVal; for(int y=border;y void create_integral_channel_with_border(T *image,int w, int h, I *intImage, int border){ // {{{ open FUNCTION_LOG(""); /* algorithm: +++++.. +++CA.. +++BX.. ....... X = src(x) + A + B - C */ // integral image size const int iw = w+2*border; const int ih = h+2*border; const int offs = border+iw*border; //move to the first integral-image pixel intImage+=offs; T *src = image; I *dst = intImage; // first pixel *dst++ = *src++; // fist row for(T *srcEnd=src+w-1;src void create_integral_channel_with_border(icl8u *image, int w, int h, Ipp32s *intImage, int border){ // {{{ open FUNCTION_LOG(""); // integral image size int iw = w+2*border; int ih = h+2*border; int b1 = border-1; ippiIntegral_8u32s_C1R(image,w*sizeof(icl8u),intImage+b1+b1*iw,iw*sizeof(Ipp32s), Size(w,h),0); intImage+=(border+iw*border); fill_integral_image_borders(intImage,w,h,iw,ih,border); } // }}} template<> void create_integral_channel_with_border(icl8u *image, int w, int h, Ipp32f *intImage, int border){ // {{{ open FUNCTION_LOG(""); // integral image size int iw = w+2*border; int ih = h+2*border; int b1 = border-1; ippiIntegral_8u32f_C1R(image,w*sizeof(icl8u),intImage+b1+b1*iw,iw*sizeof(Ipp32f), Size(w,h),0); intImage+=(border+iw*border); fill_integral_image_borders(intImage,w,h,iw,ih,border); } // }}} #endif template Img *IntegralImg::create(Img *image,unsigned int border, Img *intImage){ // {{{ open ICLASSERT_RETURN_VAL(image, intImage); ICLASSERT_RETURN_VAL(image->getDim(),intImage); ICLASSERT_RETURN_VAL(image->getChannels(),intImage); int w = image->getWidth(); int h = image->getHeight(); Size s(w+2*border,h+2*border); int c = image->getChannels(); if(!intImage){ intImage = new Img(s,c); }else{ intImage->setSize(s); intImage->setChannels(c); } if(!border){ for(int i=0;i(image->getData(i),w,h,intImage->getData(i)); } }else{ for(int i=0;i(image->getData(i),w,h,intImage->getData(i),border); } } return intImage; } // }}} // {{{ explicit template instantiations template Img *IntegralImg::create(Img8u *, unsigned int, Img*); template Img *IntegralImg::create(Img8u *, unsigned int, Img*); template Img *IntegralImg::create(Img32f *, unsigned int, Img*); // }}} }