00001 #include <limits.h>
00002 #include "hrl_cvblobslib/BlobOperators.h"
00003
00004
00005
00006
00007
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
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;
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
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
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
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
00456 fabricaOperadorsBlob.Register( CBlobGetMean(NULL).GetNom(), Type2Type<CBlobGetMean>());
00457 fabricaOperadorsBlob.Register( CBlobGetStdDev(NULL).GetNom(), Type2Type<CBlobGetStdDev>());
00458
00459
00460 fabricaOperadorsBlob.Register( CBlobGetExternPerimeterRatio().GetNom(), Type2Type<CBlobGetExternPerimeterRatio>());
00461 fabricaOperadorsBlob.Register( CBlobGetExternHullPerimeterRatio().GetNom(), Type2Type<CBlobGetExternHullPerimeterRatio>());
00462 fabricaOperadorsBlob.Register( CBlobGetExternPerimeter().GetNom(), Type2Type<CBlobGetExternPerimeter>());
00463
00464
00465
00466 fabricaOperadorsBlob.Register( CBlobGetHullPerimeter().GetNom(), Type2Type<CBlobGetHullPerimeter>());
00467 fabricaOperadorsBlob.Register( CBlobGetHullArea().GetNom(), Type2Type<CBlobGetHullArea>());
00468
00469
00470
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
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
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
00498 fabricaOperadorsBlob.Register( CBlobGetMoment().GetNom(), Type2Type<CBlobGetMoment>());
00499
00500 }
00501
00502 #endif //BLOB_OBJECT_FACTORY