Exemplo n.º 1
0
int main()
{
    int c;
    target=imread("../archivos/pozo_real_big.png",CV_32FC3);
    target.convertTo(target,CV_32FC3,1.0/255);

    fuente.initSpectrum(DEFAULT_START_LAMDA,DEFAULT_END_LAMDA,1000);
	fuente.setGausian(1,LAMDA_0,10e-9);
	muestra.initMuestra(163e-6,163e-6,7.030674847e6);
	muestra.setMuestraPlain(1,IN_VISIBILITY);
    muestra.setMuestraFromFile("../archivos/pozo.png",1,IN_DEPTH,0,0);
	if (camara.setSpectrumsFiles("../archivos/r1.dat","../archivos/g1.dat","../archivos/b1.dat")){
        return -1;
	};
    camara.initFPS(1146,1146,30,COLOR);
	interf.initInterferometro(&muestra,&fuente,&camara,camara.exposureTime());




    srand ( time(NULL) );
	ag.PoblacionAleatoria(10,nBytes); //creo una poblacion de 200 individuos, de longitud 'nBytes' cada string
	ag.FuncionEvaluacion(eval); //defino cual es la funcion que evalua cada cromosoma y devuelve el fitnes entre 0 y 1 (Es llamada automaticamante por al AG
    ag.dTasaMutacion = 0.05; //tasa de mutacion de 0 a 1
    CLASECromosoma *ap,alfa,beta;

    while(1) {
         imshow("target",target);
        c = cvWaitKey(2);
        if ((char)c==27){
            break;
        }
    }
    printf("comienza\n");
    do {
 		ag.Generacion(); //creo una nueva generacion de individuos
    	ap = ag.SeleccionarMejor();
        if (!(ag.Edad()%1)) {//cada 500 iteraciones muestre la mejor solucion
            printf ("\n[%d] ",(int)ag.Edad());
            printf ("Best: %.3f\tPob:%.3f",ap->Fitness(),ag.Fitness());
            imshow("eval",getImg(ap->Cromosoma));
        }
        c = cvWaitKey(2);
        if ((char)c==27){
            break;
        }
    } while (ap->Fitness()<0.9 && (ag.Edad()<10000)); //condicion de parada el fitness de la mejor solucion
    printf ("\n\tGen: %d",(int)ag.Edad()); //imprimo la edad de la poblacion: numero de iteraciones totales ejecutadas (generaciones)
    for (;;) {
        c = cvWaitKey(2);
        if ((char)c==27){
            break;
        }
    }
    return 0;
}
Exemplo n.º 2
0
int main(){

    //clock_t begin,end;
	Mat img ;
	int c;
    Spectrum fuente;
    fuente.initSpectrum(1e-9,1001e-9,1001);
    //fuente.initSpectrum(DEFAULT_START_LAMDA,DEFAULT_END_LAMDA,10000);
    //fuente.setPlain(0.5e-9,1000e-9,2);        //Fuente plana todo el espectro
    double lamda=546e-9;
	fuente.setGausian(20,lamda,1e-9);       //Fuente Lab con Filtro Expectral
	//fuente.setDelta(200,lamda,0);       //Fuente Lab con Filtro Expectral
	//fuente.setDelta(10,632.8e-9,0);           //Laser He-Ne
	//fuente.setBlackbody(3000,1.18);


	Camara camara;
	Muestra muestra;
	//camara.initCamara(30,1/30,COLOR);

	//Pozo
/*
	muestra.initMuestra(163e-6,163e-6,7.030674847e6);
	muestra.setMuestraFromFile("../archivos/pozo.png",2.75e-6,IN_DEPTH,0,0);
	muestra.setMuestraPlain(1,IN_VISIBILITY);

*/
//Plano
	muestra.initMuestra(5e-3,5.e-3,100e3);
	muestra.setMuestraPlain(0,IN_DEPTH);
	muestra.setMuestraPlain(1,IN_VISIBILITY);


//	camara.initFPS(1146,1146,30,COLOR); //Pozo
	camara.initFPS(300,300,60,COLOR); //Plano
	if (camara.setSpectrumsFiles("../archivos/r1.dat","../archivos/g1.dat","../archivos/b1.dat")){
        return -1;
	};
    //camara.gain=2;
    camara.setChannelGain(1.5,1,1.392);


/*----------------------INICIO SOLO IMAGEN------------------------------*/
    //float fps=camara.fps();
    float exposureTime=camara.exposureTime();
	float timeStep=exposureTime/EXPOSURE_STEP;
    float notExposureTime=camara.getNotIntegrationTime();


	Interferometro interf;
	interf.initInterferometro(&muestra,&fuente,&camara,timeStep);
    interf.inclinacionX=1e-6;
    interf.inclinacionY=0e-6;
    float step=(lamda/2);
    float copt=0;
    namedWindow("simulador",CV_WINDOW_NORMAL | CV_WINDOW_KEEPRATIO |CV_GUI_EXPANDED);
    bool dibuja=true;
    //interf.getInterferograma(copt);
    //imshow( "simulador", interf.valores);
    Mat imgw;
    string filename;
    Ruido ruido;


    float rAmp=(00.0*M_PI/180.0)*(lamda/2.0)/(M_PI*2.0);
    //ruido.initRuido("../archivos/ruido2.txt",rAmp,1);
//    float rFreq=1;
    Mat im[5];
    Mat num,den,cosa;
    int imagen=0;
    float alpha;
    float fase;
    bool toma=false;
    int pasos=36;
    int veces=2;
    int p,v;
    float pi,dp;
    dp=10;
    pi=10;
    p=0;
    v=0;
    bool corre=false;
    bool video=false;
    char filename2[50];

    double tstep=interf.timeStep();
    double t=tstep;
    double tiempo=tstep;
    double ta=0;
    double r;
    int j=0;
   // bool exporta=false;
    while(1){

        c = cvWaitKey(2);
        if (c!=-1){

            cout << "c = "<<(int)((char)c)<<endl;
            switch ((char)c){
                case 81: //Izquierda
                    interf.inclinacionX-=step;
                    dibuja=true;
                  //  cout <<"incl(X,Y) = ("<<interf.inclinacionX << " , "<< interf.inclinacionY <<")"<<endl;
                    break;
                case 82: //Arriba
                    interf.inclinacionY+=step;
                    dibuja=true;
                    //cout <<"incl(X,Y) = ("<<interf.inclinacionX << " , "<< interf.inclinacionY <<")"<<endl;
                    break;
                case 83: //derecha
                    interf.inclinacionX+=step;
                    dibuja=true;
                    //cout <<"incl(X,Y) = ("<<interf.inclinacionX << " , "<< interf.inclinacionY <<")"<<endl;
                    break;
                case 84: //abajo
                    interf.inclinacionY-=step;
                    dibuja=true;
                    //cout <<"incl(X,Y) = ("<<interf.inclinacionX << " , "<< interf.inclinacionY <<")"<<endl;
                    break;
                case -85: //+
                    step+=1e-9;
                    cout<<"Step = "<<step<<endl;
                    break;
                case -83: //-
                    step-=1e-9;
                    cout<<"Step = "<<step<<endl;
                    break;
                case 114:   //R
                    step=10e-9;
                    dibuja=true;
                    interf.inclinacionX=6.1e-7;
                    interf.inclinacionY=-1.775e-6;
                    muestra.resDepth=3.375e-6;
                    camara.gain=4;
                    camara.offset=-0.1;
                    copt=-2.75e-7;
                    rAmp=9e-8;
                    //cout<<"Step = "<<step<<endl;
                    break;
        //Depth
                case 103:   //G
                    muestra.resDepth+=step;
                    dibuja=true;
                    break;
                case 98:    //B
                    muestra.resDepth-=step;
                    dibuja=true;
                    break;
        //Ganancia
                case 102:   //F
                    camara.gain+=0.1;
                    dibuja=true;
                    break;
                case 118:    //V
                    camara.gain-=0.1;
                    dibuja=true;
                    break;

        //Camino Optico
                case 97:   //A
                    copt+=step;
                    dibuja=true;
                    break;
                case 122:    //Z
                    copt-=step;
                    dibuja=true;
                    break;

        //Amp Ruido
                case 109:   //M
                    rAmp+=step;
                    dibuja=true;
                    break;
                case 110:    //N
                    rAmp-=step;
                    dibuja=true;
                    break;
        //Camara Offset
                case 46: //.
                    camara.offset+=0.05;
                    dibuja=true;
                    break;
                case 44: //,
                    camara.offset-=0.05;
                    dibuja=true;
                    break;

                case 115:

                    cout<<endl<<"Ingrese el nombre del archivo"<<endl;
                    cin>>filename;
                    interf.valores.convertTo(imgw,CV_16UC3,65535);

                    if(imwrite(filename,imgw)){
                        cout <<"Guardado satisfactorio"<<endl;
                    } else {
                        cout <<"Ha ocurrido un error al guardar"<<endl;
                    }
                    break;
                case 32: //espacio
                    corre=true;
                    cout<<endl<<"Ingrese el nombre del archivo de texto"<<endl;
                    cin>>filename;
                    break;

                case 10: //ENTER
                    video=!video;
                    break;
                default:
                    break;
            }
            if ((char)c==27 || (char)c==113){
                break;
            }

        }
        if (corre){
            if (v<veces){

                alpha=p*dp+pi;
                fase=(alpha*M_PI/180)*(lamda/2)/(M_PI*2);
                copt=(imagen-2)*fase;
                toma=true;
                dibuja=true;
                sprintf(filename2,"%s%.2f-%d-%d.txt",filename.c_str(),alpha,v,0);
            } else {
                p++;
                v=0;
            }
            if (p>=pasos){
                corre=false;
            }






        }

        if (dibuja || video){
            dibuja=false;



            while (1){
                r=ruido.getUnif(rAmp);
                if (t<exposureTime){
                    //r=ruido.getRuido(tiempo);//,rAmp,rFreq);

                    interf.integra(r,(t-ta)/tstep);
                    ta=t;
                    tiempo+=tstep;
                    t+=tstep;
                } else if(t>=exposureTime) {
                    //r=ruido.getRuido(tiempo-(t-exposureTime));//,rAmp,rFreq);
                    interf.integra(r,(exposureTime-ta)/tstep);
                    interf.getInterferograma(copt);
                    imshow( "simulador", interf.valores);

                    if (t>=(exposureTime+notExposureTime)){
                        tiempo=tiempo;
                        t=t-(exposureTime+notExposureTime);
                        ta=0;

                    } else {
                        float tnof=notExposureTime-(t-exposureTime);
                        int skipsteps=1+(int)(tnof/tstep);
                        tiempo+=tstep*skipsteps;
                        t=tstep*skipsteps-tnof;
                        ta=0;
                    }

                    j++;


                    if (toma){
                        if (imagen>=5){
                            num=im[4]-im[0];
                            den=2*(im[3]-im[1]);
                            cosa=num/den;
                            imagen=0;
                            FILE * pFile;
                            pFile = fopen (filename2,"w");
                            if (pFile!=NULL) {
                                float val[3];
                                for (int w=0;w<num.cols;w++){
                                    for (int h=0;h<num.rows;h++){
                                        val[0]=get2D32F(num,w,h,1);
                                        val[1]=get2D32F(den,w,h,1);
                                        val[2]=get2D32F(cosa,w,h,1);
                                        fprintf(pFile,"%.3f\t%.3f\t%.3f\n",val[0],val[1],val[2]);
                                    }
                                }
                                fclose (pFile);

                            } else {
                                cout << "Unable to open file";
                            }
                            v++;

                        } else {
                            interf.valores.copyTo(im[imagen]);
                            //interf.valores.convertTo(im[imagen],CV_8UC3,255);
                            imagen++;
                        }
                        toma=false;
                    }
                    break;

                }


            }
            cout<<"j = "<< j <<endl;
           // interf.getInterferograma(copt);
           // imshow( "simulador", interf.valores);
            cout<<endl<<"Listo"<<endl;
            cout<<"Gain: "<<camara.gain<<endl;
            cout<<"Offset: "<<camara.offset<<endl;
            cout<<"Incl X: "<<interf.inclinacionX<<endl;
            cout<<"Incl Y: "<<interf.inclinacionY<<endl;
            cout<<"Res Depth: "<<muestra.resDepth<<endl;
            cout<<"Camino Óptico: "<<copt<<endl;
            cout<<"Amplitud Ruido: "<<r<<endl;
            cout<<endl;
        }

    }