puntero como parametro de una funcion y alloc
Publicado por Betty (5 intervenciones) el 04/03/2006 12:24:29
Hola a todos! Llevo muchos dias dándole vueltas a este problema y no le veo la manera. Evidentemente es debido a mi falta de experiencia, a ver si alguien puede ayudarme.
La situación es la siguiente. Tengo una imagen en blanco y negro (no en escala de grises, los únicos colores que hay son el blanco y el negro) e intento hacer una función que me devuelva las coordenadas de los pixeles blancos. Para ello me defino un puntero a un tipo "punto", donde quiero que esté la solución, y llamo a la función metiendo la imagen y el puntero mencionado. Lo voy a poner en código, supongo que así se verá mas claro:
CvPoint *arrayPuntosT;
totalpuntos2=image2points8b(imgSrc,arrayPuntosT);
Y la función image2points básicamente lo que hace es definir una estructura que puede crecer dinámicamente e ir añadiendole las coordenadas de los puntos blancos para después copiarla al puntoero-array original. Es la siguiente:
int image2points8b(IplImage *imagen,CvPoint *array)
{
CvPoint punto;
CvMemStorage* almacen = cvCreateMemStorage(0);
CvSeq* secuenciaPuntos = cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),almacen);
int numpuntos=0;
for (int j=0;j<ysize;j++)
{
for (int i=0;i<xsize;i++)
{
if (imagen->imageData[(j*xsize)+(i)])
{
punto.x=i+1;
punto.y=j+1;
cvSeqPush(secuenciaPuntos,&punto);
numpuntos++;
}
}
}
//Reservar memoria para un array de CvPoint:
array = (CvPoint *)malloc(numpuntos * sizeof(CvPoint));
//Copiamos los puntos al array:
cvCvtSeqToArray(secuenciaPuntos, array,CV_WHOLE_SEQ);
cvReleaseMemStorage( &almacen );
return numpuntos;
}
He comprobado que la función funciona, lo único que pasa es que fuera no puedo leer el array que me he creado dentro, pero si hago la reserva de memoria fuera, entonces todo va bien. Osea, que el problema es que no puedo pasar un puntero al que no le he reservado la memoria. Sin embargo, no puedo hacer la reserva de memoria fuera pq no se a priori cuantos puntos blancos tendré en la imagen.
Hay alguna forma de solucionar esto?? De qué manera puedo pasarle el puntero a la función sin haber reservado memoria?? Estoy desesperada. Gracias por leerme.
La situación es la siguiente. Tengo una imagen en blanco y negro (no en escala de grises, los únicos colores que hay son el blanco y el negro) e intento hacer una función que me devuelva las coordenadas de los pixeles blancos. Para ello me defino un puntero a un tipo "punto", donde quiero que esté la solución, y llamo a la función metiendo la imagen y el puntero mencionado. Lo voy a poner en código, supongo que así se verá mas claro:
CvPoint *arrayPuntosT;
totalpuntos2=image2points8b(imgSrc,arrayPuntosT);
Y la función image2points básicamente lo que hace es definir una estructura que puede crecer dinámicamente e ir añadiendole las coordenadas de los puntos blancos para después copiarla al puntoero-array original. Es la siguiente:
int image2points8b(IplImage *imagen,CvPoint *array)
{
CvPoint punto;
CvMemStorage* almacen = cvCreateMemStorage(0);
CvSeq* secuenciaPuntos = cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),almacen);
int numpuntos=0;
for (int j=0;j<ysize;j++)
{
for (int i=0;i<xsize;i++)
{
if (imagen->imageData[(j*xsize)+(i)])
{
punto.x=i+1;
punto.y=j+1;
cvSeqPush(secuenciaPuntos,&punto);
numpuntos++;
}
}
}
//Reservar memoria para un array de CvPoint:
array = (CvPoint *)malloc(numpuntos * sizeof(CvPoint));
//Copiamos los puntos al array:
cvCvtSeqToArray(secuenciaPuntos, array,CV_WHOLE_SEQ);
cvReleaseMemStorage( &almacen );
return numpuntos;
}
He comprobado que la función funciona, lo único que pasa es que fuera no puedo leer el array que me he creado dentro, pero si hago la reserva de memoria fuera, entonces todo va bien. Osea, que el problema es que no puedo pasar un puntero al que no le he reservado la memoria. Sin embargo, no puedo hacer la reserva de memoria fuera pq no se a priori cuantos puntos blancos tendré en la imagen.
Hay alguna forma de solucionar esto?? De qué manera puedo pasarle el puntero a la función sin haber reservado memoria?? Estoy desesperada. Gracias por leerme.
Valora esta pregunta


0