Beispiel #1
0
/**
 * 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);
}
Beispiel #2
0
/**
 * 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);

}