/** * Vectoriza todos los trazos de una imagen binaria. Los trazos deben estar completamente adelgazados * @param imgBase Imagen binaria CV_8U * @param filename Nombre del archivo de salida (sin extensión) * @param deltaRDP Delta de reducción de puntos Ramen-Douglas-Peucker, entre más grande más agresivo, en 0 no se hace reducción de puntos (valores ejemplo: 0.5, 1, 2...) * @param suavizado Nivel de suavizado con interpolación spline Catmull-Rom, en 0 no se suavizan los trazos (valores ejemplo: 0, 1, 2, 4...) */ void vect::execVectorize(Mat &imgBase, const char *filename, float deltaRDP, short int suavizado) { SHPHandle sh = SHPCreate(filename, SHPT_ARC); int imgAncho = imgBase.cols; int imgAlto = imgBase.rows; // recorremos toda la imagen buscando puntos finales vector<Point> punFinales; vect::puntosFinales(imgBase, punFinales); // para cada punto final, recorremos el trazo correspondiente y guardamos el vector Point pun; vector<Point2f> trazo; vector<Point2f> trazoSuave; for(vector<Point>::iterator it = punFinales.begin(); it != punFinales.end(); ++it) { pun = *it; recorrerTrazo(imgBase, pun, trazo, false); if (trazo.size() > 1) { vec_RDP::reducirPuntos(trazo, deltaRDP); // aplicamos reducción de puntos Ramer-Douglas-Peucker catmull::interpolar(trazo, trazoSuave, suavizado); agregarShape(((suavizado > 0) ? trazoSuave : trazo), imgAlto, sh); } } // Buscamos en toda la imagen, si aún hay pixeles sin borrar, son de trayectos cerrados unsigned int x, y; uchar* fila; uchar intensidad; for (y = 1 ; y < (imgAlto - 1) ; ++y) { fila = imgBase.ptr<uchar>(y); for (x = 1 ; x < (imgAncho - 1) ; ++x) { intensidad = fila[x]; if (intensidad == 0) { pun = Point(x, y); recorrerTrazo(imgBase, pun, trazo, true); if (trazo.size() > 1) { vec_RDP::reducirPuntos(trazo, deltaRDP); // aplicamos reducción de puntos Ramer-Douglas-Peucker catmull::interpolar(trazo, trazoSuave, suavizado); agregarShape(((suavizado > 0) ? trazoSuave : trazo), imgAlto, sh); } } } } SHPClose(sh); }
/** * Vectoriza todos los trazos de una imagen binaria. Los trazos deben estar completamente adelgazados * @param imgBase Imagen binaria CV_8U * @param filename Nombre del archivo de salida (sin extensión) * @param deltaRDP Delta de reducción de puntos Ramen-Douglas-Peucker, entre más grande más agresivo, en 0 no se hace reducción de puntos (valores ejemplo: 0.5, 1, 2...) * @param suavizado Nivel de suavizado con interpolación spline Catmull-Rom, en 0 no se suavizan los trazos (valores ejemplo: 0, 1, 2, 4...) */ void vect::execVectorize(Mat &imgBase, const char *filename, float deltaRDP, short int suavizado, InfoMapa *iMapa) { SHPHandle sh = SHPCreate(filename, SHPT_ARC); DBFHandle dbf = DBFCreate(filename); int res = DBFAddField(dbf,"T_ALT", FTDouble, 12, 4); DBFClose(dbf); DBFHandle hDBF = DBFOpen(filename,"rb+"); cout<<res<<",,,,,,,,,,,,,,,,,,,,,,,"<<endl; int imgAncho = imgBase.cols; int imgAlto = imgBase.rows; Point pA = Point(iMapa->recXmin,iMapa->recYmin); cout<<"XMIN"<<iMapa->recXmin<<endl; cout<<"YMIN"<<iMapa->recYmin<<endl; /* Point pA = Point(492, 372); iMapa->setCoordsPuntosRef(1060000, 770000, 1075000, 770000, 1075000, 760000, 1060000, 760000); iMapa->setPosPuntosRef(522, 371,9957, 475, 9882, 6799, 453, 6701); */ transformGeo *objGeo = new transformGeo(); objGeo->setCoeficients(iMapa); // recorremos toda la imagen buscando puntos finales int altop = 0; vector<Point> punFinales; vect::puntosFinales(imgBase, punFinales); // para cada punto final, recorremos el trazo correspondiente y guardamos el vector Point pun; vector<Point2f> trazo; vector<Point2f> trazoSuave; for(vector<Point>::iterator it = punFinales.begin(); it != punFinales.end(); ++it) { pun = *it; cout << "recorrerTrazo() " << pun << endl; recorrerTrazo(imgBase, pun, trazo, false); if (trazo.size() > 1) { vec_RDP::reducirPuntos(trazo, deltaRDP); // aplicamos reducción de puntos Ramer-Douglas-Peucker catmull::interpolar(trazo, trazoSuave, suavizado); agregarShape(((suavizado > 0) ? trazoSuave : trazo), altop, sh, objGeo, pA, hDBF); } } // Buscamos en toda la imagen, si aún hay pixeles sin borrar, son de trayectos cerrados unsigned int x, y; uchar* fila; uchar intensidad; for (y = 1 ; y < (imgAlto - 1) ; ++y) { fila = imgBase.ptr<uchar>(y); for (x = 1 ; x < (imgAncho - 1) ; ++x) { intensidad = fila[x]; if (intensidad == 0) { pun = Point(x, y); recorrerTrazo(imgBase, pun, trazo, true); if (trazo.size() > 1) { vec_RDP::reducirPuntos(trazo, deltaRDP); // aplicamos reducción de puntos Ramer-Douglas-Peucker catmull::interpolar(trazo, trazoSuave, suavizado); agregarShape(((suavizado > 0) ? trazoSuave : trazo), imgAlto, sh, objGeo, pA, hDBF); } } } } DBFClose(hDBF); SHPClose(sh); }