/* Codigo de ejemplo para utilizar la API Video for Linux * usando la funcion read() sobre una webcam. * * Programado por M@Ur1x para la asignatura ELO330 */ #include #include #include #include #include #include #include #include #include #define ANCHO 320 #define ALTO 240 #define VIDEO_SRC "/dev/video0" int main(int argc, char ** argv){ int camara = open(VIDEO_SRC, O_RDONLY); unsigned char *buffer, *src; int bpp = 24, r, g, b; unsigned int i; struct video_capability cap; struct video_window win; struct video_picture vpic; FILE * foto; foto = fopen ("webcam-foto.ppm" , "w+"); /* CAPACIDADES DE LA CAMARA */ ioctl(camara, VIDIOCGCAP, &cap); printf("\n Informacion de la estructura video_capability\n"); printf(" Nombre camara: %s\n", cap.name); printf(" Tipo: %d\n", cap.type); printf(" Canales: %d\n", cap.channels); printf(" Audio: %d\n", cap.audios ); printf(" Ancho Maximo: %d\n", cap.maxwidth ); printf(" Alto Maximo: %d\n", cap.maxheight); printf(" Ancho Minimo: %d\n", cap.minwidth ); printf(" Alto Minimo: %d\n\n", cap.minheight ); /* VENTANA DE CAPTURA */ win.x = 0; win.y = 0; win.width = ANCHO; win.height = ALTO; win.clipcount = 0; win.chromakey = 0; ioctl(camara, VIDIOCSWIN,&win); ioctl(camara, VIDIOCGWIN, &win); printf(" Algunos campos de la estructura video_window\n"); printf(" Posicion X: %d\n", win.x); printf(" Posicion Y: %d\n", win.y); printf(" Ancho ventana: %d\n", win.width); printf(" Alto ventana: %d\n", win.height); printf(" Chorma Key: %d\n\n", win.chromakey); /* FORMATO IMAGEN A CAPTURAR */ vpic.depth=24; vpic.palette=VIDEO_PALETTE_RGB24; ioctl(camara, VIDIOCSPICT, &vpic); ioctl(camara, VIDIOCGPICT, &vpic); printf(" Datos que aparecen en video_picture\n"); printf(" Brightness: %d \n", vpic.brightness >> 8 ); printf(" Hue: %d\n", vpic.hue >>8 ); printf(" Colour: %d\n", vpic.colour >> 8 ); printf(" Contrast: %d \n", vpic.contrast >> 8 ); printf(" Whiteness: %d\n", vpic.whiteness >> 8 ); printf(" Depth: %d\n", vpic.depth ); printf(" Palette: %d \n\n", vpic.palette ); /* CAPTURANDO IMAGEN */ buffer = malloc(win.width * win.height * bpp); read(camara, buffer, win.width * win.height * bpp); fprintf(foto, "P6\n%d %d 255\n", win.width, win.height); src = buffer; for (i = 0; i < win.width * win.height; i++) { (r) = src[0] << 8; (g) = src[1] << 8; (b) = src[2] << 8; src += 3; fputc(r>>8, foto); fputc(g>>8, foto); fputc(b>>8, foto); } close(camara); fclose(foto); printf(" La imagen ya fue capturada al archivo webcam-foto.bmp\n\n"); return 0; }