/* - 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 ); }
CBlobResult getBlobs(IplImage* tmp_frame, IplImage* binFore){ //IplImage* binFore = cvCreateImage(cvGetSize(tmp_frame),IPL_DEPTH_8U,1); //get the binary foreground object //cvSub( getBinaryImage(tmp_frame) , binBack, binFore, NULL ); //if(!cvSaveImage("binFore.jpg",binFore)) printf("Could not save the backgroundimage\n"); //!Starting the extracting of Blob CBlobResult blobs; //! get the blobs from the image, with no mask, using a threshold of 100 blobs = CBlobResult( binFore, NULL, 10, true ); //! Create a file with all the found blob blobs.PrintBlobs( "blobs.txt" ); //! discard the blobs with less area than 60 pixels blobs.Filter( blobs, B_INCLUDE, CBlobGetArea(), B_GREATER, 40); //!This two row of code are to filter the blob find from the library by a bug that match ablob like all the image and return the center of it blobs.Filter( blobs, B_INCLUDE, CBlobGetArea(), B_LESS, (tmp_frame->height)*(tmp_frame->width)*0.8); blobs.Filter( blobs, B_INCLUDE, CBlobGetPerimeter(), B_LESS, (tmp_frame->height)+(tmp_frame->width)*2*0.8); //! Create a file with filtered results blobs.PrintBlobs( "filteredBlobs.txt" ); //return blobs; return blobs; }
/** - 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>()); }
SHModel* ShapeModel( CvCapture* g_capture,StaticBGModel* BGModel , BGModelParams* BGParams){ int num_frames = 0; int total_blobs=0; float Sumatorio = 0; float SumatorioDes = 0; IplImage* frame = NULL; STFrame* frameData = NULL; SHModel* Shape = NULL; CBlobResult blobs; CBlob *currentBlob; IplImage* ImGris = cvCreateImage(cvGetSize( BGModel->Imed ), 8, 1 ); IplImage* Imblob = cvCreateImage(cvGetSize( BGModel->Imed ), 8, 3 ); IplImage* lastBG = cvCreateImage( cvGetSize( BGModel->Imed ),8, 1 ); IplImage* lastIdes = cvCreateImage( cvGetSize( BGModel->Imed ), IPL_DEPTH_32F, 1); cvZero(Imblob); // Iniciar estructura para modelo de forma Shape = ( SHModel *) malloc( sizeof( SHModel)); if ( !Shape ) {error(4);return 0;} Shape->FlyAreaDes = 0; Shape->FlyAreaMedia=0; //Pone a 0 los valores del vector areas //EXTRACCION DE LOS BLOBS Y CALCULO DE MEDIANA/MEDIA Y DESVIACION TIPICA PARA TODOS LOS FRAMES cvSetCaptureProperty( g_capture,1,BGParams->initDelay ); // establecemos la posición while( num_frames < ShParams->FramesTraining ){ frame = cvQueryFrame( g_capture ); if ( !frame ) { error(2); break; } if ( (cvWaitKey(10) & 255) == 27 ) break; ImPreProcess( frame, ImGris, BGModel->ImFMask, 0, BGModel->DataFROI); // Cargamos datos del fondo if(!frameData ) { //en la primera iteración iniciamos el modelo dinamico al estático // Iniciar estructura para datos del nuevo frame frameData = InitNewFrameData( frame ); cvCopy( BGModel->Imed,frameData->BGModel); cvSet(frameData->IDesvf, cvScalar(1)); cvCopy( BGModel->Imed,lastBG); } else{ // cargamos los últimos parámetros del fondo. cvCopy( lastBG, frameData->BGModel); cvCopy( lastIdes,frameData->IDesvf ); } // obtener la mascara del FG y la lista con los datos de sus blobs. //// BACKGROUND UPDATE // Actualización del fondo // establecer parametros UpdateBGModel( ImGris,frameData->BGModel,frameData->IDesvf, BGParams, BGModel->DataFROI, BGModel->ImFMask ); /////// BACKGROUND DIFERENCE. Obtención de la máscara del foreground BackgroundDifference( ImGris, frameData->BGModel,frameData->IDesvf, frameData->FG ,BGParams, BGModel->DataFROI); // guardamos las imagenes para iniciar el siguiente frame cvCopy( frameData->BGModel, lastBG); cvCopy( frameData->IDesvf,lastIdes); //Obtener los Blobs y excluir aquellos que no interesan por su tamaño // cvSetImageROI( frameData->FG , BGModel->DataFROI); blobs = CBlobResult( frameData->FG, NULL, 100, true ); blobs.Filter( blobs, B_EXCLUDE, CBlobGetArea(),B_GREATER,100); blobs.Filter( blobs, B_EXCLUDE, CBlobGetPerimeter(),B_GREATER,1000); int j = blobs.GetNumBlobs();//numero de blos encontrados en el frame total_blobs=total_blobs+j; // Contabiliza los blobs encontrados para todos los frames //Recorrer Blob a blob y obtener las caracteristicas del AREA de cada uno de ellos for (int i = 0; i < blobs.GetNumBlobs(); i++ ){ //for 1 currentBlob = blobs.GetBlob(i); CBlobGetArea(); if(ShParams->SHOW_DATA_AREAS) { //printf("Area blob %d = %f ",i,currentBlob->area); } //Estimar la media de las Areas Sumatorio = Sumatorio + currentBlob->area; SumatorioDes = SumatorioDes + currentBlob->area*currentBlob->area; muestrearAreas( currentBlob->area); currentBlob->FillBlob( Imblob, CV_RGB(255,0,0)); }//Fin del For 1 Shape->FlyAreaMedia = Sumatorio / total_blobs; Shape->FlyAreaDes = (SumatorioDes / total_blobs) - Shape->FlyAreaMedia*Shape->FlyAreaMedia; num_frames += 1; // cvResetImageROI(frameData->FG); DraWWindow(Imblob, frameData, BGModel, SHOW_SHAPE_MODELING, COMPLETO); DraWWindow(Imblob, frameData, BGModel, SHAPE,SIMPLE ); } desvanecer( NULL, 20); Shape->FlyAreaDes = sqrt(abs(Shape->FlyAreaDes) ) ; if( Shape->FlyAreaDes == 0){ printf("hola"); } //Mostrar mediana y media para todos los frames if(ShParams->SHOW_DATA_AREAS ) printf("\n MEDIA AREAS: %f \t DESVIACION AREAS: %f",Shape->FlyAreaMedia,Shape->FlyAreaDes); free( ShParams); liberarSTFrame( frameData ); cvReleaseImage( &ImGris); cvReleaseImage( &Imblob); cvReleaseImage( &lastIdes); cvReleaseImage( &lastBG); return Shape; }//Fin de la función ShapeModel2