lunes, 24 de enero de 2011

Trabajo sobre Pixeles

Muy buenas, hace unos días una lectora me ha preguntado como trabajo con pixeles, como aplico la transformada de hough, y estas cosas, pues para esto he decidido crear un nuevo post, en el que explico todo esto.
Cuando aplico la transformada de hough, yo realmente no trabajo sobre pixeles directamente, si no que lo hace OpenCV por mi.  La función que aplico es esta, 
CvSeq* cvHoughCircles(
CvArr* image,    //Imagen en escala de grises
void* circle_storage, //Almacenamiento
int method,   //método
double dp,  //Resolución del acumulador
double min_dist, //Minima distancia entre circulos
double param1 = 100,  //Umbral del algoritmo de Cany
double param2 = 300,  //Acumulador del umbral del algoritmo de canny
int min_radius = 0,  //Minimo radio de un circulo
int max_radius = 0  //Máximo radio de un circulo
);
Esta función me devuelve una secuencia, que son los círculos que tengo en la imagen, para esto introducimos una imagen en blanco y negro (image), a esta imagen el propio algoritmo de la función aplica un detector de bordes y posteriormente la ecuación de la circunferencia par detectar los círculos, los cuales los guarda en el cirgle_storage y yo los capturo con    float* p = (float*) cvGetSeqElem( results, i ); a la cual le paso el CvSeq que me ha devuelta la función cvHoughCircles. Es lo bueno que tiene OpenCV que el trabajo arduo con pixeles viene resuelto.
Bien pero si quiero trabajar directamente con pixeles tenemos que conocer como guarda openCV una imagen, este la guarda como si fuera un vector y para capturar cada pixel necesitamos una serie de datos que estan en la imagen.
Entonces en la imagen tenemos el ancho, el alto, el paso y los canales, esta información la necesitaremos y los propios datos.  Par explicarlo pongo un ejemplo:
IplImage* frame;
height= frame->height;
width= frame->width;
step= frame->widthStep/sizeof(uchar);
channels   = frame->nChannels;
data = (uchar *)frame->imageData;
for(i = 0; i <height; i++ ) {
          for(j = 0; j <width; j++ ) {
                        data_hsv[i*step+j*channels+1]
                        data_hsv[i*step+j*channels+2]
                        data_hsv[i*step+j*channels+3]

}
}
donde 1 2 y 3 es el RGB de color.

     
 

No hay comentarios:

Publicar un comentario