#include "iclRegionBasedBlobSearcher.h" #include "iclConverter.h" #include "iclImg.h" #include "iclRegionDetector.h" #include #include #include #include namespace icl{ using namespace std; namespace{ /// struct to use a Size struct as std::map - key std::vector &cat(const std::vector > &src, std::vector &dst){ // {{{ open dst.clear(); for(std::vector >::const_iterator it = src.begin();it!=src.end();++it){ for(std::vector::const_iterator jt = it->begin();jt!= it->end();++jt){ dst.push_back(*jt); } } return dst; } // }}} std::vector &cat(const std::vector > &src, std::vector &dst){ // {{{ open dst.clear(); for(std::vector >::const_iterator it = src.begin();it!=src.end();++it){ for(std::vector::const_iterator jt = it->begin();jt!= it->end();++jt){ dst.push_back(*jt); } } return dst; } // }}} std::vector &cat(const std::vector > &src, std::vector &dst){ // {{{ open dst.clear(); for(std::vector >::const_iterator it = src.begin();it!=src.end();++it){ for(std::vector::const_iterator jt = it->begin();jt!= it->end();++jt){ dst.push_back(*jt); } } return dst; } // }}} std::vector &cat(const std::vector > &src, std::vector &dst){ // {{{ open dst.clear(); for(std::vector >::const_iterator it = src.begin();it!=src.end();++it){ for(std::vector::const_iterator jt = it->begin();jt!= it->end();++jt){ dst.push_back(*jt); } } return dst; } // }}} std::vector &toPOD(const std::vector >&src, std::vector &dst){ // {{{ open dst.clear(); for(unsigned int i=0;i &toPOD(const std::vector &src, std::vector &dst){ // {{{ open dst.clear(); for(unsigned int i=0;i &toPOD(const std::vector &src, std::vector &dst){ // {{{ open dst.clear(); for(unsigned int i=0;i > &toPOD(const std::vector >&src, std::vector > &dst){ // {{{ open dst.clear(); for(unsigned int i=0;i()); for(unsigned int j=0;j > &toPOD(const std::vector >&src, std::vector > &dst){ // {{{ open dst.clear(); for(unsigned int i=0;i()); for(unsigned int j=0;j &toPOD(const std::vector > &src, std::vector &dst){ // {{{ open dst.clear(); for(unsigned int i=0;i &toPOD(const std::vector > &src, std::vector &dst){ // {{{ open dst.clear(); for(unsigned int i=0;i RegionBasedBlobSearcher::getFeatureMaps() const{ // {{{ open std::vector v(m_oFMRF.size()); for(unsigned int i=0;igetLastFM(); } return v; } // }}} const std::vector &RegionBasedBlobSearcher::getCOGs(){ // {{{ open m_oCOGsOut.clear(); for(unsigned int i=0;igetCOG(); Point p(p32.x,p32.y); Point q = p.transform(fac.f1,fac.f2); m_oCOGsOut.push_back(q); // m_oCOGsOut.push_back(m_oInternalData[i]->getCOG().transform(fac.f1,fac.f2)); } return m_oCOGsOut; } // }}} const std::vector &RegionBasedBlobSearcher::getCOGsFloat(){ // {{{ open m_oCOGsFloatOut.clear(); for(unsigned int i=0;igetCOG(); Point32f q = p.transform(fac.f1,fac.f2); m_oCOGsFloatOut.push_back(q); // m_oCOGsOut.push_back(m_oInternalData[i]->getCOG().transform(fac.f1,fac.f2)); } return m_oCOGsFloatOut; } // }}} const std::vector &RegionBasedBlobSearcher::getBoundingBoxes(){ // {{{ open m_oBBsOut.clear(); for(unsigned int i=0;igetBoundingBox().transform(fac.f1,fac.f2)); } return m_oBBsOut; } // }}} const std::vector &RegionBasedBlobSearcher::getPCAInfo(){ // {{{ open m_oPCAInfosOut.clear(); for(unsigned int i=0;igetPCAInfo(); // pcaInfo.len1 = .. TODO adapt to factor (void)fac; m_oPCAInfosOut.push_back(pcaInfo); } return m_oPCAInfosOut; } // }}} const std::vector > &RegionBasedBlobSearcher::getBoundaries(){ // {{{ open m_oBoundariesOut.clear(); for(unsigned int i=0;i &b = m_oInternalData[i]->getBoundary(); m_oBoundariesOut.push_back(std::vector()); std::vector &l = m_oBoundariesOut[i]; for(unsigned int j=0;j &RegionBasedBlobSearcher::getBoundaryLengthsPOD(){ // {{{ open m_oBoundaryLengthsPOD.clear(); for(unsigned int i=0;igetBoundaryLength()); } return m_oBoundaryLengthsPOD; } // }}} const std::vector &RegionBasedBlobSearcher::getFormFactorsPOD(){ // {{{ open m_oFormFactorsPOD.clear(); for(unsigned int i=0;igetFormFactor()); } return m_oFormFactorsPOD; } // }}} const std::vector &RegionBasedBlobSearcher::getRegions(){ // {{{ open return m_oInternalData; } // }}} const std::vector &RegionBasedBlobSearcher::getCOGsPOD(){ // {{{ open getCOGs(); return toPOD(m_oCOGsOut,m_oCOGsOutPOD); } // }}} const std::vector &RegionBasedBlobSearcher::getCOGsFloatPOD(){ // {{{ open getCOGsFloat(); return toPOD(m_oCOGsFloatOut,m_oCOGsFloatOutPOD); } // }}} const std::vector &RegionBasedBlobSearcher::getBoundingBoxesPOD(){ // {{{ open getBoundingBoxes(); return toPOD(m_oBBs,m_oBBsOutPOD); } // }}} const std::vector &RegionBasedBlobSearcher::getPCAInfoPOD(){ // {{{ open getPCAInfo(); return toPOD(m_oPCAInfos,m_oPCAInfosOutPOD); } // }}} const std::vector > &RegionBasedBlobSearcher::getBoundariesPOD(){ // {{{ open getBoundaries(); return toPOD(getBoundaries(),m_oBoundariesPOD); } // }}} Img8u *RegionBasedBlobSearcher::getImage(const Size &size, format fmt, const ImgBase *inputImage){ // {{{ open //map > 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()){ // this does only work if the images have valid timestanps // if(m_poInputImage->getTime() != (*j).second->getTime()){ m_poConverter->apply(inputImage,(*j).second); //} return (*j).second; }else{ Img8u *image = new Img8u(size,fmt); m_poConverter->apply(inputImage,image); ((*i).second)[fmt] = image; return image; } }else{ Img8u *image = new Img8u(size,fmt); m_poConverter->apply(inputImage,image); (m[size])[fmt]=image; return image; } ERROR_LOG("unknown error!"); } // }}} void RegionBasedBlobSearcher::extractRegions(const ImgBase *image){ // {{{ open m_oInternalData.clear(); // std::vector m_oScaleFactors.clear(); // std::vector > const Size &ims = image->getSize(); for(unsigned int i=0;i sizeRange(rf.getSizeRange().minVal, rf.getSizeRange().maxVal); m_poRD->setRestrictions(sizeRange,rf.getValueRange().castTo()); FF factor( (float)(ims.width)/fmc.getSize().width,(float)(ims.height)/fmc.getSize().height); const vector &vecBD = m_poRD->detect(fmc.getFM(getImage(fmc.getSize(),fmc.getFormat(),image))); for(unsigned int i=0;i(&(vecBD[i]))); m_oScaleFactors.push_back(factor); } } } } // }}} /****************************************************************************** void RegionBasedBlobSearcher::extractRegions(){ m_oCenters.clear(); m_oBBs.clear(); m_oRegionPCAInfos.clear(); 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); m_oCenters.push_back(std::vector()); m_oBBs.push_back(std::vector()); m_oPCAInfos.push_back(std::vector()); const vector &vecBD = m_poRD->detect(fm); for(vector::const_iterator it = vecBD.begin();it!= vecBD.end();it++){ const BlobData &bd = *it; if(!rf.needSpecialFeatures()){ Point pos = bd.getCOG(); if(rf.ok(bd.getVal(),pos)){ m_oCenters[i].push_back(pos.transform(facx,facy)); } }else{ Point pos = bd.getCOG(); Rect bb = bd.getBoundingBox(); PCAInfo pca = bd.getPCAInfo(); if(rf.ok(bd.getVal(),pos,bb,pca)){ m_oCenters[i].push_back(pos.transform(facx,facy)); m_oBBs[i].push_back(bb.transform(facx,facy)); m_oPCAInfos[i].push_back(pca); } } } } } ****************************************************************************/ void RegionBasedBlobSearcher::add(FMCreator* fmc, RegionFilter *rf){ // {{{ open m_oFMRF.push_back(Plugin(fmc,rf)); } // }}} void RegionBasedBlobSearcher::remove(FMCreator *fmc, bool release){ // {{{ open for(unsigned int i=0;i