BlobOperators.cpp
Go to the documentation of this file.
00001 #include <limits.h>
00002 #include "hrl_cvblobslib/BlobOperators.h"
00003 
00004 /***************************************************************************
00005   Implementació de les classes per al càlcul de característiques sobre el blob
00006 
00007   Implementation of the helper classes to perform operations on blobs
00008 /**************************************************************************/
00009 
00022 double CBlobGetMoment::operator()(CBlob &blob)
00023 {
00024         return blob.Moment(m_p, m_q);
00025 }
00026 
00054 double CBlobGetHullPerimeter::operator()(CBlob &blob)
00055 {
00056         CvSeq *convexHull;
00057         double perimeter;
00058 
00059         convexHull = blob.GetConvexHull();
00060 
00061         if( convexHull )
00062                 perimeter = fabs(cvArcLength(convexHull,CV_WHOLE_SEQ,1));
00063         else
00064                 return 0;
00065 
00066         cvClearSeq(convexHull);
00067 
00068         return perimeter;
00069 }
00070 
00071 double CBlobGetHullArea::operator()(CBlob &blob)
00072 {
00073         CvSeq *convexHull;
00074         double area;
00075 
00076         convexHull = blob.GetConvexHull();
00077 
00078         if( convexHull )
00079                 area = fabs(cvContourArea(convexHull));
00080         else
00081                 return 0;
00082 
00083         cvClearSeq(convexHull);
00084 
00085         return area;
00086 }
00087 
00098 double CBlobGetMinXatMinY::operator()(CBlob &blob)
00099 {
00100         double result = LONG_MAX;
00101         
00102         CvSeqReader reader;
00103         CvPoint actualPoint;
00104         t_PointList externContour;
00105         
00106         externContour = blob.GetExternalContour()->GetContourPoints();
00107         if( !externContour ) return result;
00108         cvStartReadSeq( externContour, &reader);
00109 
00110         for( int i=0; i< externContour->total; i++)
00111         {
00112                 CV_READ_SEQ_ELEM( actualPoint, reader);
00113 
00114                 if( (actualPoint.y == blob.MinY()) && (actualPoint.x < result) )
00115                 {
00116                         result = actualPoint.x;
00117                 }       
00118         }
00119 
00120         return result;
00121 }
00122 
00133 double CBlobGetMinYatMaxX::operator()(CBlob &blob)
00134 {
00135         double result = LONG_MAX;
00136         
00137         CvSeqReader reader;
00138         CvPoint actualPoint;
00139         t_PointList externContour;
00140         
00141         externContour = blob.GetExternalContour()->GetContourPoints();
00142         if( !externContour ) return result;
00143         cvStartReadSeq( externContour, &reader);
00144 
00145         for( int i=0; i< externContour->total; i++)
00146         {
00147                 CV_READ_SEQ_ELEM( actualPoint, reader);
00148 
00149                 if( (actualPoint.x == blob.MaxX()) && (actualPoint.y < result) )
00150                 {
00151                         result = actualPoint.y;
00152                 }       
00153         }
00154 
00155         return result;
00156 }
00157 
00168 double CBlobGetMaxXatMaxY::operator()(CBlob &blob)
00169 {
00170         double result = LONG_MIN;
00171         
00172         CvSeqReader reader;
00173         CvPoint actualPoint;
00174         t_PointList externContour;
00175         
00176         externContour = blob.GetExternalContour()->GetContourPoints();
00177         if( !externContour ) return result;
00178 
00179         cvStartReadSeq( externContour, &reader);
00180 
00181         for( int i=0; i< externContour->total; i++)
00182         {
00183                 CV_READ_SEQ_ELEM( actualPoint, reader);
00184 
00185                 if( (actualPoint.y == blob.MaxY()) && (actualPoint.x > result) )
00186                 {
00187                         result = actualPoint.x;
00188                 }       
00189         }
00190 
00191         return result;
00192 }
00193 
00204 double CBlobGetMaxYatMinX::operator()(CBlob &blob)
00205 {
00206         double result = LONG_MIN;
00207         
00208         CvSeqReader reader;
00209         CvPoint actualPoint;
00210         t_PointList externContour;
00211         
00212         externContour = blob.GetExternalContour()->GetContourPoints();
00213         if( !externContour ) return result;
00214 
00215         cvStartReadSeq( externContour, &reader);
00216 
00217         
00218         for( int i=0; i< externContour->total; i++)
00219         {
00220                 CV_READ_SEQ_ELEM( actualPoint, reader);
00221 
00222                 if( (actualPoint.x == blob.MinX()) && (actualPoint.y > result) )
00223                 {
00224                         result = actualPoint.y;
00225                 }       
00226         }
00227 
00228         return result;
00229 }
00230 
00231 
00243 double CBlobGetElongation::operator()(CBlob &blob)
00244 {
00245         double ampladaC,longitudC,amplada,longitud;
00246 
00247         double tmp;
00248 
00249         tmp = blob.Perimeter()*blob.Perimeter() - 16*blob.Area();
00250 
00251         if( tmp > 0.0 )
00252                 ampladaC = (double) (blob.Perimeter()+sqrt(tmp))/4;
00253         // error intrínsec en els càlculs de l'àrea i el perímetre 
00254         else
00255                 ampladaC = (double) (blob.Perimeter())/4;
00256 
00257         if(ampladaC<=0.0) return 0;
00258         longitudC=(double) blob.Area()/ampladaC;
00259 
00260         longitud=MAX( longitudC , ampladaC );
00261         amplada=MIN( longitudC , ampladaC );
00262 
00263         return (double) longitud/amplada;
00264 }
00265 
00280 double CBlobGetCompactness::operator()(CBlob &blob)
00281 {
00282         if( blob.Area() != 0.0 )
00283                 return (double) pow(blob.Perimeter(),2)/(4*CV_PI*blob.Area());
00284         else
00285                 return 0.0;
00286 }
00287 
00302 double CBlobGetRoughness::operator()(CBlob &blob)
00303 {
00304         CBlobGetHullPerimeter getHullPerimeter = CBlobGetHullPerimeter();
00305         
00306         double hullPerimeter = getHullPerimeter(blob);
00307 
00308         if( hullPerimeter != 0.0 )
00309                 return blob.Perimeter() / hullPerimeter;//HullPerimeter();
00310 
00311         return 0.0;
00312 }
00313 
00328 double CBlobGetLength::operator()(CBlob &blob)
00329 {
00330         double ampladaC,longitudC;
00331         double tmp;
00332 
00333         tmp = blob.Perimeter()*blob.Perimeter() - 16*blob.Area();
00334 
00335         if( tmp > 0.0 )
00336                 ampladaC = (double) (blob.Perimeter()+sqrt(tmp))/4;
00337         // error intrínsec en els càlculs de l'àrea i el perímetre 
00338         else
00339                 ampladaC = (double) (blob.Perimeter())/4;
00340 
00341         if(ampladaC<=0.0) return 0;
00342         longitudC=(double) blob.Area()/ampladaC;
00343 
00344         return MAX( longitudC , ampladaC );
00345 }
00346 
00361 double CBlobGetBreadth::operator()(CBlob &blob)
00362 {
00363         double ampladaC,longitudC;
00364         double tmp;
00365 
00366         tmp = blob.Perimeter()*blob.Perimeter() - 16*blob.Area();
00367 
00368         if( tmp > 0.0 )
00369                 ampladaC = (double) (blob.Perimeter()+sqrt(tmp))/4;
00370         // error intrínsec en els càlculs de l'àrea i el perímetre 
00371         else
00372                 ampladaC = (double) (blob.Perimeter())/4;
00373 
00374         if(ampladaC<=0.0) return 0;
00375         longitudC = (double) blob.Area()/ampladaC;
00376 
00377         return MIN( longitudC , ampladaC );
00378 }
00379 
00394 double CBlobGetDistanceFromPoint::operator()(CBlob &blob)
00395 {
00396         double xmitjana, ymitjana;
00397         CBlobGetXCenter getXCenter;
00398         CBlobGetYCenter getYCenter;
00399 
00400         xmitjana = m_x - getXCenter( blob );
00401         ymitjana = m_y - getYCenter( blob );
00402 
00403         return sqrt((xmitjana*xmitjana)+(ymitjana*ymitjana));
00404 }
00405 
00418 double CBlobGetXYInside::operator()(CBlob &blob)
00419 {
00420         if( blob.GetExternalContour()->GetContourPoints() )
00421         {
00422                 return cvPointPolygonTest( blob.GetExternalContour()->GetContourPoints(), m_p,0) >= 0;
00423         }
00424 
00425         return 0;
00426 }
00427 #ifdef BLOB_OBJECT_FACTORY
00428 
00443 void RegistraTotsOperadors( t_OperadorBlobFactory &fabricaOperadorsBlob )
00444 {
00445         // blob shape
00446         fabricaOperadorsBlob.Register( CBlobGetArea().GetNom(), Type2Type<CBlobGetArea>());
00447         fabricaOperadorsBlob.Register( CBlobGetBreadth().GetNom(), Type2Type<CBlobGetBreadth>());
00448         fabricaOperadorsBlob.Register( CBlobGetCompactness().GetNom(), Type2Type<CBlobGetCompactness>());
00449         fabricaOperadorsBlob.Register( CBlobGetElongation().GetNom(), Type2Type<CBlobGetElongation>());
00450         fabricaOperadorsBlob.Register( CBlobGetExterior().GetNom(), Type2Type<CBlobGetExterior>());
00451         fabricaOperadorsBlob.Register( CBlobGetLength().GetNom(), Type2Type<CBlobGetLength>());
00452         fabricaOperadorsBlob.Register( CBlobGetPerimeter().GetNom(), Type2Type<CBlobGetPerimeter>());
00453         fabricaOperadorsBlob.Register( CBlobGetRoughness().GetNom(), Type2Type<CBlobGetRoughness>());
00454 
00455         // blob color
00456         fabricaOperadorsBlob.Register( CBlobGetMean(NULL).GetNom(), Type2Type<CBlobGetMean>());
00457         fabricaOperadorsBlob.Register( CBlobGetStdDev(NULL).GetNom(), Type2Type<CBlobGetStdDev>());
00458 
00459         // extern pixels
00460         fabricaOperadorsBlob.Register( CBlobGetExternPerimeterRatio().GetNom(), Type2Type<CBlobGetExternPerimeterRatio>());
00461         fabricaOperadorsBlob.Register( CBlobGetExternHullPerimeterRatio().GetNom(), Type2Type<CBlobGetExternHullPerimeterRatio>());
00462         fabricaOperadorsBlob.Register( CBlobGetExternPerimeter().GetNom(), Type2Type<CBlobGetExternPerimeter>());
00463         
00464 
00465         // hull 
00466         fabricaOperadorsBlob.Register( CBlobGetHullPerimeter().GetNom(), Type2Type<CBlobGetHullPerimeter>());
00467         fabricaOperadorsBlob.Register( CBlobGetHullArea().GetNom(), Type2Type<CBlobGetHullArea>());
00468         
00469 
00470         // elipse info
00471         fabricaOperadorsBlob.Register( CBlobGetMajorAxisLength().GetNom(), Type2Type<CBlobGetMajorAxisLength>());
00472         fabricaOperadorsBlob.Register( CBlobGetMinorAxisLength().GetNom(), Type2Type<CBlobGetMinorAxisLength>());
00473         fabricaOperadorsBlob.Register( CBlobGetAxisRatio().GetNom(), Type2Type<CBlobGetAxisRatio>());
00474         fabricaOperadorsBlob.Register( CBlobGetOrientation().GetNom(), Type2Type<CBlobGetOrientation>());
00475         fabricaOperadorsBlob.Register( CBlobGetOrientationCos().GetNom(), Type2Type<CBlobGetOrientationCos>());
00476         fabricaOperadorsBlob.Register( CBlobGetAreaElipseRatio().GetNom(), Type2Type<CBlobGetAreaElipseRatio>());
00477 
00478         // min an max
00479         fabricaOperadorsBlob.Register( CBlobGetMaxX().GetNom(), Type2Type<CBlobGetMaxX>());
00480         fabricaOperadorsBlob.Register( CBlobGetMaxY().GetNom(), Type2Type<CBlobGetMaxY>());
00481         fabricaOperadorsBlob.Register( CBlobGetMinX().GetNom(), Type2Type<CBlobGetMinX>());
00482         fabricaOperadorsBlob.Register( CBlobGetMinY().GetNom(), Type2Type<CBlobGetMinY>());
00483 
00484         fabricaOperadorsBlob.Register( CBlobGetMaxXatMaxY().GetNom(), Type2Type<CBlobGetMaxXatMaxY>());
00485         fabricaOperadorsBlob.Register( CBlobGetMaxYatMinX().GetNom(), Type2Type<CBlobGetMaxYatMinX>());
00486         fabricaOperadorsBlob.Register( CBlobGetMinXatMinY().GetNom(), Type2Type<CBlobGetMinXatMinY>());
00487         fabricaOperadorsBlob.Register( CBlobGetMinYatMaxX().GetNom(), Type2Type<CBlobGetMinYatMaxX>());
00488 
00489         // coordinate info
00490         fabricaOperadorsBlob.Register( CBlobGetXYInside().GetNom(), Type2Type<CBlobGetXYInside>());
00491         fabricaOperadorsBlob.Register( CBlobGetDiffY().GetNom(), Type2Type<CBlobGetDiffY>());
00492         fabricaOperadorsBlob.Register( CBlobGetDiffX().GetNom(), Type2Type<CBlobGetDiffX>());
00493         fabricaOperadorsBlob.Register( CBlobGetXCenter().GetNom(), Type2Type<CBlobGetXCenter>());
00494         fabricaOperadorsBlob.Register( CBlobGetYCenter().GetNom(), Type2Type<CBlobGetYCenter>());
00495         fabricaOperadorsBlob.Register( CBlobGetDistanceFromPoint().GetNom(), Type2Type<CBlobGetDistanceFromPoint>());
00496 
00497         // moments
00498         fabricaOperadorsBlob.Register( CBlobGetMoment().GetNom(), Type2Type<CBlobGetMoment>());
00499 
00500 }
00501 
00502 #endif  //BLOB_OBJECT_FACTORY


hrl_cvblobslib
Author(s): kelsey
autogenerated on Wed Nov 27 2013 11:32:58