Sunday, April 18, 2010

Efecto fotocopia en tiempo real

He estado jugando un poco con la librería de visión artificial de Intel, OpenCV. Programé el mismo efecto fotocopia que postie tiempo atrás, pero esta vez aplicandolo al video capturado por la webcam en tiempo real.
Esto no es difícil de lograr, sin embargo es interesante ver los resultados.

Aca el código:


#include <opencv/highgui.h>
#include <opencv/cv.h>

void fotocopia(IplImage *img, int difMax) {
int i,j,difh,difw,indice;
for( i=0 ; i < (img->width-1) ; i++) {
for( j=0 ; j < (img->height-1) ; j++) {
indice = j*img->widthStep + i*img->nChannels;
/*diferencia brillo en pixeles de una misma columna
widthStep es el tamaño de una fila en bytes,
ya que la imagen esta en un arreglo unidimensional.
Al sumar widthStep estamos pasando a la siguiente fila
*/
difh = ( (uchar*)(img->imageData) )[indice] - ( (uchar*)(img->imageData) )[indice+img->widthStep];
if( difh < 0) {
difh = difh * -1;
}

//diferencia brillo en pixeles de una misma fila

difw = ( (uchar*)(img->imageData) )[indice] - ( (uchar*)(img->imageData) )[indice+1];
if( difw < 0) {
difw = difw * -1;
}

//si hay mucha diferencia, es un contorno, hay que pintar el pixel negro
if ( (difh + difw) > difMax) {
( (uchar*)(img->imageData) )[indice] = 0 ;
} else {
( (uchar*)(img->imageData) )[indice] = 255 ;
}
}
}
}

int main() {
CvCapture *cap = cvCreateCameraCapture(0);
IplImage *img;
IplImage *imgGray;
cvNamedWindow("hahaha",CV_WINDOW_AUTOSIZE);
img = cvQueryFrame(cap);
imgGray = cvCreateImage( cvSize(img->width,img->height), IPL_DEPTH_8U, 1 );
while(1) {
img = cvQueryFrame(cap);
cvCvtColor(img, imgGray, CV_RGB2GRAY);
fotocopia(imgGray,5);
cvShowImage("hahaha",imgGray);
char key = cvWaitKey(40);
if(key == 27)
break;
}
cvReleaseCapture(&cap);
cvReleaseImage(&img);
cvReleaseImage(&imgGray);
cvDestroyWindow("hahaha");
}

Para compilar:

gcc `pkg-config --cflags opencv --libs opencv` fotocopia.c -o fotocopia

Aca un video de cómo se queda el efecto:

3 comments:

Jorgicio said...

Me tira un error al compilar viteh xD

[0:35][jorgicio@nyappy][~/MisCodigos/C/fotocopia]% make
make fotocopia
make[1]: se ingresa al directorio `/home/jorgicio/MisCodigos/C/fotocopia'
gcc `pkg-config --cflags opencv` `pkg-config --libs opencv`fotocopia.c -o fotocopia
fotocopia.c: En la función ‘main’:
fotocopia.c:58: error: ‘\342’ parásito en el programa
fotocopia.c:58: error: ‘\210’ parásito en el programa
fotocopia.c:58: error: ‘\251’ parásito en el programa
fotocopia.c:58: error: faltan argumentos para la función ‘cvReleaseCapture’
fotocopia.c:60: error: ‘gray’ no se declaró aquí (primer uso en esta función)
fotocopia.c:60: error: (Cada identificador no declarado solamente se reporta una vez
fotocopia.c:60: error: para cada funcion en la que aparece.)
make[1]: *** [fotocopia] Error 1
make[1]: se sale del directorio `/home/jorgicio/MisCodigos/C/fotocopia'
make: *** [all] Error 2

Juan Reyes said...

Gracias por avisarme! cometí algunos errores al escribir el código en el blog. Ahora sí compila.
Saludos

Anonymous said...

##pinguinux@freenode ;)

Post a Comment