Esempio n. 1
0
string OCR::run(Placa *input){

	//Segment chars of plate
	vector<SegmentoLetra> segmentos = segmento(*input);
	cout << "Numero de letras: "<<segmentos.size() << endl;
	for (int i = 0; i<segmentos.size(); i++){
		//Preprocess each char for all images have same sizes
		Mat ch = preprocesamientoCaracter(segmentos[i].imagen);
		if (saveSegments){
			stringstream ss(stringstream::in | stringstream::out);
			ss << "tmpChars/" << nombreArchivo << "_" << i << ".jpg";
			imwrite(ss.str(), ch);
		}
		//For each segment Extract Features
		Mat f = caracteristicas(ch, 15);
		//For each segment feature Classify
		int character = clasificacion(f);
		input->letras.push_back(Caracteres[character]);
		input->posLetras.push_back(segmentos[i].posicion);
	}
	return "-";//input->str();
}
Esempio n. 2
0
/**
 * @brief DialogoCaracteristicas::getNumber
 * @param srcImage
 * @return
 */
int MainWindow::getNumber(){
    srcImage = imread(imageFile.toStdString().data(),0);
    line(srcImage,Point(0,0),Point(0,srcImage.rows),Scalar(255),20);
    line(srcImage,Point(0,0),Point(srcImage.cols,0),Scalar(255),20);
    line(srcImage,Point(srcImage.cols,srcImage.rows),Point(srcImage.cols,0),Scalar(255),20);
    line(srcImage,Point(srcImage.cols,srcImage.rows),Point(0,srcImage.rows),Scalar(255),20);

    equalizeHist(srcImage,srcImageEqualizada);
    //CALCULAR THRESHOLD
    this->dstImageThresholdAdaptative = ControlPreprocesamiento::umbralAutomaticoAdaptativo(srcImage);
    this->dstImageThreshold = ControlPreprocesamiento::umbralAutomatico(srcImageEqualizada);

    //FILTRADO
    Mat BStructElement = getStructuringElement(CV_SHAPE_RECT,Size(2,2));
    morphologyEx(this->dstImageThresholdAdaptative, this->dstImageClose, CV_MOP_CLOSE, BStructElement,Point(-1,-1) ,2 );

    //SEGMENTACION
    Mat src = imread(imageFile.toStdString().data());
    ControlSegmentacion::encontrarSegmentos(src,dstImageClose,dstImageSegmentacion,dstRectanguloEnvolvente);

    //ADELGAZAMIENTOsrcImage
    dstImageAdelgazada = Mat::zeros(dstImageClose.size(), CV_8UC1);
    dstImageClose.copyTo(dstImageAdelgazada);

    ControlPreprocesamiento::adelgazamiento(dstImageAdelgazada);

    dstImageAdelgazada.copyTo(dstImageRectanguloEnvolvente);
    //Se suman 5 pixeles de distancia a las medidas del rectangulo para darle espacio
    //alalgoritmo de busqueda de end-points
    //if(dstRectanguloEnvolvente.x <= 5 || dstRectanguloEnvolvente.y <= 5 ) continue;
    dstRectanguloEnvolvente.height += 10;
    dstRectanguloEnvolvente.width += 10;
    dstRectanguloEnvolvente.x -= 5;
    dstRectanguloEnvolvente.y -= 5;

    rectangle(dstImageRectanguloEnvolvente,dstRectanguloEnvolvente,Scalar(255));

    //CALCULO CARACTERISTICAS
    cout<<"ancho "<<dstRectanguloEnvolvente.width<<endl;
    cout<<"alto "<<dstRectanguloEnvolvente.height<<endl;
    cout<<"x "<<dstRectanguloEnvolvente.x<<endl;
    cout<<"y "<<dstRectanguloEnvolvente.y<<endl;
    cout<<dstImageAdelgazada.rows<<endl;

    dstImageFinal = dstImageAdelgazada(dstRectanguloEnvolvente).clone();
    double relacionAnchoAlto = (double)dstImageFinal.cols/dstImageFinal.rows;

    vector<Point> endPoints;
    vector<Point> insersectPoints;
    ControlObtencionCaracteristicas::buscarPuntos(dstImageFinal,endPoints, insersectPoints);
    cout<<endPoints.size()<<endl;

    Mat dstImageMorph = ControlPreprocesamiento::morphImage(dstImageThreshold);
    vector<vector<Point> > contornos;

    contornos = ControlObtencionCaracteristicas::getContornos(dstImageMorph);
    vector<vector<double> > momentosHu = ControlObtencionCaracteristicas::getHuMoments(contornos);

// POLIGONO ENVOLVENTE
   vector<Point > poligono = ControlObtencionCaracteristicas::getEnvolvingPolygon( contornos);
   Mat poligonoimagen = ControlObtencionCaracteristicas::getEnvolvingPolygonImage(srcImage, poligono);
   vector<vector<Point > > contornoPoligono = ControlObtencionCaracteristicas::getContornos(poligonoimagen);
       momentosHu = ControlObtencionCaracteristicas::getHuMoments(contornoPoligono);

 /*   cout<<momentosHu.at(0).at(0)<<","
        <<momentosHu.at(0).at(1)<<","
        <<momentosHu.at(0).at(2)<<","
        <<momentosHu.at(0).at(3)<<","
        <<momentosHu.at(0).at(4)<<","
        <<momentosHu.at(0).at(5)<<","
        <<momentosHu.at(0).at(6)<2<","
        <<endl;*/
    ///Determina a cual cuadrante pertenece cada punto
       int cuadEndPoints0 = 0,cuadEndPoints1 = 0, cuadEndPoints2 = 0, cuadEndPoints3 = 0,
               cuadEndPoints4 = 0, cuadEndPoints5 = 0, cuadEndPoints6 = 0, cuadEndPoints7 = 0, cuadEndPoints8 = 0;
       int mitadX1 = int(dstImageFinal.cols/3);
       int mitadX2 = int(2*dstImageFinal.cols/3);
       int mitadY1 = int(dstImageFinal.rows/3);
       int mitadY2 = int(2*dstImageFinal.rows/3);
       Point p;

       //Calcular cuantos endPoints hay en cada cuadrante
       for(unsigned c = 0; c< endPoints.size();c++){
           p = endPoints.at(c);
           //0
           if( p.x <  mitadX1 && p.y <  mitadY1 ){ cuadEndPoints0++; continue;}
           //1
           if( p.x <  mitadX2 && p.y <  mitadY1 ){ cuadEndPoints1++; continue;}
           //2
           if( p.x >= mitadX2 && p.y <  mitadY1 ){ cuadEndPoints2++; continue;}
           //3
           if( p.x <  mitadX1 && p.y <  mitadY2 ){ cuadEndPoints3++; continue;}
           //4
           if( p.x <  mitadX2 && p.y <  mitadY2 ){ cuadEndPoints4++; continue;}
           //5
           if( p.x >= mitadX2 && p.y <  mitadY2 ){ cuadEndPoints5++; continue;}
           //6
           if( p.x <  mitadX1 && p.y >= mitadY2 ){ cuadEndPoints6++; continue;}
           //7
           if( p.x <  mitadX2 && p.y >= mitadY2 ){ cuadEndPoints7++; continue;}
           //8
           if( p.x >= mitadX2 && p.y >= mitadY2 ){ cuadEndPoints8++; continue;}
       }

       int cuadInterPoints0 = 0,cuadInterPoints1 = 0, cuadInterPoints2 = 0, cuadInterPoints3 = 0,
               cuadInterPoints4 = 0, cuadInterPoints5 = 0, cuadInterPoints6 = 0, cuadInterPoints7 = 0, cuadInterPoints8 = 0;


       for(unsigned z = 0; z< insersectPoints.size();z++)
       {
           p = insersectPoints.at(z);
           //0
           if( p.x <  mitadX1 && p.y <  mitadY1 ){ cuadInterPoints0=1; continue;}
           //1
           if( p.x <  mitadX2 && p.y <  mitadY1 ){ cuadInterPoints1=1; continue;}
           //2
           if( p.x >= mitadX2 && p.y <  mitadY1 ){ cuadInterPoints2=1; continue;}
           //3
           if( p.x <  mitadX1 && p.y <  mitadY2 ){ cuadInterPoints3=1; continue;}
           //4
           if( p.x <  mitadX2 && p.y <  mitadY2 ){ cuadInterPoints4=1; continue;}
           //5
           if( p.x >= mitadX2 && p.y <  mitadY2 ){ cuadInterPoints5=1; continue;}
           //6
           if( p.x <  mitadX1 && p.y >= mitadY2 ){ cuadInterPoints6=1; continue;}
           //7
           if( p.x <  mitadX2 && p.y >= mitadY2 ){ cuadInterPoints7=1; continue;}
           //8
           if( p.x >= mitadX2 && p.y >= mitadY2 ){ cuadInterPoints8=1; continue;}
       }


       ///CREAR RED NEURONAL Y ENVIAR VECTOR DE CARACTERISTICAS
       controlredneuronal red = controlredneuronal("./NeuralNetwork.xml");
       cv::Mat caracteristicas(1,20,CV_32F);


       caracteristicas.at<float>(0, 0) = momentosHu.at(0).at(0);
       caracteristicas.at<float>(0, 1) = momentosHu.at(0).at(1);
       caracteristicas.at<float>(0, 2) = momentosHu.at(0).at(2);
       caracteristicas.at<float>(0, 3) = momentosHu.at(0).at(3);
       caracteristicas.at<float>(0, 4) = momentosHu.at(0).at(4);
       caracteristicas.at<float>(0, 5) = momentosHu.at(0).at(5);
       caracteristicas.at<float>(0, 6) = momentosHu.at(0).at(6);
       caracteristicas.at<float>(0, 7) = relacionAnchoAlto;
       caracteristicas.at<float>(0, 8) = endPoints.size();
       caracteristicas.at<float>(0, 9) = cuadEndPoints0;
       caracteristicas.at<float>(0, 10) = cuadEndPoints1;
       caracteristicas.at<float>(0, 11) = cuadEndPoints2;
       caracteristicas.at<float>(0, 12) = cuadEndPoints3;
       caracteristicas.at<float>(0, 13) = cuadEndPoints4;
       caracteristicas.at<float>(0, 14) = cuadEndPoints5;
       caracteristicas.at<float>(0, 15) = cuadEndPoints6;
       caracteristicas.at<float>(0, 16) = cuadEndPoints7;
       caracteristicas.at<float>(0, 17) = cuadEndPoints8;
       caracteristicas.at<float>(0, 18) = contornos.size();
       caracteristicas.at<float>(0, 19) = poligono.size();

       return red.predict( caracteristicas );
}