/*!\brief Calcula las medias y varianzas moviles para la cantidad de movimiento * * @param frameDataStats * @param frameDataOut */ void statsBlobS( STFrame* frameDataOut ){ STFly* flyOut = NULL; valorSum* valor = NULL; if(frameDataOut->Flies->numeroDeElementos == 0 ) return; // si no hay datos del frame, no computar // Obtener el nuevo valor valor = ( valorSum *) malloc( sizeof(valorSum)); valor->sum = sumFrame( frameDataOut ->Flies ); anyadirAlFinal( valor, vectorSumFr ); // Si es el primer elemento, iniciar medias if(vectorSumFr->numeroDeElementos == 1){ iniciarMedias( frameDataOut->Stats, valor->sum ); return; } // movimiento global. Calculo de medias y desviaciones mediaMovil( Coef, vectorSumFr, frameDataOut->Stats ); if( (unsigned)vectorSumFr->numeroDeElementos == Coef->FMax){ valor = (valorSum*)liberarPrimero( vectorSumFr ); free(valor); } }
STFrame* Tracking( STFrame* frameDataIn, int MaxTracks,StaticBGModel* BGModel, int FPS ){ STFrame* frameDataOut = NULL; // frame de salida #ifdef MEDIR_TIEMPOS struct timeval ti,tif; // iniciamos la estructura float tiempoParcial; gettimeofday(&tif, NULL); printf("\n2)Tracking:\n"); gettimeofday(&ti, NULL); printf("\t1)Asignación de identidades\n"); #endif ////////////// AÑADIR AL BUFFER ///////////// anyadirAlFinal( frameDataIn, framesBuf); // MotionTemplate( framesBuf,Identities ); ////////////// ASIGNACIÓN DE IDENTIDADES /////////// //APLICAR EL METODO DE OPTIMIZACION HUNGARO A LA MATRIZ DE PESOS // Asignar identidades. // resolver las asociaciones usando las predicciones de kalman mediante el algoritmo Hungaro // Si varias dan a la misma etiquetarla como 0. Enlazar flies. // Se trabaja en las posiciones frame MAX_BUFFER - 1 y MAX_BUFFER -2. asignarIdentidades( lsTracks,frameDataIn->Flies); ordenarTracks( lsTracks ); #ifdef MEDIR_TIEMPOS tiempoParcial= obtenerTiempo( ti, 0); printf("\t\t-Tiempo: %5.4g ms\n", tiempoParcial); gettimeofday(&ti, NULL); fprintf(stderr,"\t2)Filtro de Kalman\n"); #endif /////////////// ELIMIRAR FALSOS TRACKS. APLICACIÓN DE HEURíSTICAS AL FINAL DEL BUFFER /// frameDataIn->numTracks = validarTracks( framesBuf, lsTracks,Identities, trackParams->MaxBlobs, frameDataIn->num_frame ); /////////////// FILTRO DE KALMAN ////////////// // El filtro de kalman trabaja en la posicion MAX_BUFFER -1. Ultimo elemento anyadido. Kalman( frameDataIn , Identities, lsTracks, trackParams); frameDataIn->Tracks = lsTracks; #ifdef MEDIR_TIEMPOS tiempoParcial= obtenerTiempo( ti, 0); printf("\t\t-Tiempo: %5.4g ms\n", tiempoParcial); #endif /////// FASE DE CORRECCIÓN. APLICACION DE HEURISTICAS AL FRAME DE SALIDA ///////// despertarTrack(framesBuf, lsTracks, Identities ); ordenarTracks( lsTracks ); // SI BUFFER LLENO if( framesBuf->numeroDeElementos == trackParams->MaxBuffer ){ corregirTracks(framesBuf, lsTracks, Identities ); ////////// LIBERAR MEMORIA //////////// frameDataOut = (STFrame*)liberarPrimero( framesBuf ) ; if(!frameDataOut){error(7); exit(1);} VisualizarEl( framesBuf, PENULTIMO, BGModel ); #ifdef MEDIR_TIEMPOS tiempoParcial = obtenerTiempo( tif , NULL); printf("Tracking correcto.Tiempo total %5.4g ms\n", tiempoParcial); #endif return frameDataOut; } else { VerEstadoBuffer( frameDataIn->Frame, framesBuf->numeroDeElementos, trackParams->MaxBuffer); VisualizarEl( framesBuf, PENULTIMO, BGModel ); #ifdef MEDIR_TIEMPOS tiempoParcial = obtenerTiempo( tif , NULL); printf("Tracking correcto.Tiempo total %5.4g ms\n", tiempoParcial); #endif return 0; } }