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:

Thursday, April 1, 2010

tarjeta de video Intel GMA X4500HD Ubuntu

Problema:

Cuando abría alguna aplicación que hiciera uso de OpenGL esta veía con manchas negras o se pegaba y al ejecutar dmesg me aparecía lo siguiente:

[ 210.430986] [drm:i915_gem_object_pin_and_relocate] *ERROR* Relocation beyond target object bounds: obj f08cb9c0 target 23 delta 4096 size 4096.
[ 210.430992] [drm:i915_gem_execbuffer] *ERROR* Failed to pin buffers -22
[ 210.445817] [drm:i915_gem_object_pin_and_relocate] *ERROR* Relocation beyond target object bounds: obj f0a39180 target 23 delta 4096 size 4096.
[ 210.445827] [drm:i915_gem_execbuffer] *ERROR* Failed to pin buffers -22

....

Usando Ubuntu 9.10 the Karmic Koala con el paquete xserver-xorg-video-intel versión:
2:2.9.1~git-0ubuntu0tormod

Solución :

apt-get install libgl1-mesa-dri
Con lo cual se actualizaron los siguientes paquetes:
libdrm-intel1 a la versión 2.4.15~git-0ubuntu0tormod~jaunty
libgl1-mesa-dri a la versión 7.7.0~git20091114.57f40b18-0ubuntu0sarvatt~jaunty

La solución la encontré aquí.