martes, 28 de abril de 2009

ESCALA DE GRISES

El siguiente paso para desarrollar el proyecto es averiguar si existe movimiento en las imágenes que recibimos o no. El primer paso que vamos a dar es convertir, las imágenes dadas en escala de grises. Para conseguir la hacer esto lo hemos realizado de dos maneras:

He accedido a las características de la imagen. Las imágenes tienen unas características, por ejemplo, dado un tipo de datos iplImage (img) las características de la altura y al anchura vienen definidas como img->width y como img->height.

He recorrido pixel a pixel la imagen con dos bucles anidados, he ido cambiando el color que muestra este por el gris. Para conseguir el gris he hallado la media de los 3 canales.

void RGB2GRAY(IplImage *img){
int i,j;
double media;
//printf("%d\n",img->height);
//printf("%d\n",img->width);
for(i=0;iheight;i++){
for(j=0;jwidth; j++ ){
CvScalar s;
s=cvGet2D(img,i,j); // obtenemos el valor en el píxel (i,j)
//printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]);
media=(s.val[0]+s.val[1]+s.val[2])/3;
s.val[0]=media;
s.val[1]=media;
s.val[2]=media;
cvSet2D(img,i,j,s);
}
}
};

Otra manera para resolver esto es con la función predefinida por opencv cvcvtcolor.
Uso de la conversión OpenCV:

cvCvtColor(cimg,gimg,CV_BGR2GRAY);
El uso de un directo de la conversión:
for(i=0;iheight;i++) for(j=0;jwidth;j++)
gimgA[i][j]= (uchar) (cimgA [i] [j]. b * 0,114 +
cimgA[i][j].g*0.587 + cimgA[i][j].r*0.299);
Convertir entre espacios de color:
cvCvtColor(src,dst,code); / / src -> dst
code = CV_2
/ = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS
por ejemplo: CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab

int main (int argc, char **argv){
CvCapture* capture = 0;
IplImage* img = 0;
IplImage* gray;
int num=0;

cvNamedWindow( "Video", 1 );
cvNamedWindow ("Gris",1);

printf("Capture from camera\n");
capture = cvCaptureFromCAM(0);
if(!capture){
printf( "Can't initialize video capturing\n\n" );
return -1;
}
img=cvQueryFrame( capture );
gray = cvCreateImage(cvSize(img->width, img->height),IPL_DEPTH_8U,1);
for(;;){
img=cvQueryFrame( capture );
if (!img)
break;

cvShowImage( "Video", img );
//RGB2GRAY(img);
cvCvtColor(img, gray, CV_BGR2GRAY);
cvShowImage ("Gris",gray);
cvWaitKey(1);
num++;
if (num==100){
cvReleaseCapture(&capture);
return 0;
}
}
cvDestroyAllWindows();
return 0;
}

2 comentarios:

  1. Bueno, esto ya va viento en popa, ahora no lo dejes parado y a continuar...

    Siguiente paso, poder etiquetar las zonas de aparcamiento, las zonas de paso, las zonas prohibidas de paso/aparcamiento (aceras, cesped,...). Estimar los coches/peatones por tamaño, color, forma,...

    Se pueden hacer muchas cosas!!

    ResponderEliminar
  2. acabo de probarlo y me gira la figura (boca abajo)
    no entiendo...

    ResponderEliminar