#include "RegionBasedBlobSearcher.h" #include "Converter.h" #include "Img.h" #include "ImgRegionDetector.h" #include namespace icl{ using namespace regiondetector; using namespace std; RegionBasedBlobSearcher::RegionBasedBlobSearcher(){ // {{{ open m_poRD = new ImgRegionDetector(0,0,0,0); m_poInputImage = 0; m_poConverter = new Converter; } // }}} RegionBasedBlobSearcher::~RegionBasedBlobSearcher(){ // {{{ open removeAll(); delete m_poRD; } // }}} const Array &RegionBasedBlobSearcher::getCenters(ImgBase *image){ // {{{ open m_poInputImage = image; extractRegions(); unifyRegions(); m_oOutputBuffer.clear(); for(unsigned int i=0;i &RegionBasedBlobSearcher::getBoundingBoxes(ImgBase *image){ // {{{ open m_poInputImage = image; extractRegions(); unifyRegions(); m_oOutputBuffer.clear(); for(unsigned int i=0;i &RegionBasedBlobSearcher::getPCAInfo(ImgBase *image){ // {{{ open m_poInputImage = image; extractRegions(); unifyRegions(); m_oOutputBufferF.clear(); for(unsigned int i=0;i ¢ers, Array &boundingBoxes, Array &pcaInfos){ // {{{ open m_poInputImage = image; extractRegions(); unifyRegions(); centers.clear(); boundingBoxes.clear(); pcaInfos.clear(); for(unsigned int i=0;i > m_mmImages; sizemap &m = m_mmImages; sizemap::iterator i = m.find(size); if(i != m.end()){ fmtmap::iterator j = (*i).second.find(fmt); if(j != (*i).second.end()){ if(m_poInputImage->getTime() != (*j).second->getTime()){ m_poConverter->apply(m_poInputImage,(*j).second); } return (*j).second; }else{ Img8u *image = new Img8u(size,fmt); m_poConverter->apply(m_poInputImage,image); ((*i).second)[fmt] = image; return image; } }else{ Img8u *image = new Img8u(size,fmt); m_poConverter->apply(m_poInputImage,image); (m[size])[fmt]=image; return image; } ERROR_LOG("unknown error!"); } // }}} void RegionBasedBlobSearcher::extractRegions(){ // {{{ open Array cs, bbs; Array vs; Array pca; m_oPoints.clear(); m_oRects.clear(); int x,y; for(unsigned int i=0;isetRestrictions(rf.getMinSize(),rf.getMaxSize(),rf.getMinVal(),rf.getMaxVal()); float facx = (float)(m_poInputImage->getSize().width) / (float)(fmc.getSize().width); float facy = (float)(m_poInputImage->getSize().height) / (float)(fmc.getSize().height); if(rf.needSpecialFeatures()){ m_poRD->detect(fm,cs,vs,bbs,pca); m_oPoints.push_back(Array(vs.size())); m_oRects.push_back(Array(vs.size())); m_oPCA.push_back(pca); for(unsigned int j=0;jdetect(fm,cs,vs); m_oPoints.push_back(Array(vs.size())); m_oRects.push_back(Array()); for(unsigned int j=0;j refcolor, std::vector thresholds, unsigned int minBlobSize, unsigned int maxBlobSize, bool enableSpecialFeatures ){ RegionFilter *rf = RegionFilter::getDefaultRegionFilter(minBlobSize, maxBlobSize, 255, 255, enableSpecialFeatures); add(FMCreator::getDefaultFMCreator(imageSize,imageFormat,refcolor,thresholds,rf)); } // }}} struct DefaultRegionFilter : public RegionFilter{ // {{{ open DefaultRegionFilter(unsigned int minSize, unsigned int maxSize, icl8u minVal, icl8u maxVal, bool specialFeatures){ m_uiMinSize = minSize; m_uiMaxSize = maxSize; m_ucMinVal = minVal; m_ucMaxVal = maxVal; m_bSF = specialFeatures; } unsigned int m_uiMinSize; unsigned int m_uiMaxSize; icl8u m_ucMinVal; icl8u m_ucMaxVal; bool m_bSF; virtual ~DefaultRegionFilter(){} virtual unsigned int getMinSize(){ return m_uiMinSize; } virtual unsigned int getMaxSize(){ return m_uiMaxSize; } virtual icl8u getMinVal(){ return m_ucMinVal; } virtual icl8u getMaxVal(){ return m_ucMaxVal; } virtual bool needSpecialFeatures(){ return m_bSF; } virtual bool ok(icl8u value, int x, int y){ (void)value; (void)x; (void)y; return true; } virtual bool ok(icl8u value, int x, int y, int *bb, icl32f *pca){ (void)value; (void)x; (void)y; (void)bb; (void)pca; return true; } }; // }}} RegionFilter* RegionFilter::getDefaultRegionFilter(unsigned int minSize, // {{{ open unsigned int maxSize, icl8u minVal, icl8u maxVal, bool specialFeaturesEnabled){ return new DefaultRegionFilter(minSize,maxSize,minVal, maxVal, specialFeaturesEnabled); } // }}} struct DefaultFMCreator : public FMCreator{ // {{{ open DefaultFMCreator(const Size &size, format fmt, vector refcolor, vector thresholds, RegionFilter *rf){ m_oSize = size; m_eFormat = fmt; m_vecRefColor = refcolor; m_vecThresholds = thresholds; m_poRF = rf; m_poFM = new Img8u(size,formatMatrix); ICLASSERT_RETURN(refcolor.size() == thresholds.size()); ICLASSERT_RETURN(refcolor.size() > 0); } virtual ~DefaultFMCreator(){ if(m_poRF) delete m_poRF; delete m_poFM; } Size m_oSize; format m_eFormat; vector m_vecRefColor; vector m_vecThresholds; RegionFilter *m_poRF; Img8u *m_poFM; virtual Size getSize(){ return m_oSize; } virtual format getFormat(){ return m_eFormat; } virtual Img8u* getFM(Img8u *image){ ICLASSERT_RETURN_VAL(image && m_poFM , 0); ICLASSERT_RETURN_VAL(image->getChannels() == (int)m_vecRefColor.size() , 0); ICLASSERT_RETURN_VAL(image->getSize() == m_poFM->getSize(), 0); ICLASSERT_RETURN_VAL(image->getSize() == m_oSize, 0); Img8u src = *image; Img8u dst = *m_poFM; int nc = image->getChannels(); icl8u *pucDst = dst.getData(0); // 1 channel int t0 = m_vecThresholds[0]; int r0 = m_vecRefColor[0]; icl8u *pucSrc0 = src.getData(0); icl8u *pucSrc0End = src.getData(0)+m_oSize.getDim(); if(nc == 1){ for(;pucSrc0!=pucSrc0End;++pucSrc0,++pucDst){ *pucDst = 255 * (std::abs(*pucSrc0-r0) vecSrc(nc); for(int i=0;igetData(i); } for(int c=0;pucSrc0!=pucSrc0End;++pucDst,++pucSrc0){ *pucDst = 255 * (std::abs(*pucSrc0-r0) refcolor, vector thresholds, RegionFilter *rf){ return new DefaultFMCreator(size,fmt,refcolor,thresholds,rf); } // }}} }