/* - FUNCTION: PrintBlobs - FUNCTIONALITY: Prints some blob features in an ASCII file - PARAMETERS: - nom_fitxer: full path + filename to generate - RESULT: - RESTRICTIONS: - AUTHOR: Ricard Borràs - CREATION DATE: 25-05-2005. - MODIFICATION: Date. Author. Description. */ void CBlobResult::PrintBlobs( char *nom_fitxer ) const { double_stl_vector area, /*perimetre,*/ exterior, mitjana, compacitat, longitud, externPerimeter, perimetreConvex, perimetre; int i; FILE *fitxer_sortida; area = GetSTLResult( CBlobGetArea()); perimetre = GetSTLResult( CBlobGetPerimeter()); exterior = GetSTLResult( CBlobGetExterior()); mitjana = GetSTLResult( CBlobGetMean()); compacitat = GetSTLResult(CBlobGetCompactness()); longitud = GetSTLResult( CBlobGetLength()); externPerimeter = GetSTLResult( CBlobGetExternPerimeter()); perimetreConvex = GetSTLResult( CBlobGetHullPerimeter()); fitxer_sortida = fopen( nom_fitxer, "w" ); for(i=0; i<GetNumBlobs(); i++) { fprintf( fitxer_sortida, "blob %d ->\t a=%7.0f\t p=%8.2f (%8.2f extern)\t pconvex=%8.2f\t ext=%.0f\t m=%7.2f\t c=%3.2f\t l=%8.2f\n", i, area[i], perimetre[i], externPerimeter[i], perimetreConvex[i], exterior[i], mitjana[i], compacitat[i], longitud[i] ); } fclose( fitxer_sortida ); }
/** - FUNCIÓ: RegistraTotsOperadors - FUNCIONALITAT: Registrar tots els operadors definits a blob.h - PARÀMETRES: - fabricaOperadorsBlob: fàbrica on es registraran els operadors - RESULTAT: - Modifica l'objecte fabricaOperadorsBlob - RESTRICCIONS: - Només es registraran els operadors de blob.h. Si se'n volen afegir, cal afegir-los amb el mètode Register de la fàbrica. - AUTOR: rborras - DATA DE CREACIÓ: 2006/05/18 - MODIFICACIÓ: Data. Autor. Descripció. */ void RegistraTotsOperadors( t_OperadorBlobFactory &fabricaOperadorsBlob ) { // blob shape fabricaOperadorsBlob.Register( CBlobGetArea().GetNom(), Type2Type<CBlobGetArea>()); fabricaOperadorsBlob.Register( CBlobGetBreadth().GetNom(), Type2Type<CBlobGetBreadth>()); fabricaOperadorsBlob.Register( CBlobGetCompactness().GetNom(), Type2Type<CBlobGetCompactness>()); fabricaOperadorsBlob.Register( CBlobGetElongation().GetNom(), Type2Type<CBlobGetElongation>()); fabricaOperadorsBlob.Register( CBlobGetExterior().GetNom(), Type2Type<CBlobGetExterior>()); fabricaOperadorsBlob.Register( CBlobGetLength().GetNom(), Type2Type<CBlobGetLength>()); fabricaOperadorsBlob.Register( CBlobGetPerimeter().GetNom(), Type2Type<CBlobGetPerimeter>()); fabricaOperadorsBlob.Register( CBlobGetRoughness().GetNom(), Type2Type<CBlobGetRoughness>()); // blob color fabricaOperadorsBlob.Register( CBlobGetMean(NULL).GetNom(), Type2Type<CBlobGetMean>()); fabricaOperadorsBlob.Register( CBlobGetStdDev(NULL).GetNom(), Type2Type<CBlobGetStdDev>()); // extern pixels fabricaOperadorsBlob.Register( CBlobGetExternPerimeterRatio().GetNom(), Type2Type<CBlobGetExternPerimeterRatio>()); fabricaOperadorsBlob.Register( CBlobGetExternHullPerimeterRatio().GetNom(), Type2Type<CBlobGetExternHullPerimeterRatio>()); fabricaOperadorsBlob.Register( CBlobGetExternPerimeter().GetNom(), Type2Type<CBlobGetExternPerimeter>()); // hull fabricaOperadorsBlob.Register( CBlobGetHullPerimeter().GetNom(), Type2Type<CBlobGetHullPerimeter>()); fabricaOperadorsBlob.Register( CBlobGetHullArea().GetNom(), Type2Type<CBlobGetHullArea>()); // elipse info fabricaOperadorsBlob.Register( CBlobGetMajorAxisLength().GetNom(), Type2Type<CBlobGetMajorAxisLength>()); fabricaOperadorsBlob.Register( CBlobGetMinorAxisLength().GetNom(), Type2Type<CBlobGetMinorAxisLength>()); fabricaOperadorsBlob.Register( CBlobGetAxisRatio().GetNom(), Type2Type<CBlobGetAxisRatio>()); fabricaOperadorsBlob.Register( CBlobGetOrientation().GetNom(), Type2Type<CBlobGetOrientation>()); fabricaOperadorsBlob.Register( CBlobGetOrientationCos().GetNom(), Type2Type<CBlobGetOrientationCos>()); fabricaOperadorsBlob.Register( CBlobGetAreaElipseRatio().GetNom(), Type2Type<CBlobGetAreaElipseRatio>()); // min an max fabricaOperadorsBlob.Register( CBlobGetMaxX().GetNom(), Type2Type<CBlobGetMaxX>()); fabricaOperadorsBlob.Register( CBlobGetMaxY().GetNom(), Type2Type<CBlobGetMaxY>()); fabricaOperadorsBlob.Register( CBlobGetMinX().GetNom(), Type2Type<CBlobGetMinX>()); fabricaOperadorsBlob.Register( CBlobGetMinY().GetNom(), Type2Type<CBlobGetMinY>()); fabricaOperadorsBlob.Register( CBlobGetMaxXatMaxY().GetNom(), Type2Type<CBlobGetMaxXatMaxY>()); fabricaOperadorsBlob.Register( CBlobGetMaxYatMinX().GetNom(), Type2Type<CBlobGetMaxYatMinX>()); fabricaOperadorsBlob.Register( CBlobGetMinXatMinY().GetNom(), Type2Type<CBlobGetMinXatMinY>()); fabricaOperadorsBlob.Register( CBlobGetMinYatMaxX().GetNom(), Type2Type<CBlobGetMinYatMaxX>()); // coordinate info fabricaOperadorsBlob.Register( CBlobGetXYInside().GetNom(), Type2Type<CBlobGetXYInside>()); fabricaOperadorsBlob.Register( CBlobGetDiffY().GetNom(), Type2Type<CBlobGetDiffY>()); fabricaOperadorsBlob.Register( CBlobGetDiffX().GetNom(), Type2Type<CBlobGetDiffX>()); fabricaOperadorsBlob.Register( CBlobGetXCenter().GetNom(), Type2Type<CBlobGetXCenter>()); fabricaOperadorsBlob.Register( CBlobGetYCenter().GetNom(), Type2Type<CBlobGetYCenter>()); fabricaOperadorsBlob.Register( CBlobGetDistanceFromPoint().GetNom(), Type2Type<CBlobGetDistanceFromPoint>()); // moments fabricaOperadorsBlob.Register( CBlobGetMoment().GetNom(), Type2Type<CBlobGetMoment>()); }
CBlobResult computeWhiteMaskOtsu(Mat& imgRGBin, Mat& imgHSVIn, CBlobResult& blobs, int limitRGB, int limitHSV, double RGBratio, double HSVratio, int bmin, int bmax, int i){ waitKey(30); Mat BGRbands[3]; split(imgRGBin,BGRbands); Mat imgHSV; cvtColor(imgHSVIn,imgHSV,CV_BGR2HSV); Mat HSVbands[3]; split(imgHSV,HSVbands); Mat maskHSV, maskRGB, maskT; int otsuTRGB = getThreshVal_Otsu_8u(BGRbands[2]); do{ threshold(BGRbands[2],maskRGB,otsuTRGB,255,THRESH_BINARY); otsuTRGB++; }while(countNonZero(maskRGB)>(RGBratio*limitRGB) & otsuTRGB<=255); int otsuTHSV = getThreshVal_Otsu_8u(HSVbands[1]); do{ threshold(HSVbands[1],maskHSV,otsuTHSV,255,THRESH_BINARY_INV); otsuTHSV--; }while(countNonZero(maskHSV)>(HSVratio*limitHSV) & otsuTHSV>=0); // 0.1 bitwise_or(maskHSV,maskRGB,maskT); int blobSizeBefore = blobs.GetNumBlobs(); blobs = blobs + CBlobResult( maskT ,Mat(),8); blobs.Filter( blobs, B_EXCLUDE, CBlobGetLength(), B_GREATER, bmax ); blobs.Filter( blobs, B_EXCLUDE, CBlobGetLength(), B_LESS, bmin ); int blobSizeAfter = blobs.GetNumBlobs(); Mat newMask(maskT.size(),maskT.type()); newMask.setTo(0); for(;i<blobs.GetNumBlobs();i++){ double area = blobs.GetBlob(i)->Area(); if(area < 5000 && area > 400) blobs.GetBlob(i)->FillBlob(newMask,CV_RGB(255,255,255),0,0,true); } if(countNonZero(maskRGB)>400 && countNonZero(maskHSV)>400 && blobSizeBefore!=blobSizeAfter){ vector<Mat> BGRbands; split(imgRGBin,BGRbands); Mat maskedRGB = applyMaskBandByBand(newMask,BGRbands); bitwise_not(newMask,newMask); split(imgHSVIn,BGRbands); Mat maskedHSV = applyMaskBandByBand(newMask,BGRbands); blobs = computeWhiteMaskOtsu(maskedRGB, maskedHSV, blobs, countNonZero(maskRGB),countNonZero(maskHSV),RGBratio, HSVratio, bmin, bmax, i-1); } return blobs; }