/** Author: Kanma This heuristic computes the histogram of the region of interest, in RGB format*/#include <mash/heuristic.h>#include <memory.h>#include <assert.h>usingnamespaceMash;/******************************* HISTOGRAM CLASS ******************************///------------------------------------------------------------------------------// Declaration of a histogram class specialized in RGB images//------------------------------------------------------------------------------classRGBHistogram{//_____ Construction / Destruction __________public:RGBHistogram(unsignedintnbBinsPerChannel);~RGBHistogram();//_____ Methods __________public:voidcompute(Image*pImage,unsignedintstart_x,unsignedintstart_y,unsignedintwidth,unsignedintheight,boolbClear=true);voidclear();inlineunsignedint*bins(){return_bins;}inlineunsignedintnbBinsTotal(){return_nbBinsTotal;}//_____ Attributes __________private:unsignedint_nbBinsPerChannel;unsignedint_nbBinsTotal;unsignedint*_bins;unsignedint_lookup[256];};RGBHistogram::RGBHistogram(unsignedintnbBinsPerChannel):_nbBinsPerChannel(nbBinsPerChannel),_nbBinsTotal(nbBinsPerChannel*nbBinsPerChannel*nbBinsPerChannel),_bins(0){// Assertionsassert(nbBinsPerChannel>0);_bins=newunsignedint[_nbBinsTotal];clear();unsignedintbin_size=256/nbBinsPerChannel;for(unsignedinti=0;i<256;++i)_lookup[i]=i/bin_size;}RGBHistogram::~RGBHistogram(){delete[]_bins;}voidRGBHistogram::compute(Image*pImage,unsignedintstart_x,unsignedintstart_y,unsignedintwidth,unsignedintheight,boolbClear){// Assertionsassert(pImage);assert(width>0);assert(height>0);assert(start_x<pImage->width());assert(start_y<pImage->height());assert(width+start_x<=pImage->width());assert(height+start_y<=pImage->height());assert(_nbBinsTotal>0);assert(_bins);if(bClear)clear();RGBPixel_t**pLines=pImage->rgbLines();for(unsignedinty=0;y<height;++y){for(unsignedintx=0;x<width;++x){RGBPixel_tpixel=pLines[start_y+y][start_x+x];unsignedintindex=_lookup[pixel.r]+_lookup[pixel.g]*_nbBinsPerChannel+_lookup[pixel.b]*_nbBinsPerChannel*_nbBinsPerChannel;_bins[index]++;}}}voidRGBHistogram::clear(){// Assertionsassert(_nbBinsTotal>0);assert(_bins);memset(_bins,0,_nbBinsTotal*sizeof(unsignedint));}/******************************* HEURISTIC CLASS ******************************///------------------------------------------------------------------------------// Declaration of the heuristic class//------------------------------------------------------------------------------classRGBHistogramHeuristic:publicHeuristic{//_____ Construction / Destruction __________public:RGBHistogramHeuristic();virtual~RGBHistogramHeuristic();//_____ Implementation of Heuristic __________public:virtualunsignedintdim();virtualvoidprepareForCoordinates();virtualscalar_tcomputeFeature(unsignedintfeature_index);//_____ Attributes __________protected:RGBHistogram_histogram;};//------------------------------------------------------------------------------// Creation function of the heuristic//------------------------------------------------------------------------------extern"C"Heuristic*new_heuristic(){returnnewRGBHistogramHeuristic();}RGBHistogramHeuristic::RGBHistogramHeuristic():_histogram(8){}RGBHistogramHeuristic::~RGBHistogramHeuristic(){}unsignedintRGBHistogramHeuristic::dim(){return_histogram.nbBinsTotal();}voidRGBHistogramHeuristic::prepareForCoordinates(){// Compute the coordinates of the region of interestunsignedintx0=coordinates.x-roi_extent;unsignedinty0=coordinates.y-roi_extent;unsignedintroi_size=roi_extent*2+1;// Compute the histogram_histogram.compute(image,x0,y0,roi_size,roi_size,true);}scalar_tRGBHistogramHeuristic::computeFeature(unsignedintfeature_index){return_histogram.bins()[feature_index];}