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(); }
/** * @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 ); }