예제 #1
0
CPose2D getPataMesa(){

	FILE* file=fopen("patamesa.dat","r");
	CPose2D pataMesa;
	int nDatos(0);

	if(file){
		float x,y;
		// Archivo existe
		fscanf(file,"x:%f,y:%f",&x,&y);
		pataMesa.x(x);
		pataMesa.y(y);

		fclose(file);
	}
	else{
		//Archivo no existe
		file=fopen("patamesa.dat","w");

		for(int i=1;i<21;i++){

			Detector detector;

			char nombre[100];

			sprintf(nombre,"/home/jplata/Eclipse/MedidasPiernas/23Mayo/laser%i.dat",i);
			cout << "Fichero:  " << nombre << endl;

			detector.abrirFichero(nombre,false);

			// Clusteres detectados
			vector<Cluster> piernas=detector.clusterizar(0.1,3);

			detector.printClusters(piernas);

			// El ultimo cluster corresponde a la pata de la mesa en las primeras muestras
			nDatos++;

			pataMesa+=piernas.back().getCentro();

		}

		pataMesa.x(pataMesa.x()/nDatos);
		pataMesa.y(pataMesa.y()/nDatos);

		fprintf(file,"x:%f,y:%f",pataMesa.x(),pataMesa.y());

		fclose(file);

	}

	return pataMesa;

}
예제 #2
0
int main( int argc, const char* argv[] )
{

	vector<double> mx,my,px,py;

	CDisplayWindowPlots medidasPlot("Medidas");
	CDisplayWindowPlots clusterPlot("Cluster");
	CDisplayWindowPlots piernasPlot("Piernas");
	CDisplayWindowPlots personasPlot("Personas");

	vector<CPose2D>* puntos;
	CTicTac timer;

	Detector detector;

	Tracker seguidor;

	bool filtroInicializado=false;



	// Cargar modelo SVM
	struct svm_model *model=svm_load_model("svm_model");
	struct svm_node *instancia;
	double target;

	// datos de cada instancia, 4 en total: 3 carcateristicas más -1 indicando fin
	instancia=Malloc(struct svm_node,4);


	medidasPlot.hold_on();
	double limits[] = {0,2,-2,2};
	vector<double> limites (limits, limits + 4);



	for(int i=0;i<24;i++){

		timer.Tic();

		char nombre[100];

		sprintf(nombre,"/home/jplata/Eclipse/MedidasPiernas/12Julio/200ms/raw_laser%i.dat",i);
		cout << "Fichero:  " << nombre << endl;

		// Comprobar existencia del archivo
		FILE* file=fopen(nombre,"r");

		if(!file){
			cout << "¡¡¡¡Archivo no encontrado!!! Continuar con el siguiente" << endl;
			continue;
		}


		detector.abrirFichero(nombre,false);


		// Medidas
		puntos=detector.getPuntos();


		Eigen::MatrixXf rectas=detector.eliminarRectas(30,181);


		vector<Cluster> piernas=detector.clusterizar(0.1,3);;

		mx.clear();
		my.clear();



		for(unsigned int i=0;i<puntos->size();i++){
			mx.push_back(puntos->at(i).x());
			my.push_back(puntos->at(i).y());
		}

		medidasPlot.clear();
		string fileName(nombre);
		medidasPlot.setWindowTitle("Medidas - " + fileName.substr(fileName.find_last_of("/")+1));
		medidasPlot.plot(mx,my,".b2");

		for(int j=0;j < rectas.rows();j++){

			Grafico::dibujarLinea(&medidasPlot,rectas(j,0),rectas(j,1),limites);

		}


		clusterPlot.clear();
		clusterPlot.setWindowTitle("Cluster - " + fileName.substr(fileName.find_last_of("/")+1));
		clusterPlot.hold_on();

		piernasPlot.clear();
		piernasPlot.setWindowTitle("Piernas - " + fileName.substr(fileName.find_last_of("/")+1));
		piernasPlot.hold_on();

		personasPlot.clear();
		personasPlot.setWindowTitle("Personas - " + fileName.substr(fileName.find_last_of("/")+1));
		personasPlot.hold_on();



		// Obtengo puntos clusters
		string formato[2];
		formato[0]=".r2";
		formato[1]=".b2";
		int f=0;

		for(int j=0;j < piernas.size();j++){


			puntos=piernas[j].getPuntos();
			px.clear();
			py.clear();

			for(unsigned int k=0;k<puntos->size();k++){
				px.push_back(puntos->at(k).x());
				py.push_back(puntos->at(k).y());
			}
			clusterPlot.plot(px,py,formato[f%2]);

			// Determinar si es pierna o no
			instancia[0].index=1;
			instancia[1].index=2;
			instancia[2].index=3;
			instancia[3].index=-1;

			instancia[0].value=piernas[j].getContorno();
			instancia[1].value=piernas[j].getAncho();
			instancia[2].value=piernas[j].getProfundidad();

			target=svm_predict(model,instancia);

			if(target==1){
				// El clasificador SVM lo reconoce como pierna
				piernasPlot.plot(px,py,formato[j%2]);
			}
			else{
				// No es una pierna, lo elimino del vector
				piernas.erase(piernas.begin()+j);
				j--;
			}
			f++;

		}


		vector<CPose2D> personas=detector.buscarPersonas(piernas);
		cout << "Personas detectadas: " << personas.size() << endl;



		detector.printClusters(piernas);
		px.clear();
		py.clear();
		for(int k=0;k < personas.size(); k++){
			px.push_back(personas[k].x());
			py.push_back(personas[k].y());
		}
		piernasPlot.plot(px,py,".c4");
		personasPlot.plot(px,py,".r4");


		// Filtro de Partículas
		if(!filtroInicializado){
			// Filtro no inicializado aún
			// Compruebo si se ha detectado persona
			if(!personas.empty()){
				seguidor.inicializar(50,personas[0]);
				filtroInicializado=true;
				seguidor.drawParticles(&personasPlot);
			}

		}
		else{
			CPose2D objetivo;
			// Filtro ya inicializado
			if(personas.empty()){
				// No se ha detectado persona
				objetivo=seguidor.obtenerPosicionEstimada(CPose2D(),false);
			}
			else{
				objetivo=seguidor.obtenerPosicionEstimada(personas[0],true);
			}
			seguidor.drawParticles(&personasPlot);
			px.clear();
			py.clear();
			px.push_back(objetivo.x());
			py.push_back(objetivo.y());

			personasPlot.plot(px,py,".k8");
		}




		medidasPlot.axis(-0.5,4,-4,4);
		clusterPlot.axis(-0.5,3,-3,3);
		piernasPlot.axis(-0.5,3,-3,3);
		personasPlot.axis(-0.5,3,-3,3);

		cout << "Tiempo total (ms): " << timer.Tac()*1000 << endl;


		cout << "Presione cualquier tecla para pasar a la siguiente muestra" << endl;

		mrpt::system::os::getch();

	}


	//print_vector("%f\t",ancho);



	//plot1.axis(-0.1,0.5,-0.1,0.5);
	//plot2.axis(-0.1,0.5,-0.1,0.5);


	cout << "Presione cualquier tecla para terminar:" << endl;

	mrpt::system::os::getch();


}